HttpRequest对象
当请求一个页面时,Django会把请求数据包装成一个HttpRequest对象,然后调用对应的视图函数,把这个HttpRequest对象作为第一个参数传给视图函数。
Attribute | Description |
---|---|
path | 请求页面的全路径,不包括域名端口参数。例如: "/music/bands/beatles" |
method | 一个全大写的字符串,表示请求中使用的HTTP方法。常用值:‘GET’, 'POST'。以下三种会为Get请求:form表单默认提交(或者method指定为get) 在浏览器中输入地址直接请求 网页中的超链接(a标签) form表单中指定method为post,则为post请求 |
encoding | 一个字符串,表示提交的数据的编码方式(如果为 None 则表示使用 DEFAULT_CHARSET 的设置,默认为 'utf-8') |
GET | 类似字典的QueryDict对象,包含get请求的所有参数 |
POST | 类似字典的QueryDict对象,包含post请求的所有参数服务器收到空的POST请求的情况也是有可能发生的 因此,不能使用语句if request.POST来判断是否使用HTTP POST方法 , 应该使用if request.method == "POST" |
COOKIES | 一个标准的python字典,包含所有的cookies, 键和值都是字符串 |
session | 可读可写的类似字典的对象(django.contrib.sessions.backends.db.SessionStore )。django提供了session模块,默认就会开启用来保存session数据 |
FILES | 类似字典的对象,包含所有的上传文件 |
QueryDict对象
- 定义在django.http.QueryDict
- HttpRequest对象的 属性 GET、POST 都是QueryDict类型的对象
- 与python字典不同,使用QueryDict类型的对象,同一个键可以有多个值
get()方法:根据键获取值,如果一个键同时拥有多个值将获取最后一个值,键不存在则返回None,也可以指定默认值:
dict.get('键',默认值) 可简写为 dict['键']
注意:通过 dict['键'] 访问,如果键不存在会报错
QueryDict使用案例
用来保存一个键可以有多个值的情况
>>> QueryDict('a=1&a=2&a=3&b=4') <QueryDict: {'a': ['1', '2', '3'], 'b': ['4']}>
通过[]取一个值(没有键会报错):
>>> d = QueryDict('a=1&a=2&a=3&b=4') >>> d['a'] '3' >>> d['c'] django.utils.datastructures.MultiValueDictKeyError
通过get方法取值,没有键不会报错
>>> d.get('a') '3' >>> d.get('c', '默认值') '默认值'
通过getlist()方法取出所有值
>>> d.getlist('a') ['1', '2', '3']
GET属性
关于GET请求:
- 当需要从服务器中读取数据时使用get请求;
- 请求参数会跟在url末尾传递给服务器:
http://127.0.0.1:8000/login?username=admin&password=123
- 提交的参数有大小限制(浏览器对url长度有限制);
- 安全性较低
案例: 从GET属性中获取请求参数
例:url请求地址如下:
http://127.0.0.1:8000/get?a=1&b=2&b=3
其中get请求的参数为:
a=1&b=2&b=3
- 分析请求参数,键为'a'、'b',值为'1'、'2'、'3'
- 在Django中,可以使用HttpRequest对象的GET属性获得get方式请求的参数
- GET属性返回QueryDict类型的对象,键和值都是字符串类型
POST属性
POST请求
- 用于向服务器提交数据,会修改服务器中的数据
- 请求参数会通过请求体(request body)传递给服务器
- 提交的参数没有大小限制
- 安全性相对get较高(HTTPS)
HttpResponse对象
视图函数处理完逻辑后,必须返回一个HttpResponse对象或子对象作为响应:
- HttpResponse对象 (render 函数)
- HttpResponseRedirect对象 (redirect 函数)
- JsonResponse对象
HttpResponseRedirect
与redirect()
函数类似,可以重定向到某个界面:
- 它可以是一个完整的URL,例如:
'http://search.yahoo.com/'
- 或者不包括域名的相对路径,例如:
'/search'
- 注意它返回HTTP 状态码 302。
JsonResponse
JsonReponse: 给客户端请求返回json格式的数据
- 应用场景:网页的局部刷新(ajax技术)
- 类JsonResponse继承自HttpResponse,被定义在django.http模块中
- 接收字典作为参数
- JsonResponse对象的 content-type 为
application/json
状态保存
浏览器请求服务器是无状态的: 无状态指一次用户请求时,浏览器、服务器无法知道之前这个用户做过什么,每次请求都是一次新的请求。无状态的应用层面的原因是:浏览器和服务器之间的通信都遵守HTTP协议。根本原因是:浏览器与服务器是使用Socket套接字进行通信的,服务器将请求结果返回给浏览器之后,会关闭当前的Socket连接,而且服务器也会在处理页面完毕之后销毁页面对象。
但是: 有时服务器需要保存用户的浏览状态,比如: 用户是否登录过,用户浏览过哪些商品等
解决:cookie和session
Cookie
一、Cookie介绍
Cookie是什么?
- Cookie是由服务器生成的,存储在浏览器端的少量数据(键值对)
- 服务器生成Cookie后,会在响应请求时发送Cookie数据给浏览器,浏览器接收到后会自动保存
- 浏览器再次请求服务器时,会自动上传该服务器生成的所有的Cookie
- Cookie是有过期时间的,默认关闭浏览器之后Cookie就会过期
- 每个域名下保存的Cookie的个数是有限制的(50个),不同浏览器保存的个数不一样;
每个Cookie保存的数据大小是有限制的(4K),不同的浏览器保存的数据大小不一样;
Cookie是基于域名安全的:
- Cookie的存储是以域名的方式进行区分的;
- 每个网站只能读取自己生成的Cookie,而无法读取其它网站生成的Cookie;
- 浏览器请求某个网站时,会自动携带该网站所有的Cookie数据给服务器,但不会携带其它网站生成的Cookie数据。
二、Cookie操作:
在Django中Cookie的读写:
读取数据
request.COOKIES['键名'] 或者: request.COOKIES.get('键名')
保存数据
response.set_cookie('键名', count,max_age, expires)
- max_age是一个整数,表示在指定秒数后过期
- expires是一个datetime或timedelta对象,会话将在这个指定的日期/时间过期
- max_age与expires二选一
- 如果不指定过期时间,在关闭浏览器时cookie会过期
Session
一、Session介绍
一些重要敏感的数据(银行卡账号,余额,验证码...),应该存储在服务器端,而不是存储在浏览器,这种在服务器端进行状态数据保存的方案就是Session
Session的使用依赖于Cookie,如果浏览器不能保存Cookie,那么Session则失效了
django项目有session模块,默认开启session功能,会自动存储session数据到数据库表中
Session也是有过期时间的,如果不指定,默认两周就会过期
二、Session的使用
开启session功能
在django项目中,session功能默认是开启的;要禁用session功能,则可禁用下图中的session中间件:
2、session对象操作(request.session字典)
保存session数据(键值对)
request.session['键']=值
读取session数据
request.session.get('键',默认值)
清除session数据数据:
request.session.clear() 或者: request.session.flush()
删除指定的sessoin键值对数据(注意:键不存在会报错KeyError)
del request.session['键']
设置会话的超时时间,如果没有指定过期时间则两个星期后过期
request.session.set_expiry(value)
- 如果value是一个整数,会话将在value秒没有活动后过期。
- 如果value为0,那么用户会话的Cookie将在用户的浏览器关闭时过期。
- 如果value为None,那么会话永不过期。
三、session存储方式
Session数据可以存储在数据库、内存、Redis等,可以通过在项目的setting.py中设置SESSION_ENGINE项,指定Session数据存储的方式。
存储在数据库中,如下设置可以写,也可以不写,这是默认存储方式。
SESSION_ENGINE='django.contrib.sessions.backends.db'
存储在内存中:存储在本机内存中,如果丢失则不能找回,比数据库的方式读写更快
SESSION_ENGINE='django.contrib.sessions.backends.cache'
混合存储:优先从本机内存中存取,如果没有则从数据库中存取。
SESSION_ENGINE='django.contrib.sessions.backends.cached_db'
通过Redis存储session
联系方式
QQ:1217675462
欢迎交流