• 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



















  • 相关阅读:
    while循环学习之统计流量
    MySQL的启动脚本
    UVA 725 Division
    UVA 712 S-tree
    UVA 514
    字典树
    UVA 1595 multimap 的应用
    C++ map 和 multimap
    浮点数
    UVA 227
  • 原文地址:https://www.cnblogs.com/daliangtou/p/5284448.html
Copyright © 2020-2023  润新知