博客信息

Python Django 视图层(cookie、三天免登陆)

发布时间:『 2019-08-17 07:55』  博客类别:Python  阅读(773)

Cookie基础

 

相关代码

from django.conf.urls import url, include
from django.contrib import admin

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^cookie/', include('cookie.urls')),
]


urlpatterns = [
    url(r'^test1/', views.test1_view),
]


# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.http import HttpResponse
from django.shortcuts import render
import datetime

# Create your views here.
def test1_view(request):
    response = HttpResponse()
    # 三天有效时间
    # response.set_cookie("uname", "zhangsan", expires=datetime.date.today()+datetime.timedelta(days=3), path='/')
    # cookie被所有页面共享
    # response.set_cookie("uname", "zhangsan", max_age=3*24*60*60, path='/')
    # cookie仅仅被登录界面所用
    response.set_cookie("uname", "zhangsan", max_age=3 * 24 * 60 * 60, path='/cookie/login/')
    return response


小李飞刀_Python


小李飞刀_Python


小李飞刀_Python


上面三张图证明了,当设置path='/'时,cookie会被所有页面所共享,这个不是我们想要的,一般cookie只要被特定的页面所使用就好;

 

 

当修改代码path='/cookie/login/'之后,我们再来做测试,测试结果如下:

 

先执行一下它,用来设置cookie(操作之前请清除浏览器缓存

http://127.0.0.1:8000/cookie/test1/

再来执行一个任意的请求URL

http://127.0.0.1:8000/cookie/sdfsdf/


小李飞刀_Python

再来请求指定的URL

http://127.0.0.1:8000/cookie/login/


小李飞刀_Python


接下来我们来操作cookie,给http://127.0.0.1:8000/cookie/login/定义一个视图

urlpatterns = [
    url(r'^test1/', views.test1_view),
    url(r'^test2/', views.test2_view),
    url(r'^login/', views.login_view),
]


# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.http import HttpResponse
from django.shortcuts import render
import datetime

# Create your views here.
def test1_view(request):
    response = HttpResponse()
    # 三天有效时间
    # response.set_cookie("uname", "zhangsan", expires=datetime.date.today()+datetime.timedelta(days=3), path='/')
    # cookie被所有页面共享
    # response.set_cookie("uname", "zhangsan", max_age=3*24*60*60, path='/')
    # cookie仅仅被登录界面所用
    response.set_cookie("uname", "zhangsan", max_age=3 * 24 * 60 * 60, path='/cookie/login/')
    return response

# 加盐的方式设置cookie
def test2_view(request):
    response = HttpResponse()
    response.set_signed_cookie("uname", "zhangsan", max_age=3 * 24 * 60 * 60, path='/cookie/login/',salt='javaxl')
    return response

# 操作cookie(如果该cookie不存在报下列错误)
# KeyError at /cookie/login/
# u'uname'
def login_view(request):
    response = HttpResponse()
    # 获取cookie
    # 普通
    # u1 = request.COOKIES['uname']
    # u2 = request.COOKIES.get('uname', '')
    # print u1
    # print u2
    # 加盐
    u3 = request.get_signed_cookie('uname', salt='javaxl')
    print u3

    # 删除cookie
    response.delete_cookie('uname', path='/cookie/login/')

    return response


相关总结

#### 删除值

```
#设置过期
1. 默认情况关闭浏览器就失效
2. max_age=-1(单位秒)
3. expires=datetime.datetime.today()+datetime.timedelta(days=-2)(单位日期类型)
4. response.delete_cookie('uname',path='/cookie/login/')

```
#### 涉及属性
```
1、max_age=1 :cookie生效的时间,单位是秒

2、expires:具体过期日期  

3、path='/':指定那个url可以访问到cookie;'/'是所有 path='/'

4、domain=None(None代表当前域名):指定那个域名以及它下面的二级域名(子域名)可以访问这个cookie
   domain='.baidu.com'

```
```
#获取cookie
def abc_view(request):
    #返回所有cookie数据
    print request.COOKIES
    #返回KEY='uname'的数据
    print request.get_signed_cookie('uname',salt='javaxl')
    
    return HttpResponse('hello')

```

 

三天免登陆案例

 

子路由配置

urlpatterns = [
    url(r'^test1/', views.test1_view),
    url(r'^test2/', views.test2_view),
    url(r'^login/', views.login_view),
    url(r'^login_cookie/$', views.login_cookie_view),
]

 

视图处理方法

# 三天免登陆
def login_cookie_view(request):
    if request.method == 'GET':
        # 判断request中是否存在'login'对应cookie信息
        if request.COOKIES.has_key('login'):
            # 'zhangsan,123'
            login = request.COOKIES.get('login', '').split(',')
            sname = login[0]
            spwd = login[1]
            return render(request, 'login_cookie.html', {'sname': sname, 'spwd': spwd})

        return render(request, 'login_cookie.html')
    else:
        # 获取请求参数
        sname = request.POST.get('sname')
        spwd = request.POST.get('spwd')
        flag = request.POST.get('flag')

        response = HttpResponse()

        # 判断是否登录成功
        if sname == 'zhangsan' and spwd == '123':
            response.content = '登录成功!'
            # 判断是否需要记住密码
            if flag:
                # 将用户名和密码存放至cookie中('zhangsan,123')
                response.set_cookie('login', sname + ',' + spwd, max_age=3 * 24 * 60 * 60, path='/cookie/login_cookie/')
            else:
                # 当不需要记住密码时,需要删除cookie中‘login’对应的数据
                response.delete_cookie('login', path='/cookie/login_cookie/')
        else:
            # 当登录失败时,需要删除cookie中‘login’对应的数据
            response.delete_cookie('login', path='/cookie/login_cookie/')
            # 重定向
            response.status_code = 302
            response.setdefault('Location', '/cookie/login_cookie/')

        return response

 

页面

login_cookie.html 


测试方式

输入地址:http://127.0.0.1:8000/cookie/login_cookie/

默认是会记住密码的,第一次输入用户名密码,下次就不要输入了;

如果把复选框去掉,那么就不会记住用户名密码,下次登录还是要输入;

如果记住了用户名密码,下次改了用户名密码,登录失败,会将cookie删除,这是需要再次输入用户名密码信息;


over......


关键字:     Python       Django       cookie  

备案号:湘ICP备19000029号

Copyright © 2018-2019 javaxl晓码阁 版权所有