由Django创建的HttpRequest
属性:
HttpRequest.scheme 请求的协议
HttpRequest.body 请求体
HttpRequest.path 请求路径
HttpRequest.method 请求方法
HttpRequest.encoding 请求的字符集
HttpRequest.GET 请求的GET数据
HttpRequest.POST 请求的POST数据
HttpRequest.META 请求的META属性
方法:
HttpRequest.get_host() 当前服务器的IP和端口
HttpRequest.get_port() 当前服务器的端口
HttpRequest.get_full_path() 完整的访问路径
HttpRequest.is_secure() 是否为安全的请求
HttpRequest.is_ajax() 是否为ajax请求
当一个客户端访问的请求传来时,request如何将访问数据传递给视图函数?
我们先看一个wsgi的例子, 这里我就不再抄一遍了,直接访问下廖雪峰老师的文章吧
https://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/001386832689740b04430a98f614b6da89da2157ea3efe2000
根据wsgi的例子,我们可以得知,用户访问的请求是需要被视图函数进行使用的,那么django中的这个request是怎么传递到视图函数中的呢?
没看源代码,大概猜的,应该是酱汁
在我们的主程序路径下有一个wsgi.py的文件,这个文件应该就是将标准的wsgi返回,封装成django内部使用的数据格式,然后再通过url匹配最终传递给视图函数,我们看下url传递的代码,和视图函数的代码
#主程序的url映射
url(r'^dashboard/', include("dashboard.urls")),
#dashboard程序的url映射
url(r'^hello/',index),
#视图函数
def index(request):
return HttpResponse("hello world!!")
那我们从以上三点可以看到,当匹配到dashboard访问请求的时候,会调用include通过dashboard.urls再进行匹配,当url完全匹配时,会调用视图函数,那么视图函数中要求传入一个request,即当url完全匹配的时候,django程序调用视图函数的时候会将request完整的传给视图函数,当然request不一定会被视图函数所用到,但是django是支持这个传递的。
那么我们如何看这些值呢?
人狠话不多,看代码
def index(request):
print('scheme',request.scheme)
print('body',request.body)
print('path',request.path)
print('method',request.method)
print('encoding',request.encoding)
print('GET',request.GET)
print('POST',request.POST)
print('META',request.META)
print('get_host',request.get_host())
print('get_port',request.get_port())
print('get_full_path',request.get_full_path())
print('is_secure',request.is_secure())
print('is_ajax',request.is_ajax())
return HttpResponse("hello world!!")
访问一下之后,我们查看一下相关的返回值
scheme http
本次访问的协议是什么
body b''
本次访问客户端发送给服务端的内容是什么
path /dashboard/hello/
访问的完整路径是什么
method GET
本次的访问请求是什么
encoding None
字符类型默认为空
GET <QueryDict: {}>
本次客户端没有通过GET请求给服务器端传输数据
POST <QueryDict: {}>
本次客户端没有通过POST请求给服务器端传输数据
META {'XDG_SESSION_ID': '633194', 'HOSTNAME': 'mirror-test-ys01.ys', 'SHELL': '/bin/bash', 'TERM': 'xterm', 'HISTSIZE': '100000', 'PERL5LIB': '/root/perl5/lib/perl5:', 'QTDIR': '/usr/lib64/qt-3.3', 'OLDPWD': '/data', 'QTINC': '/usr/lib64/qt-3.3/include', 'PERL_MB_OPT': '--install_base /root/perl5', 'QT_GRAPHICSSYSTEM_CHECKED': '1', 'HISTFILESIZE': '100000', 'USER': 'root', 'LS_COLORS': 'rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;36:', 'COBBLER_SERVER': '192.168.122.2', 'VIRTUAL_ENV': '/data/python36env', 'MAIL': '/var/spool/mail/root', 'PATH': '/data/python36env/bin:/usr/share/svensudo/bin:/usr/share/svensudo/bin:/usr/lib64/qt-3.3/bin:/root/perl5/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin', 'PWD': '/data/ops', 'LANG': 'en_US.UTF-8', 'QT_GRAPHICSSYSTEM': 'native', 'KDEDIRS': '/usr', 'PS1': '(python36env) [\\u@\\h \\W]\\$ ', 'HISTCONTROL': 'ignoredups', 'SHLVL': '1', 'HOME': '/root', 'PERL_LOCAL_LIB_ROOT': ':/root/perl5', 'LOGNAME': 'root', 'QTLIB': '/usr/lib64/qt-3.3/lib', 'LESSOPEN': '||/usr/bin/lesspipe.sh %s', 'QT_PLUGIN_PATH': '/usr/lib64/kde4/plugins:/usr/lib/kde4/plugins', 'HISTTIMEFORMAT': '%F %T ', 'PERL_MM_OPT': 'INSTALL_BASE=/root/perl5', '_': '/data/python36env/bin/python', 'DJANGO_SETTINGS_MODULE': 'ops.settings', 'TZ': 'UTC', 'RUN_MAIN': 'true', 'SERVER_NAME': 'mirror-test-ys01.ys.diditaxi.com', 'GATEWAY_INTERFACE': 'CGI/1.1', 'SERVER_PORT': '8000', 'REMOTE_HOST': '', 'CONTENT_LENGTH': '', 'SCRIPT_NAME': '', 'SERVER_PROTOCOL': 'HTTP/1.1', 'SERVER_SOFTWARE': 'WSGIServer/0.2', 'REQUEST_METHOD': 'GET', 'PATH_INFO': '/dashboard/hello/', 'QUERY_STRING': '', 'REMOTE_ADDR': '172.30.254.160', 'CONTENT_TYPE': 'text/plain', 'HTTP_HOST': '10.89.0.5:8000', 'HTTP_CONNECTION': 'keep-alive', 'HTTP_UPGRADE_INSECURE_REQUESTS': '1', 'HTTP_USER_AGENT': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36', 'HTTP_ACCEPT': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8', 'HTTP_ACCEPT_ENCODING': 'gzip, deflate', 'HTTP_ACCEPT_LANGUAGE': 'zh-CN,zh;q=0.9', 'HTTP_COOKIE': 'sessionid=5qfoxcd4wfp4a471atpyhn5qbr64ow0x', 'wsgi.input': <_io.BufferedReader name=4>, 'wsgi.errors': <_io.TextIOWrapper name='<stderr>' mode='w' encoding='UTF-8'>, 'wsgi.version': (1, 0), 'wsgi.run_once': False, 'wsgi.url_scheme': 'http', 'wsgi.multithread': True, 'wsgi.multiprocess': False, 'wsgi.file_wrapper': <class 'wsgiref.util.FileWrapper'>}
get_host 10.89.0.5:8000
本服务器的IP和端口
get_port 8000
本服务的端口
get_full_path /dashboard/hello/
访问的完整路径是什么
is_secure False
这个访问看着不像是安全的
is_ajax False
这次请求不是ajax的请求
通过以上的展示,我们可以清楚的认证http协议中request请求中都包含了哪些数据信息