Django-website 程序案例系列-10 验证装饰器

FBV装饰器:

def auth(func):     #装饰器函数
    def inner(request, *args, **kwargs):
        v = request.COOKIES.get(‘username‘)
        if not v:
            return redirect(‘/log/‘)
        return func(request, *args, **kwargs)
    return inner

  

使用方法:

在函数上加上@auth

CBV装饰器:

第一种方式:利用django自带的工具

def auth(func):         #装饰器函数  对cookie进行认证
    def inner(request, *args, **kwargs):
        v = request.COOKIES.get(‘username‘)
        if not v:
            return redirect(‘/log/‘)
        return func(request, *args, **kwargs)
    return inner

from django import views
from django.utils.decorators import method_decorator  #导入django自带的工具
class Auth(views.View):

    @method_decorator(auth)  #利用django自带工具 导入认证函数装饰器进行认证,灵活的放在任意需要认证的函数下面
    def get(self, request):
        v = request.COOKIES.get(‘username‘)
        return render(request, ‘user_list.html‘, {‘current_user‘: v})

    def post(self, request):
        v = request.COOKIES.get(‘username‘)
        return render(request, ‘user_list.html‘, {‘current_user‘: v})

  

第二种方式:

from django import views
from django.utils.decorators import method_decorator
class Auth(views.View):

    @method_decorator(auth)     #将装饰器放在父类方法上 这样该类下所有方法都被装饰上了装饰器,不用一一在写在函数上面
    def dispatch(self, request, *args, **kwargs):
        return super(Auth, self).dispatch(self, request, *args, **kwargs)

    def get(self, request):
        v = request.COOKIES.get(‘username‘)
        return render(request, ‘user_list.html‘, {‘current_user‘: v})

    def post(self, request):
        v = request.COOKIES.get(‘username‘)
        return render(request, ‘user_list.html‘, {‘current_user‘: v})

  

第三种方式:

from django import views
from django.utils.decorators import method_decorator

@method_decorator(auth, name=‘dispatch‘)  #将装饰器直接装饰在类上面,在用name指定装饰在父类的diapatch方法上,这样也就实现了类里面所有方法的装饰效果
class Auth(views.View):

    def get(self, request):
        v = request.COOKIES.get(‘username‘)
        return render(request, ‘user_list.html‘, {‘current_user‘: v})

    def post(self, request):
        v = request.COOKIES.get(‘username‘)
        return render(request, ‘user_list.html‘, {‘current_user‘: v})

  

时间: 2024-11-08 12:26:38

Django-website 程序案例系列-10 验证装饰器的相关文章

django的auth认证,is_authenticate 和装饰器的2个方法,注销的功能,

在django中创建表,会自动创建一些django自带的表,先了解用户认证, 认证登录  先要引用  , from django.contrib import auth 有很多方法, 网站先有登录和认证, authenticate(),提供用户认证,验证用户名和密码是否正确,一般需要username ,password两个关键字参数, 认证信息有效,返回有一个User对象.authrenticate()会在User对象上设置一个属性标识,认证了该用户, 创建一个Book表,然后生成数据库 fro

基于Django-Cookie的CBV和FBV的用户验证装饰器

FBV模式 def cookie(func):       def deco(request,*args,**kwargs):             u = request.get_signed_cookie('username', salt='user', default=None)           if not u:               return render(request,'login.html')           return func(request,*args

Python编程系列---Python中装饰器的几种形式及万能装饰器

根据函数是否传参  是否有返回值 ,可以分析出装饰器的四种形式: 形式一:无参无返回值 1 def outer(func): 2 def wrapper(): 3 print("装饰器功能1") 4 ret = func() 5 print("装饰器功能2") return ret 6 return wrapper 7 8 # 定义一个无参无返回值的函数 9 @outer 10 def main_func(): 11 print("hello")

python学习系列之python装饰器基础(2)---装饰含返回值的函数

在上篇基础(1)中,我写了一个装饰器及使用方法,但是如果遇到一个函数带返回值的话,就不好使了,因此重写一个装饰器如下: #basic2.py #coding:utf-8 def auth(func):     def inner(*arg, **kwargs):         print 'before'         temp = func(*arg,**kwargs) #这行是关键,func相当于fetch_server_list         print 'after'       

python学习系列之python装饰器基础(1)

创建装饰器 # basic.py #首先定义一个装饰器auth: #一般装饰器 def auth(func):     def inner():         print 'before'         func()         print 'after'     return inner #带1个参数的装饰器 def auth_arg(func):     def inner(arg):         print 'before'         func(arg)         

python学习系列之python装饰器基础(5)---多装饰器的使用

有些时候,可能实际工作中需要同时使用多个装饰器,具体怎么用,见代码: #basic5.py def auth1(func):     def inner():         print 'before 1'         func()         print 'after 1'     return inner def auth2(func):     def inner():         print 'before 2'         func()         print '

python学习系列之python装饰器基础(6)---装饰器加参数

一.常规的装饰器,比如 @auth,执行2步操作: 1.执行auth函数,并传参func进来 2.获取返回值,并赋值给被装饰器的函数的函数名(如让fetch_server_list等于返回值) 二.而带参数的装饰器,比如 @auth(before,after),则执行3步操作: 1.执行auth(before,after)这个函数,得到返回值ret(假设返回值为ret) 2.创建装饰器,获取返回值,拼接为@ret 3.相当于@auth函数的2个步骤: 1)执行ret函数 2)将ret函数的返回值

Python学习:10.Python装饰器讲解(一)

情景介绍 一天,在你正在努力加班的时候,老板给交给你了一个任务,就是在这段代码里将所有函数开始输出一个'hello'最后输出当前时间,再输出一个"end",这段代码里包含了大量的函数,你会怎么做? def f1(): print('proces a') def f2(): print('proces b') def f3(): print('proces c') def f4(): print('proces d') ... ... 刚拿到这个任务,我们可能想着这样做,在每个函数中添加

Django-website 程序案例系列-16 modle.form(表单验证)

案例程序: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="/fm/" method="POST"> #3个输入框分别是user/pwd/ema