Django框架学习笔记(21.Session实例)
基于Cookie做用户验证时:不适合把敏感信息(如密码)放在Cookie中,因为可以Cookie是可以看见的。
Cookie优势:减轻了服务端的压力
接下来介绍Session:
Cookie是保存在用户浏览器端的键值对
Session是保存在服务器端的键值对,不过它还得依赖于Cookie
Session原理是生成随机字符串,对应一个放入数据的字典,Cookie传递这个随机字符串进行验证。
在Django中,简化了这个复杂的过程。
注意在用session使用之前要:makemigrations,migrate,因为Django的session默认保存在数据库中
实例:创建配置完成后:
urls.py:
urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^login/$', views.login), url(r'^index/$', views.index), url(r'^logout/$', views.logout), ]
view.py:
from django.shortcuts import render, redirect, HttpResponse # Create your views here. def login(request): if request.method == "GET": return render(request, 'login.html') elif request.method == "POST": user = request.POST.get('user') pwd = request.POST.get('pwd') if user == "root" and pwd == "123": # 生成随机字符串 # 写入用户浏览器Cookie # 保存到Session中 # 在随机字符串对应的字典中设置相关内容 request.session['username'] = user request.session['is_login'] = True if request.POST.get('rmb', None) == '1': request.session.set_expiry(60*60*24) #设置超时时间,默认的是两周 return redirect('/index/') else: return render(request, 'login.html') def index(request): if request.session.get('is_login', None): return render(request, 'index.html', {'username': request.session['username']}) else: return HttpResponse('错误') def logout(request): request.session.clear() return redirect('/login/')
login.html:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="/login/" method="POST"> <input type="text" name="user"/> <input type="password" name="pwd"/> <input type="checkbox" name="rmb" value="1"/>一天内免登录 <input type="submit" value="登录"/> </form> </body> </html>
index.html:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>欢迎{{ username }}登录:{{ request.session.username }}</h1> <a href="/logout/">注销</a> </body> </html>
效果:
在settings.py里面还有很多有关session的配置:
SESSION_COOKIE_AGE = 1209600 #session的cookie失效日期,默认两周 SESSION_EXPIRE_AT_BROWSER_CLOSE = False #是否关闭浏览器使SESSION过期 SESSION_SAVE_EVERY_REQUEST = True #是否每次请求都保存session,默认False,这里一般要改成True
设置session存放在哪里:
#SESSION_ENGINE = 'django.contrib.sessions.backends.db' #设置保存在数据库 SESSION_ENGINE = 'django.contrib.sessions.backends.cache' SESSION_CACHE_ALIAS = 'default' CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', 'LOCATION': [ '172.19.26.240:11211', '172.19.26.242.11211', ] } } #设置在缓存