1. Cookie
1.1 设置cookie
1.1.1 在登录函数中,写代码,例如:
1 def login(request): 2 user = request.POST.get('user') 3 pwd = request.POST.get('pwd') 4 if user == 'zhangsan' and pwd == '123123': 5 6 # 用户名和密码匹配成功,跳转到首页 7 ret = redirect ('首页') 8 9 # 设置cookie 10 ret.set_cookie(key,value) 11 return ret 12 esle: 13 14 # 匹配不成功则跳转回登录页面 15 return render(request,'login.html')
1.1.2 设置普通的cookie
ret.set_cookie(key,value)
1.在设置cookie时,只能用response对象的返回值去设置
2.set_cookie中的key就是cookie的name,value是cookie的值
3.cookie就是保存在浏览器中的键值对
1.1.3 设置加盐的cookie
ret.set_signed_cookie(key,value,salt='盐')
1.在cookie中设置加盐,就和不设置的一样
2.设置后的结果就是value:随机字符串,这里面的value就是设置cookie中的value,所以并不安全
3.其余的参数:
max_age=时间 设置cookie的超时时间 expires=时间 设置IE浏览器的超时时间 path='/' cookie生效路径,/表示根路径, domain=域名 设置生效的二级域名 secure=False 是否支持https传输 httponly=False 是否只支持http协议传输
1.2 获取cookie值
1.2.1 获取普通cookie值:
request.COOKIES['key']
1.2.2 获取加盐的cookie值:
request.get_signed_cookie('key')
1.2.3 删除cookie
删除cooki相当于在页面中退出当前登录的状态,那么就可以直接写成一个函数,例如
def logout(request): ret = redirect('/login/') # 先返回登录页面 ret.delete_cookie('id_login') # 再删除cookie return ret
2. Session
cookie虽然在一定程度上解决了'保持状态'的需求,但由于cookie本身只支持4096个字节,以及cookie本身保存在client端,很可能被拦截或窃取,因此就诞生了
一种新的东西,比cookie更安全,支持字节跟多,并且是保存在服务器端,不容易被窃取到,那这就是session。
session是基于cookie而存在的
2.1 设置session两种方法
request.session.setdefult(key,value) # 如果值存在则不设置 request.session['key'] = value
2.2 获取session两种方法
request.session.get(key) request.session['key']
2.3 删除session
del request.session['key'] # 只删除指定的一条session
2.4 删除当前会话的所有session数据
request.session.delete()
2.5 删除当前会话数据并清除浏览器上的cookie
request.session.flush()
2.6 删除所有失效日期小于当前日期的数据
request.session.clear_expired()
2.7 设置session的超时时间
request.session.set_expiry(value)
1、value是整数的话,那么session会在这些秒之后失效 2、value是datatime或timedelta,session会在这个时间后失效 3、value是0的话,那么关闭浏览器后session就会失效 4、value是None的话,session会依赖全局session失效错略
2.8 由于session用的request对象,所以在写退出登录的函数时,会有不同,session的写法:
def logout(request) ret = redirect('/login/') # 先返回到登录界面 request.session.flush() # 清空所有session数据 return ret
2.9 Django中session的相关设置
2.9.1 数据库Session
SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 引擎(默认)
2.9.2 缓存Session
SESSION_ENGINE = 'django.contrib.sessions.backends.cache' # 引擎 SESSION_CACHE_ALIAS = 'default' # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置
2.9.3 文件Session
SESSION_ENGINE = 'django.contrib.sessions.backends.file' # 引擎 SESSION_FILE_PATH = None # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir()
2.9.4 缓存+数据库
SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db' # 引擎
2.9.5 加密Cookie Session
SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies' # 引擎
2.9.6 其他公用设置项:
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,默认修改之后才保存(默认)
3. 基于cookie
1 from functools import wraps # 装饰器修复 2 def check_login(func): 3 @wraps(func) 4 def inner(request,*args,**kwargs): 5 # ret = request.COOKIES.get('is_login') # 获取普通cookie 6 ret = request.get_signed_cookie('is_login') # 获取加盐cookie 7 if ret == '1': 8 return func(request,*args,**kwargs) 9 else: 10 return_url = request.path_info 11 if return_url: 12 return redirect('/login_and_register/?return_url=%s' %(return_url)) 13 return inner
在需要访问的页面上加上装饰器
1 def login(request): 2 if request.method == "POST": 3 username = request.POST.get("username") 4 passwd = request.POST.get("password") 5 6 # 对用户名密码进行判断 7 if username == "xxx" and passwd == "dashabi": 8 9 # 获取没登录之前要访问的url 10 return_url = request.GET.get("return_url") 11 12 # 判断访问的url 13 if return_url and return_url != "/logout/": 14 response = redirect(return_url) 15 else: 16 response = redirect("/login/") 17 18 # 跳转成功后设置cookie 19 response.set_signed_cookie("is_login", "1", salt="SSS") # 设置加盐cookie 20 21 return response 22 return render(request, "login.html")
4. 基于session
1 from functools import wraps # 装饰器修复 2 def check_login(func): 3 @wraps(func) 4 def inner(request,*args,**kwargs): 5 ret = request.session.get('is_login') # 设置session 6 if ret == '1': 7 return func(request,*args,**kwargs) 8 else: 9 return_url = request.path_info 10 if return_url: 11 return redirect('/login_and_register/?return_url=%s' %(return_url)) 12 return inner
在需要访问的页面上加上装饰器
1 def login(request): 2 if request.method == "POST": 3 username = request.POST.get("username") 4 passwd = request.POST.get("password") 5 if username == "xxx" and passwd == "dashabi": 6 return_url = request.GET.get("return_url") 7 if return_url and return_url != "/logout/": 8 response = redirect(return_url) 9 else: 10 response = redirect("/login/") 11 request.session.setdefault('is_login','1') 12 return response 13 return render(request, "login.html")