参考:https://blog.csdn.net/u010429424/article/details/77394778
https://developer.mozilla.org/en-US/docs/Learn/Server-side/Django/Sessions
HTTP被设计为”无状态”,在一次请求和下一次请求之间没有任何状态保持,服务器无法识别来自同一客户端的连续请求。因此,Cookies和Session应运而生。
1. Cookies
- Web站点要求保存在客户端(如浏览器)上的二进制数据。
- 适用情形:验证用户是否登录;实现页面跳转,但不跟踪用户数据。
def my_set_cookie(request): ... # set a cookie on the response response = HttpResponse() response.set_cookie("cookie", {cookie_content}) ...
def my_get_cookie(request): ... request.COOKIES["cookie"]) ...
2. Session
session 又叫做“会话”,用于存取会话信息, 这些数据在服务器端存储,并对cookie的收发进行了抽象。 Cookies只存储数据的哈希会话ID,而不是数据本身,从而避免了大部分的常见cookie问题。
- 流程:
- 客户端向服务器发送请求时,看本地是否有cookie文件。如果有,就在HTTP的请求头(Request Headers)中,包含一行cookie信息。
- 服务器接收到请求后,根据cookie信息,得到sessionId,根据sessionId找到对应的session,用这个session就能判断出用户是否登录等等。如果session超时被销毁了,那么服务器会生成新的sessionId发回给客户端。客户端收到新的sessionId后,更新本地cookie文件中的信息,下次访问时就会使用新的cookie信息。
- 在Django中,Session功能通过中间件
SessionMiddleware
:- 在使用过程中,可以像使用字典一样使用它。
request.session["password"] = "asdf"
- 像Model一样使用它
from django.contrib.sessions.models import Session # session由32字节的Hash串标识,可以用数据库API来存取session # session数据存储在数据库表django_session中 s = Session.objects.get(pk='2b1189a188b44ad18c35e113ac6ceead') s.session_data
- 在使用过程中,可以像使用字典一样使用它。
-
session_data
是加密的json数据,存储了user_id
和其它自定义session
。from django.contrib.sessions.models import Session from django.contrib.auth.models import User session_key = 'pga1ykmzyba4fmv6b34l8c3kbqqynwbt' session = Session.objects.get(session_key=session_key) data = session.get_decoded() print data uid = data.get('_auth_user_id') user = User.objects.get(pk=uid) print user.username, user.get_full_name(), user.email # 输出 In [10]: print data {'_auth_user_id': 2L, '_auth_user_backend': 'django.contrib.auth.backends.ModelBackend'} In [11]: print user.username, user.get_full_name(), user.email test
- 适用情形:记录当前用户请求次数,当前登录用户的个数。