一、使用Django自带的decorator

通常情况,使用 函数定义的view,可以直接使用 login_required 直接装饰

@login_required
def index(request):
if request.method == "GET":
return render(request, "index.htm") def user_login(request):
if request.method == "GET":
return render(request, "login.html")
if request.method == "POST":
username = request.POST.get("username", "")
password = request.POST.get("password", "")
user_obj = authenticate(username=username, password=password)
if user_obj:
login(request, user_obj)
return redirect(request.GET.get("nex", "/"))
else:
return render(request, "login.html") def user_logout(request):
logout(request)
return render(request, "login.html")

这里需要注意的是: login_required默认会重定向到 /account/login url, 因此我们可以在Settings.py中修改这个默认的重定向url;

LOGIN_URL = "/login.html"

但是如果使用类定义的view,是不能够直接使用 login_required进行装饰的

需要重新定义一个 LoginRequired类,让视图类去继承:

from django.contrib.auth.decorators import login_required
from django.utils.decorators import method_decorator class LoginRequiredMixin(object):
@method_decorator(login_required(login_url="/login/"))
def dispatch(self, request, *args, **kwargs):
return super(LoginRequiredMixin, self).dispatch(request, *args, **kwargs)

class xxxView(LoginRequired, View)

pass

二、自己写一个认证decorator

函数装饰器

# 认证装饰器
class AuthDecorator(object):
@method_decorator(login_required(login_url="/login/"))
def dispatch(self, request, *args, **kwargs):
return super(AuthDecorator, self).dispatch(request, *args, **kwargs) def has_auth(func):
def auth(request, *args, **kwargs):
if not request.session.get("username"):
return redirect(reverse("login"))
return func(request, *args, **kwargs)
return auth @has_auth
def index(request):
user = request.session.get("username")
business_obj = Business.objects.all()
user_obj = User.objects.all()
hosts = Host.objects.filter(user__username=user)
return render(request, "index.html", {
"hosts": hosts,
"business_obj": business_obj,
"user_obj": user_obj
})

类装饰器

# 认证装饰器
class Auth(View):
def dispatch(self, request, *args, **kwargs):
user_obj = UserInfo.objects.filter(username=request.session.get("username")).first()
if not user_obj:
return redirect(reverse("login"))
return super(Auth, self).dispatch(request, *args, **kwargs) # 主页视图
class IndexView(Auth):
def get(self, request):
user = request.session.get("username")
business_obj = Business.objects.all()
user_obj = UserInfo.objects.all()
hosts = Host.objects.filter(user__username=user)
return render(request, "index.html", {
"hosts": hosts,
"business_obj": business_obj,
"user_obj": user_obj
})

博客搬运地址

  1. Django 认证装饰器

Django - CBV装饰器实现用户登录验证的更多相关文章

  1. python装饰器 & flask 通过装饰器 实现 单点登录验证

    首先介绍装饰器,以下是一段标注了特殊输出的代码.用于帮助理解装饰器的调用过程. import time def Decorator_one(arg1): info = "\033[1;31; ...

  2. django CBV装饰器 自定义django中间件 csrf跨站请求伪造 auth认证模块

    CBV加装饰器 第一种 @method_decorator(装饰器) 加在get上 第二种 @method_decorator(login_auth,name='get') 加在类上 第三种 @met ...

  3. Django CBV装饰器 中间件 auth模块 CSRF跨站请求

    CBV添加装饰器 给CBV添加装饰器有三种方法,三种方法都需要导入模块: from django.utils.decorators import method_decorator 第一种直接在方法上面 ...

  4. 抽屉之Tornado实战(9)--装饰器实现用户登录状态验证

    当然今天讲的验证,不只Tornado会用,以后用到web框架都会用到,最常见的场景就是只有用户登陆了才能执行某些操作,所以在执行这些操作前要先做登陆状态的验证. 比如:点赞,发布,评论等需要验证,都需 ...

  5. Django基础七之CBV装饰器和中间件

    Django基础七之CBV装饰器和中间件 目录 Django基础七之CBV装饰器和中间件 1. CBV加装饰器 2. Django中间件 2.1 Django中间件介绍 2.2 自定义中间件 2.2. ...

  6. python练习笔记——编写一个装饰器,模拟登录的简单验证

    编写一个装饰器,模拟登录的简单验证(至验证用户名和密码是否正确) 如果用户名为 root 密码为 123则正确,否则不正确.如果验证不通过则不执行被修饰函数 #编写一个装饰器,模拟登录的简单验证 #只 ...

  7. 如何使用Django实现用户登录验证

    最初开始搞用户登录验证的时候感觉没什么难的,不就是增删改查中的查询数据库么,但是还是遇到许多小问题,而且感觉在查询数据库的时候,要把前端的数据一条一条的进行比对,会导致我的代码很丑,而且方式很不智,所 ...

  8. django之基于cookie和装饰器实现用户认证

    示例1 # Create your views here. user = "a" pwd = "a" def login(request): if reques ...

  9. django 从零开始 8 用户登录验证 待测

    看文档 djang 自带一个用户登录验证的方法,不过有些看着懵逼,去网上找了一圈,发现很多都是照抄文档说明的,几乎没说啥原理 特别是 from django.contrib.auth import a ...

随机推荐

  1. libevent reference Mannual II--library

    FYI: http://www.wangafu.net/~nickm/libevent-book/TOC.html The Libevent Reference Manual: Preliminari ...

  2. 如何用纯 CSS 创作一个按钮文字滑动特效

    效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. 在线预览 https://codepen.io/zhang-ou/pen/GdpPLE 可交互视频教 ...

  3. Extract local angle of attack on wind turbine blades

    Extract local angle of attack on wind turbine blades Table of Contents 1. Extract local angle of att ...

  4. at24c02系列和at24c256系列的比较

    编号的含义: at24c02系列包括的有: 128(1K),256(2K),512(4K),1024(8K),2048(16K)字节(B) at24c256系列包括的有: 16384(128K),32 ...

  5. 【Codeforces 924C】Riverside Curio

    [链接] 我是链接,点我呀:) [题意] 题意 [题解] 设第i天总共的线数为t[i] 水平线上线数为m[i]是固定的 水平线下的线数设为d[i] 则d[i]+m[i]+1=t[i] 也就是说问题可以 ...

  6. JavaSE 学习笔记之Jdk5.0新特性(十九)

    Jdk5.0新特性: Collection在jdk1.5以后,有了一个父接口Iterable,这个接口的出现的将iterator方法进行抽取,提高了扩展性. --------------------- ...

  7. 统计单词个数(codevs 1040)

    题目描述 Description 给出一个长度不超过200的由小写英文字母组成的字母串(约定;该字串以每行20个字母的方式输入,且保证每行一定为20个).要求将此字母串分成k份(1<k<= ...

  8. [bzoj1572][Usaco2009 Open]工作安排Job_贪心_堆

    工作安排 Job bzoj-1572 Usaco-2009 Open 题目大意:题目链接. 注释:略. 想法: 我们将任务按照截止时间排序,枚举任务的同时顺便记录出已经做了多少任务(当前时间). 对于 ...

  9. Clojure: 寻找项目依赖项目

    Clojure寻找项目依赖项目: lein deps :tree

  10. Manthan, Codefest 16 F

    寻找树上最大权值和的两条不相交的路径. 树形DP题.挺难的,对于我…… 定义三个变量ma[MAXN], t[MAXN], sum[MAXN] 其中,ma[i]代表i子树中,最长的路径和 t[i]代表i ...