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通过urllib2获取带有中文参数url内容的方法
Mar 13 Python
Python的Tornado框架实现异步非阻塞访问数据库的示例
Jun 30 Python
Python中表达式x += y和x = x+y 的区别详解
Jun 20 Python
给你选择Python语言实现机器学习算法的三大理由
Nov 15 Python
便捷提取python导入包的属性方法
Oct 15 Python
Python实现针对json中某个关键字段进行排序操作示例
Dec 25 Python
在Pycharm中修改文件默认打开方式的方法
Jan 17 Python
python覆盖写入,追加写入的实例
Jun 26 Python
python Pandas库基础分析之时间序列的处理详解
Jul 13 Python
5行Python代码实现图像分割的步骤详解
May 25 Python
Pycharm新手使用教程(图文详解)
Sep 17 Python
Python实现AES加密,解密的两种方法
Oct 03 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自定义函数之递归删除文件及目录
2010/08/08 PHP
php中通过虚代理实现延迟加载的实现代码
2011/06/10 PHP
php解析html类库simple_html_dom(详细介绍)
2013/07/05 PHP
Mootools 1.2教程 函数
2009/09/15 Javascript
Mootools 1.2教程 同时进行多个形变动画
2009/09/15 Javascript
JS input文本框禁用右键和复制粘贴功能的代码
2010/04/15 Javascript
使用jQuery fancybox插件打造一个实用的数据传输模态弹出窗体
2013/01/15 Javascript
JS对象转换为Jquery对象示例
2014/01/26 Javascript
JavaScript实现横向滑出的多级菜单效果
2015/10/09 Javascript
JSON简介以及用法汇总
2016/02/21 Javascript
在Html中使用Requirejs进行模块化开发实例详解
2016/04/15 Javascript
深入理解JavaScript中的call、apply、bind方法的区别
2016/05/30 Javascript
Javascript将字符串日期格式化为yyyy-mm-dd的方法
2016/10/27 Javascript
Vue.js路由组件vue-router使用方法详解
2016/12/02 Javascript
Vue编写多地区选择组件
2017/08/21 Javascript
如何写好一个vue组件,老夫的一年经验全在这了(推荐)
2019/05/18 Javascript
聊聊Vue 中 title 的动态修改问题
2019/06/11 Javascript
vue中@change兼容问题详解
2019/10/25 Javascript
Node.js控制台彩色输出的方法与原理实例详解
2019/12/01 Javascript
jQuery中getJSON跨域原理的深入讲解
2020/09/02 jQuery
原生JavaScript实现弹幕组件的示例代码
2020/10/12 Javascript
[03:02]安得倚天剑,跨海斩长鲸——中国军团出征DOTA2国际邀请赛
2018/08/14 DOTA
跟老齐学Python之for循环语句
2014/10/02 Python
Django进阶之CSRF的解决
2018/08/01 Python
python3 写一个WAV音频文件播放器的代码
2019/09/27 Python
Python调用钉钉自定义机器人的实现
2020/01/03 Python
python opencv实现信用卡的数字识别
2020/01/12 Python
Python如何通过百度翻译API实现翻译功能
2020/04/02 Python
python实现数据结构中双向循环链表操作的示例
2020/10/09 Python
美国体育用品在线:Modell’s Sporting Goods
2018/06/07 全球购物
加拿大在线隐形眼镜和眼镜店:VisionPros
2019/10/06 全球购物
大整数数相乘的问题
2012/07/22 面试题
详解MySQL连接挂死的原因
2021/05/18 MySQL
pytorch finetuning 自己的图片进行训练操作
2021/06/05 Python
TypeScript中条件类型精读与实践记录
2021/10/05 Javascript
详解Python中*args和**kwargs的使用
2022/04/07 Python