Django - CBV装饰器实现用户登录验证
一、使用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
})
博客搬运地址
Django - CBV装饰器实现用户登录验证的更多相关文章
- python装饰器 & flask 通过装饰器 实现 单点登录验证
首先介绍装饰器,以下是一段标注了特殊输出的代码.用于帮助理解装饰器的调用过程. import time def Decorator_one(arg1): info = "\033[1;31; ...
- django CBV装饰器 自定义django中间件 csrf跨站请求伪造 auth认证模块
CBV加装饰器 第一种 @method_decorator(装饰器) 加在get上 第二种 @method_decorator(login_auth,name='get') 加在类上 第三种 @met ...
- Django CBV装饰器 中间件 auth模块 CSRF跨站请求
CBV添加装饰器 给CBV添加装饰器有三种方法,三种方法都需要导入模块: from django.utils.decorators import method_decorator 第一种直接在方法上面 ...
- 抽屉之Tornado实战(9)--装饰器实现用户登录状态验证
当然今天讲的验证,不只Tornado会用,以后用到web框架都会用到,最常见的场景就是只有用户登陆了才能执行某些操作,所以在执行这些操作前要先做登陆状态的验证. 比如:点赞,发布,评论等需要验证,都需 ...
- Django基础七之CBV装饰器和中间件
Django基础七之CBV装饰器和中间件 目录 Django基础七之CBV装饰器和中间件 1. CBV加装饰器 2. Django中间件 2.1 Django中间件介绍 2.2 自定义中间件 2.2. ...
- python练习笔记——编写一个装饰器,模拟登录的简单验证
编写一个装饰器,模拟登录的简单验证(至验证用户名和密码是否正确) 如果用户名为 root 密码为 123则正确,否则不正确.如果验证不通过则不执行被修饰函数 #编写一个装饰器,模拟登录的简单验证 #只 ...
- 如何使用Django实现用户登录验证
最初开始搞用户登录验证的时候感觉没什么难的,不就是增删改查中的查询数据库么,但是还是遇到许多小问题,而且感觉在查询数据库的时候,要把前端的数据一条一条的进行比对,会导致我的代码很丑,而且方式很不智,所 ...
- django之基于cookie和装饰器实现用户认证
示例1 # Create your views here. user = "a" pwd = "a" def login(request): if reques ...
- django 从零开始 8 用户登录验证 待测
看文档 djang 自带一个用户登录验证的方法,不过有些看着懵逼,去网上找了一圈,发现很多都是照抄文档说明的,几乎没说啥原理 特别是 from django.contrib.auth import a ...
随机推荐
- react 导航切换
<ul class="nav"> <li onClick={() => this.changeFontColor(0)} className={`${0 = ...
- 2019西安多校联训 Day3
试题链接:http://www.accoders.com/contest.php?cid=1895 考试密码请私信; 特别鸣谢:zkc奆佬帮助我优化本篇题解(语言表达方面) T1 显然二分求解的 ...
- 解决window.location.href参数太长
前言:一提到页面跳转,最常用的一般就是window.location.href,如果需要带参数,也许可以在后面用?拼上,但这样并不安全,而且有个更严重的问题,这样的拼接是有长度限制的,如果达到好几千个 ...
- MyBatis 创建核心配置文件和 SQL 映射文件
Mybatis 的两个配置文件(mybatis-config.xml 和 xxxMapper.xml)都为 xml 类型,因此在 eclipse 中创建 xml 文件命名为相应的 mybatis-c ...
- 脚本开头,python预编译,控制台输入输出,for,while循环,分支判断,break,continue
3. name = input("name:")与2.x中raw_input一回事, 注意接收的变量全部默认为字符串类型. 从控制台接收用户输入,而密文输入import getpa ...
- 邓_ HTML+CSS·经常使用的设计方法
:WPA;P:hejia,888?;S:Hejia666; https://github.com/qq1415551519 HTML+CSS·经常使用的设计方法: ================== ...
- 初次使用Let's encrypt
wget --no-check-certificate -O shadowsocks.sh https://raw.githubusercontent.com/teddysun/shadowsocks ...
- hdu4288 Coder(线段树单点更新)
题意:支持增删,查操作,最后的序列式递增的. 做法:主要是如何维护mod5的sum值,这里左儿子可以不用管,关键是右儿子的处理,可以假设右儿子有t个节点,左儿子有cnt个节点, 则令(t+cnt)MO ...
- vue.js组件之间的通讯-----父亲向儿子传递数据,儿子接收父亲的数据
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 夜话JAVA设计模式之代理模式(Proxy)
代理模式定义:为另一个对象提供一个替身或者占位符以控制对这个对象的访问.---<Head First 设计模式> 代理模式换句话说就是给某一个对象创建一个代理对象,由这个代理对象控制对原对 ...