HttpReqeust对象
服务器接收到http协议的请求后,会根据报文创建HttpRequest对象,这个对象不需要我们创建,直接使用服务器构造好的对象就可以。视图的第一个参数必须是HttpRequest对象,在django.http模块中定义了HttpRequest对象的API。
视图函数的request参数
request参数就是一个HttpReuquest对象
1.简单了解POST和GET:
POST: 提交的参数请求头, 数据安全性要求比较高的时候使用post
GET:提交的参数在url中
2.request参数:
使用表单时,注释掉setting.py中的如下代码:
# 'django.middleware.csrf.CsrfViewMiddleware',
request.POST 保存的是post方式提交的参数
request.GET 保存的是get方式提交的参数
这两个的类型其实是QueryDict对象 (下面有说)
3.属性 下面除非特别说明,属性都是只读的。
- path:一个字符串,表示请求的页面的完整路径,不包含域名和参数部分。
- method:一个字符串,表示请求使用的HTTP方法,常用值包括:'GET'、'POST'。
- 在浏览器中给出地址发出请求采用get方式,如超链接。
- 在浏览器中点击表单的提交按钮发起请求,如果表单的method设置为post则为post请求。
- encoding:一个字符串,表示提交的数据的编码方式。
- 如果为None则表示使用浏览器的默认设置,一般为utf-8。
- 这个属性是可写的,可以通过修改它来修改访问表单数据使用的编码,接下来对属性的任何访问将使用新的encoding值。
- GET:QueryDict类型对象,类似于字典,包含get请求方式的所有参数。
- POST:QueryDict类型对象,类似于字典,包含post请求方式的所有参数。
- FILES:一个类似于字典的对象,包含所有的上传文件。
- COOKIES:一个标准的Python字典,包含所有的cookie,键和值都为字符串。
- session:一个既可读又可写的类似于字典的对象,表示当前的会话,只有当Django 启用会话的支持时才可用,详细内容见"状态保持"。
3.Django中的QueryDict对象
QueryDict像字典,但又不是字典,它可以一个键可以对应多个值
定义在django.http.QueryDict
(1) 生成QueryDict对象 QueryDict(‘键名=值&键名=值&键名=值’)
(2) 取值1 : QueryDict对象['键名'] # 这种方式如果没有键名时,会报错
(3) 取值2: QueryDict对象.get('键名',默认值) # get方法取值时,如果没有键名是不会报错的,是NoneType类型, 或者返回默认值
(4) 有多个值,取值时 QueryDict对象.getlist('键名') # 就会把键相同的值放在一个列表中返回
如果键不存在则返回空列表[],可以设置默认值进行后续处理
在项目的shell中进行测试使用
In [7]: from django.http.request import QueryDict In [8]: q = QueryDict('a=1&b=2&c=3') In [9]: q['a'] Out[9]: '1' In [10]: q['q'] --------------------------------------------------------------------------- KeyError Traceback (most recent call last) E:\Python3\Python\Python36\lib\site-packages\django\utils\datastructures.py in __getitem__(self, key) 77 try: ---> 78 list_ = super().__getitem__(key) 79 except KeyError: KeyError: 'q' During handling of the above exception, another exception occurred: MultiValueDictKeyError Traceback (most recent call last) <ipython-input-10-79654c88deae> in <module>() ----> 1 q['q'] E:\Python3\Python\Python36\lib\site-packages\django\utils\datastructures.py in __getitem__(self, key) 78 list_ = super().__getitem__(key) 79 except KeyError: ---> 80 raise MultiValueDictKeyError(key) 81 try: 82 return list_[-1] MultiValueDictKeyError: 'q' In [11]: q.get('a') Out[11]: '1' In [12]: q.get('q') In [13]: type(q.get('q')) Out[13]: NoneType In [14]: q1 = QueryDict('a=1&a=2&a=3') In [15]: q1.getlist('a') Out[15]: ['1', '2', '3'] In [16]: