Django中login_required装饰器的深入介绍


Posted in Python onNovember 24, 2017

前言

Django提供了多种装饰器, 其中login_required可能是经常会使用到的。 这里介绍下四种使用此装饰器的办法。

当然, 在使用前, 记得在工程目录的settings.py中设置好LOGIN_URL

使用方法

1. URLconf中装饰

from django.contrib.auth.decorators import login_required, permission_required
from django.views.generic import TemplateView

from .views import VoteView

urlpatterns = [
 url(r'^about/', login_required(TemplateView.as_view(template_name="secret.html"))),
 url(r'^vote/', permission_required('polls.can_vote')(VoteView.as_view())),
]

2. 装饰基于函数的视图

from django.contrib.auth.decorators import login_required
from django.http import HttpResponse

@login_required
def my_view(request):
 if request.method == 'GET':
  # <view logic>
  return HttpResponse('result')

3. 装饰类的视图

from django.contrib.auth.decorators import login_required
from django.utils.decorators import method_decorator
from django.views.generic import TemplateView

class ProtectedView(TemplateView):
 template_name = 'secret.html'

 @method_decorator(login_required)
 def dispatch(self, *args, **kwargs):
  return super(ProtectedView, self).dispatch(*args, **kwargs)

4. 装饰通过Mixin类继承来实现

from django.contrib.auth.decorators import login_required

from django.http import HttpResponseRedirect
from django.shortcuts import render
from django.views.generic import View

from .forms import MyForm

class LoginRequiredMixin(object):
 @classmethod
 def as_view(cls, **initkwargs):
  view = super(LoginRequiredMixin, cls).as_view(**initkwargs)
  return login_required(view)

class MyFormView(LoginRequiredMixin, View):
 form_class = MyForm
 initial = {'key': 'value'}
 template_name = 'form_template.html'

 def get(self, request, *args, **kwargs):
  form = self.form_class(initial=self.initial)
  return render(request, self.template_name, {'form': form})
 
 def post(self, request, *args, **kwargs):
  # code here

Django 用户登陆访问限制 @login_required

在网站开发过程中,经常会遇到这样的需求:用户登陆系统才可以访问某些页面,如果用户没有登陆而直接访问就会跳转到登陆界面。

要实现这样的需求其实很简单:

      1、在相应的 view 方法的前面添加 django 自带的装饰器 @login_required

      2、在 settings.py 中配置 LOGIN_URL 参数

      3、修改 login.html 表单中的 action 参数

# views.py
from djanco.contrib.auth.decorators import login_required
from django.shortcuts import render_to_response

@login_required
def index(request):
return render_to_response('index.html')
# settings.py
....
LOGIN_URL = '/accounts/login/' # 根据你网站的实际登陆地址来设置
....

如果要使用 django 默认登陆地址,则可以通过在 urls.py 中添加如此配置:

# urls.py
....
url(r'^accounts/login/', views.login),
....
# login.html
<div class="container">
<form class="form-signin" action="/accounts/login/" method="post">
{% csrf_token %}
<!--csrf_token:生成令牌-->
<h2 class="form-signin-heading" align="center">登录系统</h2>
<label for="inputUsername" class="sr-only">username</label>
<input type="text" name="username" id="inputUsername" class="form-control" placeholder="username" required autofocus>
<label for="inputPassword" class="sr-only">Password</label>
<input type="password" name="password" id="inputPassword" class="form-control" placeholder="Password" required>
<div class="checkbox">
<label>
<input type="checkbox" value="remember-me"> 记住密码
</label>
</div>
<br />
<button class="btn btn-lg btn-primary btn-block" type="submit">登录</button>
<br />
<span style="color: red;">{{ login_err }}</span>
</form>
</div>
<!-- /container -->

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。   

Python 相关文章推荐
python mysqldb连接数据库
Mar 16 Python
Python多线程编程(八):使用Event实现线程间通信
Apr 05 Python
举例讲解如何在Python编程中进行迭代和遍历
Jan 19 Python
Python 机器学习库 NumPy入门教程
Apr 19 Python
python 接收处理外带的参数方法
Dec 03 Python
详解opencv Python特征检测及K-最近邻匹配
Jan 21 Python
Django REST Framework序列化外键获取外键的值方法
Jul 26 Python
Python进程间通信 multiProcessing Queue队列实现详解
Sep 23 Python
用openCV和Python 实现图片对比,并标识出不同点的方式
Dec 19 Python
django-xadmin根据当前登录用户动态设置表单字段默认值方式
Mar 13 Python
分享一个python的aes加密代码
Dec 22 Python
Python的轻量级ORM框架peewee使用教程
Feb 05 Python
Python多进程库multiprocessing中进程池Pool类的使用详解
Nov 24 #Python
pip安装Python库时遇到的问题及解决方法
Nov 23 #Python
python清理子进程机制剖析
Nov 23 #Python
Python3 加密(hashlib和hmac)模块的实现
Nov 23 #Python
Python2.7基于笛卡尔积算法实现N个数组的排列组合运算示例
Nov 23 #Python
深入理解Python3 内置函数大全
Nov 23 #Python
Python内置函数delattr的具体用法
Nov 23 #Python
You might like
php中根据某年第几天计算出日期年月日的代码
2011/02/24 PHP
PHP、Nginx、Apache中禁止网页被iframe引用的方法
2020/10/01 PHP
浅谈htmlentities 、htmlspecialchars、addslashes的使用方法
2016/12/09 PHP
wordpress网站转移到本地运行测试的方法
2017/03/15 PHP
PHP实现的简单对称加密与解密方法实例小结
2017/08/28 PHP
改变文件域的样式实现思路同时兼容ie、firefox
2013/10/23 Javascript
多选列表框动态添加,移动,删除,全选等操作的简单实例
2014/01/13 Javascript
JQuery1.8 判断元素是否绑定事件的方法
2014/07/10 Javascript
jQuery实现提交按钮点击后变成正在处理字样并禁止点击的方法
2015/03/24 Javascript
jQuery左侧大图右侧小图焦点图幻灯切换代码分享
2015/08/19 Javascript
AngularJs Modules详解及示例代码
2016/09/01 Javascript
浅谈jQuery效果函数
2016/09/16 Javascript
boostrapTable的refresh和refreshOptions区别浅析
2017/01/22 Javascript
jQuery移除或禁用html元素点击事件常用方法小结
2017/02/10 Javascript
将 vue 生成的 js 上传到七牛的实例
2017/07/28 Javascript
p5.js入门教程之小球动画示例代码
2018/03/15 Javascript
layui radio性别单选框赋值方法
2018/08/15 Javascript
webpack4简单入门实例
2018/09/06 Javascript
vue中引入mxGraph的步骤详解
2019/05/17 Javascript
微信小程序基于Taro的分享图片功能实践详解
2019/07/12 Javascript
vue单文件组件无法获取$refs的问题
2020/06/24 Javascript
详解vue中v-on事件监听指令的基本用法
2020/07/22 Javascript
探索浏览器页面关闭window.close()的使用详解
2020/08/21 Javascript
Echarts在Taro微信小程序开发中的踩坑记录
2020/11/09 Javascript
浅析Python装饰器以及装饰器模式
2018/05/28 Python
python自定义线程池控制线程数量的示例
2019/02/22 Python
Python3实现的回文数判断及罗马数字转整数算法示例
2019/03/27 Python
你还在@微信官方?聊聊Python生成你想要的微信头像
2019/09/25 Python
python生成器/yield协程/gevent写简单的图片下载器功能示例
2019/10/28 Python
Python图像处理二值化方法实例汇总
2020/07/24 Python
购买大码女装:Lane Bryant
2016/09/07 全球购物
巴西最好的男鞋:Rafarillo
2018/05/25 全球购物
Python自动化爬取天眼查数据的实现
2021/06/15 Python
bat批处理之字符串操作的实现
2022/03/16 Python
《游戏王:大师决斗》新活动上线 若无符合卡组可免费租用
2022/04/13 其他游戏
Windows Server 2016 配置 IIS 的详细步骤
2022/04/28 Servers