- 使用cbv实现视图
- CBV结合装饰器
- CSRF Token
-
使用cbv实现视图
from django.views import View from django.utils.decorators import method_decorator class LoginView(View): def get(self, request): return render(request, "login.html") def post(self, request): user = request.POST.get("name") pwd = request.POST.get("pwd") if user == "safly" and pwd == "123": # 登陆成功 # 写session request.session["user2"] = user request.session.set_expiry(5) return redirect("/index/") def index(request): return render(request,"index.html")
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
CBV结合装饰器
直接加在视图类上,但method_decorator必须传 name 关键字参数
from django.views import View from django.utils.decorators import method_decorator def wrapper(func): @wraps(func) def inner(request, *args, **kwargs): # 登录校验 cookie_k = request.session.get("user01", None) if cookie_k: # 表示已经登录的用户 ret = func(request, *args, **kwargs) return ret else: # 滚去登录 return redirect("/login/") return inner class LoginView(View): def get(self, request): return render(request, "login.html") def post(self, request): user = request.POST.get("name") pwd = request.POST.get("pwd") if user == "safly" and pwd == "123": # 登陆成功 # 写session request.session["user01"] = user # request.session.set_expiry(5) return redirect("/index/") @method_decorator(wrapper, name="get") class IndexView(View): def get(self, request): user = request.session.get("user01", "游客") return render(request, "index.html", {"user": user})
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
* 加在CBV视图的get或post方法上*
# @method_decorator(wrapper, name="get") class IndexView(View): @method_decorator(wrapper) def get(self, request): user = request.session.get("user02", "游客") return render(request, "index.html", {"user": user})
- 1
- 2
- 3
- 4
- 5
- 6
- 7
* 加在dispatch方法上*
# @method_decorator(wrapper, name="get") class IndexView(View): ## 这么写所有的请求方法都要做登录校验 @method_decorator(wrapper) def dispatch(self, request, *args, **kwargs): return super(IndexView,self).dispatch(request,*args,**kwargs) # @method_decorator(wrapper) def get(self, request): user = request.session.get("user04", "游客") return render(request, "index.html", {"user": user})
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
CSRF Token
CSRF Token相关装饰器在CBV只能加到dispatch方法上
备注:
csrf_protect,为当前函数强制设置防跨站请求伪造功能,即便settings中没有设置全局中间件。 csrf_exempt,取消当前函数防跨站请求伪造功能,即便settings中设置了全局中间件
- 1
- 2
from django.views.decorators.csrf import csrf_exempt, csrf_protect class HomeView(View): @method_decorator(csrf_exempt) def dispatch(self, request, *args, **kwargs): return super(HomeView, self).dispatch(request, *args, **kwargs) def get(self, request): return render(request, "home.html") def post(self, request): print("Home View POST method...") return redirect("/index/")
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
django-视图CBV模式、CBV结合装饰器、csrf

最新推荐文章于 2023-11-24 21:33:16 发布
