Django day14(一) cookie

一: Cookie
  1.  Cookie是什么?存储在客户端浏览器上的键值对
  2. 原理: 是服务器产生,发给客户端浏览器,浏览器保存起来,下次发请求,会携带这个键值对到服务器

  4. Cookie的覆盖: 先写了一个键值对,后来再写,会把原来的值覆盖掉

  5. cookie使用(**********************)
     1) 写cookie:在Httpresponse这个对象上写  obj.set_cookie(key,value)
     2) 取cookie:从request对象中取,取出来是个字典request.COOKIES
     3) 删除cookie: obj.delete_cookie('name')

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    # url(r'^login/', views.login),
    # url(r'^order/', views.order),
    url(r'^shopping/', views.shopping),
    url(r'^salt_cookie/', views.salt_cookie),  # 盐饼干
    url(r'^get_cookie/', views.get_cookie),  # 获取饼干
    url(r'^delete_cookie/', views.delete_cookie),  # 删除饼干

]

  6. cookie的其他属性
     -加盐cooke

# set_signed_cookie 本质是set_cookie,只不过是在set_cookie的基础上又做了一个处理
    # 必须加一个参数salt,这就是加盐,他保证了数据的安全
    object.set_signed_cookie('name', 'lqz', salt='123')

     -超时时间max_age,传一个秒的时间 

# 10秒之后失效 (60*60*24*3)三天失效
 object.set_cookie('name', 'prince', max_age=10)
  -超时时间expires,传一个datatime对象
  -path='/',可以设置路径,设置路径之后,path='/index/',只有访问index的时候,才会携带cookie过来
  -domain 设置域名下有效domain='map.baidu.com'
  -secure=False, (默认是false,设置成True浏览器将通过HTTPS来回传cookie)
  -httponly=True 只能https协议传输,无法被JavaScript获取(不是绝对,底层抓包可以获取到也可以被覆盖)

关于 next 登录认证的新写法:

# 旧的login
def login(request):
    if request.method == 'GET':
        return render(request, 'login.html')
    else:
        name = request.POST('name')
        pwd = request.POST('pwd')
        if name == 'zzd' and pwd == '123':
            obj = HttpResponse('登陆成功')
            obj.set_cookie('is_login', True)
            return obj


def order(request):
    is_login = request.COOKIES.get('is_login')
    if is_login:
        return HttpResponse('我是订单页面,要先登录才能看我')
    else:
        return redirect('/login/')
#
#
def shopping(request):
    is_login = request.COOKIES.get('is_login')
    if is_login:
        return HttpResponse('我是购物车,得登录才能看我')
    else:
        return redirect('/login/')
旧的
# 新版login

# 登录认证装饰器
def login_auth(func):
    def inner(request, *args, **kwargs):
        url = request.get_full_path()
        is_login = request.COOKIES.get('is_login')
        if is_login:
            res = func(request, *args, **kwargs)
            return res
        else:
            return redirect('/login/?next=%s' % url)

    return inner



def login(request):
    if request.method == 'GET':
        return render(request, 'login.html')
    else:
        next = request.GET.get('next')
        name = request.POST.get('name')
        pwd = request.POST.get('pwd')
        if name == 'zzd' and pwd == '123':

            if next:
                obj = redirect(next)
            else:
                obj = redirect('/shopping/')

            obj.set_cookie('is_login', True)
            return obj
        else:
            return HttpResponse('用户名或密码错误')



@login_auth
def order(request):
    return HttpResponse('我是订单页面,我得登录才能看')


@login_auth
def shopping(request):
    return HttpResponse('我是购物车,得登录才能看我')
新的

 关于next新写法的意思:

比如我现在需要进入订单页面, 但是需要登录, 这个时候 next 从定向就会帮你跳转到登录界面, 在你输入完正确的用户名和密码之后又帮你重新跳转回订单页面, 所以这就是取出订单页面的地址, 一旦登录成功, 从定向回到原来要访问的地址

原文地址:https://www.cnblogs.com/zedong/p/10001516.html