Django--cookie&session

一、基础

cookie保存在浏览器本地,格式:iii="8jblpb9g2l5c9xvofhv5pt8c0v967z5t"

session保存在服务器端。格式:{"cookie值":{"isLogin":True,"username":"xxx"},cookie:{}}

二、流程

  1. 服务器生成一段字符串
  2. 把字符串发送给客户端浏览器,同时将字符串当做key放置session信息
  3. 在用户的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 views
urlpatterns = [
    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 views
urlpatterns = [
    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 views
urlpatterns = [
    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



















原文地址:https://www.cnblogs.com/daliangtou/p/5284448.html