Django--cookie&session
一、基础
cookie保存在浏览器本地,格式:iii="8jblpb9g2l5c9xvofhv5pt8c0v967z5t"
session保存在服务器端。格式:{"cookie值":{"isLogin":True,"username":"xxx"},cookie:{}}
二、流程
- 服务器生成一段字符串
- 把字符串发送给客户端浏览器,同时将字符串当做key放置session信息
- 在用户的session对应的value(字典)里设置任意值
三、错误解决
报错:no such table: django_session

原因:
Django的session是放在数据库里,要先初始化表。
解决:
项目目录路径> python manage.py migrate
四、实例
1、需求
订单页面未登录不能访问,直接跳转到登录页面。
2、登录页面
app01/views.py
1 2 3 4 5 6 7 8 | def login(request): if request.method=='POST': username=request.POST.get('username') pwd= request.POST.get('pwd') if username == 'user1' and pwd == '123': request.session['is_login'] = True return redirect('/order/') return render(request,'login.html') |
urls.py
1 2 3 4 5 | from app01 import viewsurlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^login/$', views.login),] |
templates/login.html
1 2 3 4 5 6 7 | <body> <form action="/login/" method="post"> <input type="text" name="username"> <input type="password" name="pwd"> <input type="submit" value="submit"> </form></body> |
4、订单页面
app01/views.py
1 2 3 4 5 6 | def order(request): is_login = request.session.get('is_login',False) #False是默认值,不设置会报错 if is_login: return HttpResponse('order') else: return redirect('/login/') |
urls.py
1 2 3 4 5 6 | from app01 import viewsurlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^order/$', views.order), url(r'^login/$', views.login),] |
5、浏览器
6、数据库

7、扩展:订单页面右上角显示登录用户
还可以定义其它值,如username,登录成功的时候就设置上,然后页面可以根据不同的用户显示不同的数据。
views.py
1 2 3 4 5 6 7 8 9 | def login(request): if request.method=='POST': username=request.POST.get('username') pwd= request.POST.get('pwd') if username == 'user1' and pwd == '123': request.session['is_login'] = True request.session['username'] = 'user1' return redirect('/order/') return render(request,'login.html') |
views.py
1 2 3 4 5 6 7 | def order(request): is_login = request.session.get('is_login',False) #False是默认值,不设置会报错 if is_login: username = request.session.get('username',False) return render(request,'order.html',{'username':username}) else: return redirect('/login/') |
oreder.html
1 2 3 | <body>{{username}}</body> |
8、注销
order.html
1 2 3 4 | <body>{{ username }}<a href="/logout/">注销</a> #加入注销跳转到logout函数处理</body> |
urls.py
1 2 3 4 5 6 7 8 | from app01 import viewsurlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^$', views.index), url(r'^order/$', views.order), url(r'^login/$', views.login), url(r'^logout/$', views.logout), #加一个logout] |
views.py
1 2 3 | def logout(request): del request.session['is_login'] return redirect('/login/') |
五、cookie超时时间
settings.py
1 | SESSION_COOKIE_AGE = 5 #单位:秒 |
session也有
1 2 3 4 5 | request.session.set_expiry(value)* 如果value是个整数,session会在些秒数后失效。* 如果value是个datatime或timedelta,session就会在这个时间后失效。* 如果value是0,用户关闭浏览器session就会失效。* 如果value是None,session会依赖全局session失效策略。 |
更多
https://docs.djangoproject.com/en/1.9/topics/http/sessions/
http://docs.30c.org/djangobook2/chapter14/
https://docs.djangoproject.com/en/1.9/ref/settings/#settings-sessions


浙公网安备 33010602011771号