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的主要内容,如果未能解决你的问题,请参考以下文章