17-3 cookie和session

Posted huningfei

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了17-3 cookie和session相关的知识,希望对你有一定的参考价值。

一 . Cookie
1.cookie 是什么?
  保存在浏览器端的键值对!
  服务端在返回响应的时候,告诉浏览器保存的键值对!浏览器可以拒绝保存Cookie.

2. 为什么要有cookie?
  HTTP请求是无状态的,我们需要保存状态 --> cookie

3. Django中cookie的使用
  1. 设置cookie
  rep = HttpResponse("ok")
  rep.set_cookie("key", "value", max_age=xx秒)
  rep.set_signed_cookie("key", "value", salt="ooxx", max_age=xx秒)
  2. 获取cookie
  request.COOKIES.get("key")
  request.get_signed_cookie("key", default="", salt="ooxx")

  参数:

  • default: 默认值
  • salt: 加密盐
  • max_age: 后台控制过期时间


4. cookie有失效时间
  1. Django中不设置,关闭浏览器就失效了
  2. 通过max_age设置超时时间

5. 补充3点:
1. 如何登陆后再跳转回之前访问的页面 

  写个登录函数:例子

 1 def login(request):
 2     if request.method == "POST":
 3         path = request.GET.get("path")
 4         print(path)
 5         username = request.POST.get("username")
 6         pwd = request.POST.get("pwd")
 7         if username == "alex" and pwd == "123":
 8             if path:
 9                 rep = redirect(path)
10             else:
11                 rep = redirect("/publisher_list/")
12             rep.set_signed_cookie("hu", "hao", salt="ooxx", max_age=7)
13             return rep
14         else:
15             return HttpResponse("用户名或者密码错误")
16     else:
17 
18         return render(request, "login.html")

写个装饰器

from functools import wraps


# 装饰器版本登录认证
def login_check(func):
    @wraps(func)
    def inner(request, *args, **kwargs):
        path = request.path_info
        # 登录验证
        v = request.get_signed_cookie("hu", default="", salt="ooxx")  # 获取加盐的cookie
        if v == "hao":
            return func(request, *args, **kwargs)
        else:
            return redirect("/login/?path={}".format(path))

    return inner

你想要访问那个页面,把装饰器加到它的上面

@login_check
def book_list(request):
    data = models.Book.objects.all()
    return render(request, "book_list.html", {"book_list": data})

最后访问,book_list这个页面,会让你先登录,并且在url后面拼接一个目录

http://127.0.0.1:8001/login/?path=/book_list/,然后登陆成功,跳转到book_list

注意:login.html文件里面的action一定要写空,否则不能跳转,或者写成{{request.get_path_info}}

 


2. 如何将FBV的装饰器应用到CBV上?

在views里面导入

from django.utils.decorators import method_decorator

就是

 @method_decorator(login_check) 括号里面是你写的装饰器函数

例子:

class AddBook(views.View):

    @method_decorator(login_check)  # login_check是刚才写的装饰器函数
    def get(self, request):
        data = models.Publisher.objects.all()
        return render(request, "add_book.html", {"publisher_list": data})

    def post(self, request):
        book_name = request.POST.get("title")
        publisher_id = request.POST.get("publisher")
        publisher_obj = models.Publisher.objects.get(id=publisher_id)
        # 创建书籍
        models.Book.objects.create(
            title=book_name,
            publisher_id=publisher_id
            # publisher=publisher_obj
        )
        return redirect("/book_list/")

 


3. 装饰器修复技术 --> from functools import wraps

在inner函数的上面加上@wraps(func),默认不加是不影响使用的,只是被装饰的函数名字和注释信息都不能查看了

例子:

from functools import wraps


def wrapper(func):
    @wraps(func)  # 借助内置的工具修复被装饰的函数
    def inner(*args, **kwargs):
        print("呵呵")
        func(*args, **kwargs)
    return inner


@wrapper
def foo(arg):
    """
    这是一个测试装饰器的函数
    :param arg: int 必须是int类型
    :return: None
    """
    print("嘿嘿嘿" * arg)


foo(10)
print(foo.__doc__)

 






















以上是关于17-3 cookie和session的主要内容,如果未能解决你的问题,请参考以下文章

cookie和session的代码实现

少部分手机浏览器对于COOKIE支持不够导致服务端无法读取session的解决方案

Cookie和Session的工作流程及区别(附代码案例)

cookie和session

cookie和session

cookie和session