- HttpReqeust对象
-
介绍
- 服务器接收到http协议的请求后,会根据报文创建HttpRequest对象,这个对象不需要我们创建,直接使用服务器构造好的对象使用就可以
- 视图的第一个参数必须是HttpRequest对象
- 在django.http模块中定义了HttpRequest对象的API
-
属性
- 下面除非特别说明,属性都是只读的
- path:一个字符串,表示请求的页面的完整路径,不包含域名
- method:一个字符串,表示请求使用的HTTP方法,常用值包括:'GET'、'POST'
- 在浏览器中给出地址发出请求采用get方式,如超链接
- 在浏览器中点击表单的提交按钮发起请求,如果表单的method设置为post则为post请求
- encoding:一个字符串,表示提交的数据的编码方式
- 如果为None则表示使用浏览器的默认设置,一般为utf-8
- 这个属性是可写的,可以通过修改它来修改访问表单数据使用的编码,接下来对属性的任何访问将使用新的encoding值
- GET:一个类似于字典的对象,包含get请求方式的所有参数
- POST:一个类似于字典的对象,包含post请求方式的所有参数
- FILES:一个类似于字典的对象,包含所有的上传文件
- COOKIES:一个标准的Python字典,包含所有的cookie,键和值都为字符串
- session:一个既可读又可写的类似于字典的对象,表示当前的会话,只有当Django 启用会话的支持时才可用,详细内容见“状态保持”
-
2. 以下全部都是示例
接下来演示属性path、method、encoding
对于GET、POST、FILES、COOKIES、session后面会有详细讲解
1. path、encoding
打开booktest/views.py文件,代码如下
```python
def index(request):
str='%s<br>%s'%(request.path,request.encoding)
return HttpResponse(str)
```
打开浏览器请求,运行效果如下图
请求属性
以chrome浏览器为例,设置编码如下图,默认为utf-8编码
编码设置
2. method
1. 打开booktest/views.py文件,编写视图method1、method2、method3,代码如下
```python
def method1(request):
return render(request,'booktest/method1.html')
def method2(request):
return HttpResponse(request.method)
def method3(request):
return HttpResponse(request.method)
```
3. 打开booktest/urls.py文件,新增配置如下
```python
url(r'^method1/$', views.method1),
url(r'^method2/$', views.method2),
url(r'^method3/$', views.method3),
```
在templates/booktest/下创建method1.html文件,代码如下
```python
<html>
<head>
<title>方法练习</title>
</head>
<body>
<a href="/method2/">方式一:get</a>
<br>
<br>
<br>
<form method="post" action="/method3/">
<input type="submit" value="方式二:post">
</form>
</body>
</html>
```
打开浏览器,输入如下网址
http://127.0.0.1:8000/method1/
浏览效果如下图
请求方式
点击链接,转到method2,浏览效果如下图
请求方式
回到method1页面,点击按钮,转到method3,浏览效果如下图,报错了
请求方式
**打开test3/settings.py文件,将MIDDLEWARE_CLASSES项的csrf注释**
请求方式
回到浏览器中刷新,浏览效果如下图,点击“继续”按钮
请求方式
最终浏览效果如下图
请求方式
-
QueryDict对象
- 定义在django.http.QueryDict
- HttpRequest对象的属性GET、POST都是QueryDict类型的对象
- 与python字典不同,QueryDict类型的对象用来处理同一个键带有多个值的情况
- 方法get():根据键获取值
- 如果一个键同时拥有多个值将获取最后一个值
- 如果键不存在则返回None值,可以设置默认值进行后续处理
dict.get('键',默认值) 可简写为 dict['键']
- 方法getlist():根据键获取值,值以列表返回,可以获取指定键的所有值
如果键不存在则返回空列表[],可以设置默认值进行后续处理dict.getlist('键',默认值)
-
GET属性
-
请求格式:在请求地址结尾使用?,之后以“键=值”的格式拼接,多个键值对之间以&连接
- 例:网址如下
http://www.itcast.cn/?a=10&b=20&c=python
其中的请求参数为
a=10&b=20&c=python
- 例:网址如下
分析请求参数,键为'a'、'b'、'c',值为'10'、'20'、'python'
在Django中可以使用HttpRequest对象的GET属性获得get方式请求的参数
GET属性返回QueryDict类型的对象,键和值都是字符串类型
键是开发人员在编写代码时确定下来的
值是根据数据生成的
-
示例
-
打开booktest/views.py文件,创建视图get1、get2、get3
# 创建链接 def get1(request): return render(request,'booktest/get1.html') # 接收一键一值 def get2(request): return render(request,'booktest/get2.html') # 接收一键多值 def get3(request): return render(request,'booktest/get3.html')
-
打开booktest/urls.py文件,配置url
url(r'^get1/$',views.get1), url(r'^get2/$',views.get2), url(r'^get3/$',views.get3),
-
在templates/booktest目录下创建get1.html,代码如下
<html> <head> <title>GET属性</title> </head> <body> 链接1:一个键传递一个值<br> <a href="/get2/?a=1&b=2">get2</a> <hr> 链接2:一个键传递多个值<br> <a href="/get3/?a=1&a=2&b=3">get3</a> </body> </html>
运行服务器,请求get1
http://127.0.0.1:8000/get1/
浏览效果如下图
get1完善视图get2的代码如下
接收一键一值
```python def get2(request): dict=request.GET a=dict.get('a') b=dict.get('b') c=dict.get('c','1') context={'a':a,'b':b,'c':c} return render(request,'booktest/get2.html',context) ```
-
在templates/booktest目录下创建get2.html,代码如下
<html> <head> <title>GET属性一键一值</title> </head> <body> a:{{a}} <hr> b:{{b}} <hr> c:{{c}} </body> </html>
点击链接get2,浏览效果如下图
get2 -
完善视图get3的代码如下
# 接收一键多值 def get3(request): dict=request.GET a=dict.getlist('a') b=dict.get('b') context={'a':a,'b':b} return render(request,'booktest/get3.html',context)
-
在templates/booktest目录下创建get3.html,代码如下
<html> <head> <title>GET属性一键多值</title> </head> <body> a: <ul> {%for i in a%} <li>{{i}}</li> {%endfor%} </ul> <hr> b:{{b}} </body> </html>
后退到get1页面,点击链接get3,浏览效果如下图
-
-
-
POST属性
使用form表单请求时,method方式为post则会发起post方式的请求,需要使用HttpRequest对象的POST属性接收参数,POST属性返回QueryDict类型的对象
问:表单form如何提交参数呢?
-
答:控件name属性的值作为键,value属性的值为值,构成键值对提交
- 如果控件没有name属性则不提交
- 对于checkbox控件,name属性的值相同为一组,被选中的项会被提交,出现一键多值的情况
键是控件name属性的值,是由开发人员编写的
值是用户填写或选择的
-
示例
打开booktest/views.py文件,创建视图post1、post2创建表单
def post1(request): return render(request,'booktest/post1.html')
接收表单请求的数据
def post2(request): return HttpResponse('hello post2')
打开booktest/urls.py文件,配置url
url(r'^post1/$',views.post1), url(r'^post2/$',views.post2),
在templates/booktest目录下创建post1.html,代码如下
<html> <head> <title>POST属性</title> </head> <body> <form method="post" action="/post2/"> 姓名:<input type="text" name="uname"/><br> 密码:<input type="password" name="upwd"/><br> 性别:<input type="radio" name="ugender" value="1"/>男 <input type="radio" name="ugender" value="0"/>女<br> 爱好:<input type="checkbox" name="uhobby" value="胸口碎大石"/>胸口碎大石 <input type="checkbox" name="uhobby" value="脚踩电灯炮"/>脚踩电灯炮 <input type="checkbox" name="uhobby" value="口吐火"/>口吐火<br> <input type="submit" value="提交"/> </form> </body> </html>
在浏览器中请求地址如下
http://127.0.0.1:8000/post1/
填写、选择后,浏览效果如下图
psot1打开浏览器“开发者工具”,选择“Network”标签,点击“提交”按钮,在“开发者工具”中点击“post2”,找到提交数据如下图
psot2完善视图post2的代码如下
接收表单请求的数据
def post2(request): dict=request.POST uname=dict.get('uname') upwd=dict.get('upwd') ugender=dict.get('ugender') uhobby=dict.getlist('uhobby') context={'uname':uname,'upwd':upwd,'ugender':ugender,'uhobby':uhobby} return render(request,'booktest/post2.html',context)
在templates/booktest目录下创建post2.html,代码如下
<html> <head> <title>POST属性</title> </head> <body> 用户名:{{uname}}<br> 密码:{{upwd}}<br> 性别:{{ugender}}<br> 爱好:{{uhobby}}<br> <ul> {%for i in uhobby%} <li>{{i}}</li> {%endfor%} </ul> </body> </html>
刷新后浏览效果如下图