多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
![](https://img.kancloud.cn/41/e0/41e066af9a6c25a24868d9667253ec98_1241x333.jpg) ## WSGIRequest对象 Django在接收到http请求之后,会根据http请求携带的参数以及报文信息创建一个WSGIRequest对象,并且作为视图函数第一个参数传给视图函数。也就是我们经常看到的request参数。在这个对象上我们可以找到客户端上传上来的所有信息。这个对象的完整路径是django.core.handlers.wsgi.WSGIRequest。 ### WSGIRequest对象常用属性 WSGIRequest对象上大部分的属性都是只读的。因为这些属性是从客户端上传上来的,没必要做任何的修改。 <ol> <li><code>path</code>:请求服务器的完整“路径”,但不包含域名和参数。比如<code>http://www.baidu.com/xxx/yyy/</code>,那么<code>path</code>就是<code>/xxx/yyy/</code>。 </li> <li><code>method</code>:代表当前请求的<code>http</code>方法。比如是<code>GET</code>还是<code>POST</code>。 </li> <li><code>GET</code>:一个<code>django.http.request.QueryDict</code>对象。操作起来类似于字典。这个属性中包含了所有以<code>?xxx=xxx</code>的方式上传上来的参数。 </li> <li><code>POST</code>:也是一个<code>django.http.request.QueryDict</code>对象。这个属性中包含了所有以<code>POST</code>方式上传上来的参数。 </li> <li><code>FILES</code>:也是一个<code>django.http.request.QueryDict</code>对象。这个属性中包含了所有上传的文件。 </li> <li><code>COOKIES</code>:一个标准的Python字典,包含所有的<code>cookie</code>,键值对都是字符串类型。 </li> <li><code>session</code>:一个类似于字典的对象。用来操作服务器的<code>session</code>。 </li> <li><p><code>META</code>:存储的客户端发送上来的所有<code>header</code>信息。</p> </li> <li><p><code>CONTENT_LENGTH</code>:请求的正文的长度(是一个字符串)。</p> </li> <li><code>CONTENT_TYPE</code>:请求的正文的MIME类型。</li> <li><code>HTTP_ACCEPT</code>:响应可接收的Content-Type。</li> <li><code>HTTP_ACCEPT_ENCODING</code>:响应可接收的编码。</li> <li><code>HTTP_ACCEPT_LANGUAGE</code>: 响应可接收的语言。</li> <li><code>HTTP_HOST</code>:客户端发送的HOST值。</li> <li><code>HTTP_REFERER</code>:在访问这个页面上一个页面的url。</li> <li><code>QUERY_STRING</code>:单个字符串形式的查询字符串(未解析过的形式)。</li> <li><code>REMOTE_ADDR</code>:客户端的IP地址。如果服务器使用了<code>nginx</code>做反向代理或者负载均衡,那么这个值返回的是<code>127.0.0.1</code>,这时候可以使用<code>HTTP_X_FORWARDED_FOR</code>来获取,所以获取<code>ip</code>地址的代码片段如下:<pre><code class="lang-python"> <span class="hljs-keyword">if</span> request.META.has_key(<span class="hljs-string">'HTTP_X_FORWARDED_FOR'</span>): ip = request.META[<span class="hljs-string">'HTTP_X_FORWARDED_FOR'</span>] <span class="hljs-keyword">else</span>: ip = request.META[<span class="hljs-string">'REMOTE_ADDR'</span>] </code></pre> </li> <li><code>REMOTE_HOST</code>:客户端的主机名。</li> <li><code>REQUEST_METHOD</code>:请求方法。一个字符串类似于<code>GET</code>或者<code>POST</code>。</li> <li><code>SERVER_NAME</code>:服务器域名。</li> <li><code>SERVER_PORT</code>:服务器端口号,是一个字符串类型。</li> </ol> ### WSGIRequest对象常用方法 <ol> <li><code>is_secure()</code>:是否是采用<code>https</code>协议。</li> <li><code>is_ajax()</code>:是否采用<code>ajax</code>发送的请求。原理就是判断请求头中是否存在<code>X-Requested-With:XMLHttpRequest</code>。</li> <li><code>get_host()</code>:服务器的域名。如果在访问的时候还有端口号,那么会加上端口号。比如<code>www.baidu.com:9000</code>。</li> <li><code>get_full_path()</code>:返回完整的path。如果有查询字符串,还会加上查询字符串。比如<code>/music/bands/?print=True</code>。</li> <li><code>get_raw_uri()</code>:获取请求的完整<code>url</code>。</li> </ol>