django CBV加装饰器

CBV(class base view)
基于session实现的装饰器:
登录了就给session设置值(生成随机序列),然后存入数据库,并将一串随机序列键值对返回给浏览器端,若未登录则跳转到登录页面。

def login_auth(func):
    @wraps(func)
    def inner(request,*args,**kwargs):
        if request.session.get('name'):
            return func(request,*args,**kwargs)
        return redirect('/login/')
    return inner

类视图装饰器:
主要有三种装饰位置:
from django.utils.decorators import method_decorator
method_decorator这是一个函数:将函数装饰器转换为方法装饰器
Converts a function decorator into a method decorator
有三种方式装饰类:

  • 第一种:就是装饰指定函数:
    @method_decorator(login_auth,name=“post”)

  • 第二种:就是装饰整个类中函数:
    @method_decorator(login_auth,name=“dispatch”)
    因为dispath是用于分发的,因此我们通过重写dispatch来控制分发,控制了dispatch就等于控制了所有的类中函数。

  • 第三种装饰的
    @method_decorator(login_auth)
    def dispatch(self, request, *args, **kwargs):
    super().dispatch(request, *args, **kwargs)
    dispatch源码

    def dispatch(self, request, *args, **kwargs):
              # Try to dispatch to the right method; if a method doesn't exist,
              # defer to the error handler. Also defer to the error handler if the
              # request method isn't on the approved list.
              if request.method.lower() in self.http_method_names:
                  handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
              else:
                  handler = self.http_method_not_allowed
              return handler(request, *args, **kwargs)
    

简单登录的跳转的代码

from django.shortcuts import render,HttpResponse,redirect,reverse

from functools import wraps
from django.utils.decorators import method_decorator

def login(request):
#登录判断用户名与密码是否正确
    if request.method == "POST":
        username = request.POST.get("username")
        pwd = request.POST.get("pwd")
        if username == 'jeason' and pwd == '123':
        #用户名密码正确了就给session赋值,然后session将生成密码序列存于数据库中,并转发给浏览器端,
            request.session['name'] = 'jeason'
            return redirect('/home/')
    return render(request,'login.html')

#登录装饰器,当你的session中有值说明你已经登录了,跳转到home,若是没有值则回到登录
def login_auth(func):
    @wraps(func)
    def inner(request,*args,**kwargs):
        if request.session.get('name'):
            return func(request,*args,**kwargs)
        return redirect('/login/')
    return inner

#类装饰器三种方式,装饰单个函数,与装饰dispatch,dispatch中执行的判断请求类型,
在View类中反射出View中的Post或者get等方法,然后执行函数。
from django.views import View
# @method_decorator(login_auth,name='post')
class MyHome(View):
    @method_decorator(login_auth)
    def dispatch(self, request, *args, **kwargs):
        super().dispatch(request, *args, **kwargs)

    # @method_decorator(login_auth)
    def get(self,request):
        return HttpResponse("get")

    def post(self,request):
        return HttpResponse("post")

urls.py中代码如下:

    url(r'^home/', views.MyHome.as_view()),
    url(r'^login/', views.login),

你可能感兴趣的:(python,django)