django的htpp请求之WSGIRequest
WSGIRequest对象
Django在接收到http请求之后,会根据http请求携带的参数以及报文信息创建一个WSGIRequest
对象,并且作为视图函数第一个参数传给视图函数。这个参数就是django视图函数的第一个参数,通常写成request。在这个对象上我们可以找到客户端上传上来的所有信息。这个对象的完整路径是django.core.handlers.wsgi.WSGIRequest
。
http请求的url详解:
在了解WSGIRequest对象的属性和方法之前,我们先了解一下url的组成,通常来说url的完整组成如下,[]为可选:
protocol ://hostname[:port]/path/[;parameters][?query]#fragment
- protocol: 网络协议,常用的协议有http/https/ftp等
- hostname: 主机地址,可以是域名,也可以是IP地址
- port: 端口 http协议默认端口是:80端口,在浏览器中默认会隐藏不显示
- path:路径 网络资源在服务器中的指定路径
- parameter: 参数 如果要向服务器传入参数,在这部分输入
- query: 查询字符串 如果需要从服务器那里查询内容,在这里编辑
- fragment:片段 网页中可能会分为不同的片段,如果想访问网页后直接到达指定位置,可以在这部分设置
WSGIRequest对象常用属性:
WSGIRequest
对象上大部分的属性都是只读的。因为这些属性是从客户端上传上来的,没必要做任何的修改,在django视图中使用时,视图函数的第一个参数参数request就是WSGIRequest对象。以下将对一些常用的属性进行讲解:
path
:资源在服务器的完整“路径”,但不包含域名和参数,在url中也是path的内容。比如http://www.baidu.com/xxx/yyy/
,那么path
就是/xxx/yyy/
。method
:代表当前请求的http
方法。比如是GET、
POST、delete或者是put等方法
GET
:一个django.http.request.QueryDict
对象。操作起来类似于字典。这个属性中包含了所有以?xxx=xxx
的方式上传上来的参数。POST
:也是一个django.http.request.QueryDict
对象。这个属性中包含了所有以POST
方式上传上来的参数。FILES
:也是一个django.http.request.QueryDict
对象。这个属性中包含了所有上传的文件。COOKIES
:一个标准的Python字典,包含所有的cookie
,键值对都是字符串类型。session
:一个类似于字典的对象。用来操作服务器的session
。user:user 只有当Django 启用 AuthenticationMiddleware 中间件时才可用。它的值是一个 setting.py 里面AUTH_USER_MODEL 字段所定义的类的对象,表示当前登录的用户。如果用户当前没有登录,user 将设为 django.contrib.auth.models.AnonymousUser 的一个实例。你可以通过 is_authenticated() 区分它们。
META
:存储的客户端发送上来的所有header
信息,下面是这些常用的header信息:CONTENT_LENGTH
:请求的正文的长度(是一个字符串)。CONTENT_TYPE
:请求的正文的MIME类型。HTTP_ACCEPT
:响应可接收的Content-Type。HTTP_ACCEPT_ENCODING
:响应可接收的编码,用于告知服务器客户端所能够处理的编码方式和相对优先级。HTTP_ACCEPT_LANGUAGE
: 响应可接收的语言。HTTP_HOST
:客户端发送的HOST值。HTTP_REFERER
:在访问这个页面上一个页面的url。QUERY_STRING
:单个字符串形式的查询字符串(未解析过的形式)。- TE:设置传输实体的编码格式,表示请求发起者愿意接收的Transfer-Encoding类型(传输过程中的编码格式,代理服务器之间)
REMOTE_ADDR
:客户端的IP地址。如果服务器使用了nginx
做反向代理或者负载均衡,那么这个值返回的是127.0.0.1
,这时候可以使用HTTP_X_FORWARDED_FOR
来获取,所以获取ip
地址的代码片段如下:if request.META.has_key('HTTP_X_FORWARDED_FOR'):
ip = request.META['HTTP_X_FORWARDED_FOR']
else:
ip = request.META['REMOTE_ADDR']
REMOTE_HOST
:客户端的主机名。REQUEST_METHOD
:请求方法。一个字符串类似于GET
或者POST
。SERVER_NAME
:服务器域名。SERVER_PORT
:服务器端口号,是一个字符串类型。
WSGIRequest对象常用方法:
is_secure()
:是否是采用https
协议。is_ajax()
:是否采用ajax
发送的请求。原理就是判断请求头中是否存在X-Requested-With:XMLHttpRequest
。get_host()
:服务器的域名。如果在访问的时候还有端口号,那么会加上端口号,在url中就是hostname+port。比如www.baidu.com:9000
。get_full_path()
:返回完整的path。如果有查询字符串,还会加上查询字符串,在url中就是path以及其后面的所有。比如/music/bands/?print=True
。get_raw_uri()
:获取请求的完整url
。
QueryDict对象:
我们平时用的request.GET、
request.POST和request.FILES
都是QueryDict
对象,这个对象继承自dict
,因此用法跟dict
相差无几。其中用得比较多的是get
方法和getlist
方法。
get
方法:用来获取指定key
的值,如果没有这个key
,那么会返回None
。getlist
方法:如果浏览器上传上来的key
对应的值有多个,如果使用get取值,那么你只能取出最后面一个值,如果你想取到所有的值,那么就需要通过getlist这个方法获取。
django的htpp请求之WSGIRequest的更多相关文章
- 玩转Django的POST请求 CSRF
玩转Django的POST请求 CSRF 不少麻油们玩django都会碰到这个问题,POST请求莫名其妙的返回 403 foribidden,希望这篇博文能解答所有问题 三种方法 To enable ...
- Django跨域请求之JSONP和CORS
现在来新建一个Django项目server01,url配置为 url(r'^getData.html$',views.get_data) 其对应的视图函数为get_data: from django. ...
- python——django的post请求
两次被同一块石头绊倒简直不可原谅!第一次写django程序的时候,就因为ajax post请求折腾了整整一天,时隔两个多月昨天又被虐一整晚.叔可忍婶儿也不能忍了!!!重要的事情写下来,为以后轻松碾压p ...
- django - django 承接nginx请求
# -*- coding: utf-8 -*- import os import sys import tornado.ioloop import tornado.web import tornado ...
- django 启动和请求
Django运行方式 调试模式 直接 python manage.py runserver python manage.py runserver python manage.py runserver ...
- django中HttpRequest请求
视图的第一个参数必须是HttpRequest对象 在视图函数中,接收的request有如下属性: path:一个字符串,表示请求的页面的完整路径,不包含域名. method:一个字符串,表示请求使用的 ...
- django rest-framework 2.请求和响应
一.请求对象 REST 框架引入Request来扩展常规的HttpRequest,并提供了更灵活的请求解析.Request对象的核心功能是request.data属性. 导入方式: from rest ...
- Django—跨域请求(jsonp)
同源策略 如果两个页面的协议,端口(如果有指定)和域名都相同,则两个页面具有相同的源. 示例:两个Django demo demo1 url.py url(r'^demo1/',demo1), vie ...
- Python3+Django get/post请求实现教程
一.说明 之前写了一篇“Python3+PyCharm+Django+Django REST framework开发教程”,想着直接介绍rest就完了.但回过头来看,一是rest在解耦的同时将框架复杂 ...
随机推荐
- Mybatis-smart(Mybatis最终优化方案)
Hibernate: 我用了Hibernate一年多,可以说是饱经风雨,感受极深,Hibernate看似一个很好的框架,我简单说一下它的使用痛点, 1.作为开发人员,我们应该全新全意关注我们的功能业务 ...
- 仓位 001 998 AUFNAHME不存在(L9009)
测试做一个物料库存561初始化时,库位是上启用了WM的.提示“C01 998 AUFNAHME 不存在”,998 库存余额的初始条目 是缺省的存储类型.用LS25在正式系统中,CO1 998下有AUF ...
- Java与数据库学习总结
1.连接数据库 package utils; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Re ...
- nginx 源码安装以及后续升级https
事情的来源是,公司要将网站从http升级到https,由于历史遗留原因,才发现现有的nginx是通过源码安装的,并没有安装ssl模块,需要现安装sll模块,这个nginx是整个公司最前端的一个代理,涉 ...
- git pull 发生冲突解决办法
冲突原因:远程仓库的同一个文件的代码,和本地的文件代码不一样 解决办法 : 1.git stash (把本地冲突的代码隐藏) 2.git pull 3.git stash pop (将隐藏的和pull ...
- java虚拟机内存管理
1. java虚拟机内存如下 2. 运行时数据区 内存图分析:
- NodeJS设置Header解决跨域问题
转载: NodeJS设置Header解决跨域问题 app.all('*', function (req, res, next) { res.header('Access-Control-Allow-O ...
- JVM内存模型(转载)
原文地址:http://blog.csdn.net/u012152619/article/details/46968883 JVM定义了若干个程序执行期间使用的数据区域.这个区域里的一些数据在JVM启 ...
- 20155229 2016-2017-2 《Java程序设计》第三周学习总结
20155229 2016-2017-2 <Java程序设计>第三周学习总结 教材学习内容总结 第四章 BigDecimal提供有plus().substract().multiply() ...
- 20155301 2016-2017-2 《Java程序设计》第10周学习总结
20155301 2016-2017-2 <Java程序设计>第10周学习总结 教材学习内容总结 计算机网络: 1.在计算机网络中,现在命名IP地址的规定是IPv4协议,该协议规定每个IP ...