Django里面,我们知道可以在函数里面里面通过参数获取前端发来的数据。

比如可以通过request获取各种form的值啊,cookie啊等等。

defindex(reqeust):#获取当前已经登录的用户v=reqeust.COOKIES.get('username111')returnrender(reqeust,'index.html',{'current_user':v})


这些方法是Django把一些常用的数据已经替我们封装好了,因此可以直接使用。但是这些方法并不全,比如我刷新一个页面,这个请求的头文件里面,包含了一堆关于客户端的信息,如何获取所有的信息呢?



我们可以通过request.environ来获取


首先需要导入一个类,如果忘记了这个类的名字,可以直接print(type(request))来获取。


<class'django.core.handlers.wsgi.WSGIRequest'>


environ本质是个字典格式,因此可以直接print(k,v)获取所有的key和value,也可以通过对应的key来输出value


deftpl1(request):fromdjango.core.handlers.wsgiimportWSGIRequestprint(type(request))print(request.environ)fork,vinrequest.environ.items():print(k,v)print(request.environ['HTTP_USER_AGENT'])user_list=[1,2,3,43]returnrender(request,'tpl1.html',{'u':user_list})


输出结果:

{'ASL.LOG':'Destination=file','PYTHONIOENCODING':'UTF-8','wsgi.run_once':False,'FPS_BROWSER_APP_PROFILE_STRING':'InternetExplorer','REMOTE_ADDR':'127.0.0.1','PROCESSOR_IDENTIFIER':'Intel64Family6Model69Stepping1,GenuineIntel','TEMP':'C:\\Users\\yuan.li\\AppData\\Local\\Temp','USERPROFILE':'C:\\Users\\yuan.li','SERVER_PORT':'8000','WINDIR':'C:\\WINDOWS','SYSTEMDRIVE':'C:','FP_NO_HOST_CHECK':'NO','COMMONPROGRAMFILES(X86)':'C:\\ProgramFiles(x86)\\CommonFiles','USERDNSDOMAIN':'OMNICOM.COM.AU','HTTP_UPGRADE_INSECURE_REQUESTS':'1','PROGRAMFILES':'C:\\ProgramFiles(x86)','USERDOMAIN_ROAMINGPROFILE':'OMNICOM','wsgi.url_scheme':'http','wsgi.input':<_io.BufferedReadername=760>,'APPDATA':'C:\\Users\\yuan.li\\AppData\\Roaming','TMP':'C:\\Users\\yuan.li\\AppData\\Local\\Temp','HTTP_ACCEPT_ENCODING':'gzip,deflate,br','GATEWAY_INTERFACE':'CGI/1.1','PATH_INFO':'/tpl1/','PUBLIC':'C:\\Users\\Public','HTTP_COOKIE':'csrftoken=eIEjNdtcPYmGD2jGDfEwxb0MwePMQTuLWchxG85P7zH7wHN2BZmERsppA4PHGd6D','PROCESSOR_ARCHITEW6432':'AMD64','COMPUTERNAME':'YLI-PC','wsgi.version':(1,0),'ONEDRIVE':'C:\\Users\\yuan.li\\OneDrive','CONTENT_TYPE':'text/plain','PROGRAMW6432':'C:\\ProgramFiles','PYTHONUNBUFFERED':'1','wsgi.errors':<_io.TextIOWrappername='<stderr>'mode='w'encoding='UTF-8'>,'RUN_MAIN':'true','PSMODULEPATH':'C:\\WINDOWS\\system32\\WindowsPowerShell\\v1.0\\Modules\\;C:\\ProgramFiles(x86)\\VMware\\Infrastructure\\vSpherePowerCLI\\Modules','wsgi.file_wrapper':<class'wsgiref.util.FileWrapper'>,'HOMEPATH':'\\Users\\yuan.li','COMSPEC':'C:\\WINDOWS\\system32\\cmd.exe','USERNAME':'yuan.li','PATHEXT':'.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.PY;.PYW','SERVER_NAME':'vmware-localhost','USERDOMAIN':'OMNICOM','SCRIPT_NAME':'','PYCHARM_HOSTED':'1','QUERY_STRING':'','PROGRAMDATA':'C:\\ProgramData','NUMBER_OF_PROCESSORS':'4','FPS_BROWSER_USER_PROFILE_STRING':'Default','SERVER_PROTOCOL':'HTTP/1.1','HTTP_CONNECTION':'keep-alive','REMOTE_HOST':'','HTTP_ACCEPT_LANGUAGE':'en-GB,en-US;q=0.8,en;q=0.6','HTTP_CACHE_CONTROL':'max-age=0','HTTP_ACCEPT':'text/html,application/xhtml+xml,application/xml;q=0.9,p_w_picpath/webp,p_w_picpath/apng,*/*;q=0.8','wsgi.multiprocess':False,'ALLUSERSPROFILE':'C:\\ProgramData','SYSTEMROOT':'C:\\WINDOWS','SERVER_SOFTWARE':'WSGIServer/0.2','PROCESSOR_REVISION':'4501','SESSIONNAME':'Console','HTTP_HOST':'127.0.0.1:8000','CONTENT_LENGTH':'','PATH':'C:\\ProgramFiles(x86)\\BusinessObjects\\Common\\3.5\\bin\\NOTES\\;C:\\ProgramFiles(x86)\\BusinessObjects\\Common\\3.5\\bin\\NOTES\\DATA\\;C:\\Python35-32\\Scripts\\;C:\\Python35-32\\;C:\\ProgramData\\Oracle\\Java\\javapath;C:\\WINDOWS\\system32;C:\\WINDOWS;C:\\WINDOWS\\System32\\Wbem;C:\\WINDOWS\\System32\\WindowsPowerShell\\v1.0\\;C:\\ProgramFiles(x86)\\Sennheiser\\SoftphoneSDK\\;C:\\Python35-32\\Scripts;C:\\Users\\yuan.li\\AppData\\Local\\Microsoft\\WindowsApps;C:\\ProgramFiles(x86)\\Nmap;','OS':'Windows_NT','PYTHONPATH':'C:\\s14day21','HOMEDRIVE':'C:','COMMONPROGRAMW6432':'C:\\ProgramFiles\\CommonFiles','DJANGO_SETTINGS_MODULE':'s14day21.settings','PROCESSOR_ARCHITECTURE':'x86','REQUEST_METHOD':'GET','LOCALAPPDATA':'C:\\Users\\yuan.li\\AppData\\Local','PROCESSOR_LEVEL':'6','HTTP_USER_AGENT':'Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/59.0.3071.115Safari/537.36','PROGRAMFILES(X86)':'C:\\ProgramFiles(x86)','LOGONSERVER':'\\\\MELDC01','wsgi.multithread':True,'COMMONPROGRAMFILES':'C:\\ProgramFiles(x86)\\CommonFiles'}ASL.LOGDestination=filePYTHONIOENCODINGUTF-8wsgi.run_onceFalseFPS_BROWSER_APP_PROFILE_STRINGInternetExplorerREMOTE_ADDR127.0.0.1PROCESSOR_IDENTIFIERIntel64Family6Model69Stepping1,GenuineIntelTEMPC:\Users\yuan.li\AppData\Local\TempUSERPROFILEC:\Users\yuan.liSERVER_PORT8000WINDIRC:\WINDOWSSYSTEMDRIVEC:FP_NO_HOST_CHECKNOCOMMONPROGRAMFILES(X86)C:\ProgramFiles(x86)\CommonFilesUSERDNSDOMAINOMNICOM.COM.AUHTTP_UPGRADE_INSECURE_REQUESTS1PROGRAMFILESC:\ProgramFiles(x86)USERDOMAIN_ROAMINGPROFILEOMNICOMwsgi.url_schemehttpwsgi.input<_io.BufferedReadername=760>APPDATAC:\Users\yuan.li\AppData\RoamingTMPC:\Users\yuan.li\AppData\Local\TempHTTP_ACCEPT_ENCODINGgzip,deflate,brGATEWAY_INTERFACECGI/1.1PATH_INFO/tpl1/PUBLICC:\Users\PublicHTTP_COOKIEcsrftoken=eIEjNdtcPYmGD2jGDfEwxb0MwePMQTuLWchxG85P7zH7wHN2BZmERsppA4PHGd6DPROCESSOR_ARCHITEW6432AMD64COMPUTERNAMEYLI-PCwsgi.version(1,0)ONEDRIVEC:\Users\yuan.li\OneDriveCONTENT_TYPEtext/plainPROGRAMW6432C:\ProgramFilesPYTHONUNBUFFERED1wsgi.errors<_io.TextIOWrappername='<stderr>'mode='w'encoding='UTF-8'>RUN_MAINtruePSMODULEPATHC:\WINDOWS\system32\WindowsPowerShell\v1.0\Modules\;C:\ProgramFiles(x86)\VMware\Infrastructure\vSpherePowerCLI\Moduleswsgi.file_wrapper<class'wsgiref.util.FileWrapper'>HOMEPATH\Users\yuan.liCOMSPECC:\WINDOWS\system32\cmd.exeUSERNAMEyuan.liPATHEXT.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.PY;.PYWSERVER_NAMEvmware-localhostUSERDOMAINOMNICOMSCRIPT_NAMEPYCHARM_HOSTED1QUERY_STRINGPROGRAMDATAC:\ProgramDataNUMBER_OF_PROCESSORS4FPS_BROWSER_USER_PROFILE_STRINGDefaultSERVER_PROTOCOLHTTP/1.1HTTP_CONNECTIONkeep-aliveREMOTE_HOSTHTTP_ACCEPT_LANGUAGEen-GB,en-US;q=0.8,en;q=0.6HTTP_CACHE_CONTROLmax-age=0HTTP_ACCEPTtext/html,application/xhtml+xml,application/xml;q=0.9,p_w_picpath/webp,p_w_picpath/apng,*/*;q=0.8wsgi.multiprocessFalseALLUSERSPROFILEC:\ProgramDataSYSTEMROOTC:\WINDOWSSERVER_SOFTWAREWSGIServer/0.2PROCESSOR_REVISION4501SESSIONNAMEConsoleHTTP_HOST127.0.0.1:8000CONTENT_LENGTHPATHC:\ProgramFiles(x86)\BusinessObjects\Common\3.5\bin\NOTES\;C:\ProgramFiles(x86)\BusinessObjects\Common\3.5\bin\NOTES\DATA\;C:\Python35-32\Scripts\;C:\Python35-32\;C:\ProgramData\Oracle\Java\javapath;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\ProgramFiles(x86)\Sennheiser\SoftphoneSDK\;C:\Python35-32\Scripts;C:\Users\yuan.li\AppData\Local\Microsoft\WindowsApps;C:\ProgramFiles(x86)\Nmap;OSWindows_NTPYTHONPATHC:\s14day21HOMEDRIVEC:COMMONPROGRAMW6432C:\ProgramFiles\CommonFilesDJANGO_SETTINGS_MODULEs14day21.settingsPROCESSOR_ARCHITECTUREx86REQUEST_METHODGETLOCALAPPDATAC:\Users\yuan.li\AppData\LocalPROCESSOR_LEVEL6HTTP_USER_AGENTMozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/59.0.3071.115Safari/537.36PROGRAMFILES(X86)C:\ProgramFiles(x86)LOGONSERVER\\MELDC01wsgi.multithreadTrueCOMMONPROGRAMFILESC:\ProgramFiles(x86)\CommonFilesMozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/59.0.3071.115Safari/537.36


注意最后的那个输出结果HTTP_USER_AGENT, 这个是客户端的信息,我们可以根据这个做判断,然后返回不同的结果,比如手机版和PC版返回的显示排版不同。



除了通过WSGI的类来获取header的信息,我们还有2个方式可以获取, request.body和request.META


request.META获取的数据和WSGI一样,但是他就是个纯粹的字符串,不像字典已经分好键值对了那么容易提取数据;


request.body 在使用PUT,POST, DELETE等方式提交表单的时候很有用,因为我们知道GET请求的值是在URL里面可以直接获取的,其他的方式则是把值封装在body里面以byte的方式发送的。例如

defbusiness(request):ifrequest.method=='GET':v1=models.Business.objects.all()print(v1)returnrender(request,'business.html',{'v1':v1})elifrequest.method=='POST':u=request.POST.get('caption')models.Business.objects.create(caption=u)print(request.body)returnredirect('/business')


我在前端执行一个POST的操作,提交一个数据

返回的结果

b'caption=sssssss'