Django学习系列之Cookie、Session
Cookie和Session介绍
cookie
保存在客户端
session
- 保存在服务端
- session依赖于cookie,比如服务端想往客户端写东西的时候就把cookie写到客户端浏览器
django自带的session库有以下几点选择
- a)database-backed session 存数据库
- b)cached sessions 存缓存
- c)use file-based sessions 存文件
- d)cookie-based sessions 存cookie
Cookie
cookies是浏览器为Web服务器存储的一小段信息,每次浏览器从某个服务器请求页面时,它向服务器回送之前收到的cookies.
存取cookies
创建cookie
def cookie(request): obj = render(request,'cookie.html') obj.set_cookie("k1","v1") #设置cookie return obj #注释:给客户端返回页面的时候顺便设置cookie
获取cookie
def cookie(request): print(request.COOKIES) #获取所有的cookie print(request.COOKIES['k2']) #获取key为k2的cookie obj = render(request,'cookie.html') obj.set_cookie("k1","v1",path='/cookie') return obj
创建cookie时的参数
参数 | 默认值 | 描述 |
max_age | None | cookie生存时间,如果参数是None,这个cookie会延续到浏览器关闭为止 |
expires | None | cookie失效的实际日期/时间,格式必须是:Wdy, DD-Mth-YY HH:MM:SS GMT,这个参数会覆盖max_age参数 |
path | "/" | cookie对哪个url生效,比如说设置为/login,那么/index页面就看不到cookie |
domain | None | 这个cookie在那个站点生效,如果为None,就是当前站点,如果设为domain=".example.com",则所有带example.com的二级域名站点都可读到cookie |
False | False | 如果设置为True,浏览器将通过HTTPS来回传cookie |
Session
示例1:客户端第一次访问index,需要登陆才能访问,第二次就可以直接访问index
进行数据库同步
python3.5 manage.py makemigrations python3.5 manage.py migrate #因为django默认会把session信息存放在数据库的django_session表
创建视图
from django.shortcuts import render,HttpResponse,redirect USER_LIST = {"user1","user2"}
#登陆函数 def session_login(request): if request.method == "POST": u = request.POST.get("user") p = request.POST.get("pwd") if p == "123" and u in USER_LIST: #如果验证通过 request.session["user"] = u #设置session, return redirect("/session_index") #跳转到index页面 else: return render(request,"session_login.html") #如果验证不通过,继续在登陆页面
def auth(func): #这个装饰器的作用就是帮所有需要登陆后才能访问的页面自动验证是否登陆(原理:查看客户端访问页面的时候是否带session_id,) def inner(request,*args,**kwargs): user = request.session.get("user") #是否有session信息 if not user: #如果没有 return redirect("/session_login") return func(request,*args,**kwargs) #如果有就执行被装饰的函数 return inner #主页信息,需要登陆后才能看 @auth def session_index(request): return render(request,"session_index.html")
#退出登陆函数 def session_logout(request): del request.session["user"] #删除session信息 return redirect("/session_login") #然后跳转到login页面
创建路由信息
urls.py
from django.conf.urls import url from django.contrib import admin from app01 import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^session_login/', views.session_login), url(r'^session_index/', views.session_index), url(r'^session_logout/', views.session_logout), ]
创建模板
session_login.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="/session_login/" method="POST"> <input type="text" name="user"/> <input type="text" name="pwd"/> <input type="submit" value="提交"/> </form> </body> </html>
session_index.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>欢迎登陆</h1> <a href="/session_logout">注销</a> </body> </html>
测试第一次访问是否需要登陆才能访问index页面,第二次访问不用登陆,直接就能访问index页面
在客户端查看session信息
在服务端查看session信息
第一段是session_id,第二段加密了的登陆用户名,user1
session是登陆的用户名和session_id保存在服务端中,而客户端只保存一个session_id,django通过读取客户端带的session_id来查找对应的用户名,并返回客户端
流程
- 第一次客户端登陆的时候,如果登陆成功,服务端生成一个session_id和登陆的用户名,并保存在数据库的django_session表中,然后跳转到index页面
- 然后把session_id写入客户端的浏览器中
- 第二次客户端访问会带着session_id访问,服务端检测是否存在,如果存在就直接能访问index
session方法
def index(request): # 获取、设置、删除Session中数据 request.session['k1'] request.session.get('k1',None) request.session['k1'] = 123 request.session.setdefault('k1',123) # 存在则不设置 del request.session['k1'] # 所有 键、值、键值对 request.session.keys() request.session.values() request.session.items() request.session.iterkeys() request.session.itervalues() request.session.iteritems() # 用户session的随机字符串 request.session.session_key # 将所有Session失效日期小于当前日期的数据删除 request.session.clear_expired() # 检查 用户session的随机字符串 在数据库中是否 request.session.exists("session_key") # 删除当前用户的所有Session数据 request.session.delete("session_key") request.session.set_expiry(value) * 如果value是个整数,session会在些秒数后失效。 * 如果value是个datatime或timedelta,session就会在这个时间后失效。 * 如果value是0,用户关闭浏览器session就会失效。 * 如果value是None,session会依赖全局session失效策略。
session存储选择
存储在数据库
settings.py SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 引擎(默认) SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认) SESSION_COOKIE_PATH = "/" # Session的cookie保存的路径(默认) SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名(默认) SESSION_COOKIE_SECURE = False # 是否Https传输cookie(默认) SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http传输(默认) SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)(默认) SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期(默认) SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存(默认)
存出在本地目录
a. 配置 settings.py SESSION_ENGINE = 'django.contrib.sessions.backends.file' # 引擎 SESSION_FILE_PATH = None # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir() # 如:/var/folders/d3/j9tj0gz93dg06bmwxmhh6_xm0000gn/T SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串 SESSION_COOKIE_PATH = "/" # Session的cookie保存的路径 SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名 SESSION_COOKIE_SECURE = False # 是否Https传输cookie SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http传输 SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周) SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期 SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存