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之模拟鼠标键盘动作具体实现
Dec 30 Python
Python中的字典与成员运算符初步探究
Oct 13 Python
python3新特性函数注释Function Annotations用法分析
Jul 28 Python
python笔记:mysql、redis操作方法
Jun 28 Python
python实现redis三种cas事务操作
Dec 19 Python
Python 机器学习库 NumPy入门教程
Apr 19 Python
Python实现的redis分布式锁功能示例
May 29 Python
python使用wxpy轻松实现微信防撤回的方法
Feb 21 Python
Tensorflow tf.dynamic_partition矩阵拆分示例(Python3)
Feb 07 Python
浅谈Python 命令行参数argparse写入图片路径操作
Jul 12 Python
Pandas的数据过滤实现
Jan 15 Python
Pillow图像处理库安装及使用
Apr 12 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
PR值查询 | PageRank 查询
2006/12/20 PHP
PHP编程中的常见漏洞和代码实例
2014/08/06 PHP
php图片的二进制转换实现方法
2014/12/15 PHP
PHP开启目录引索+fancyindex漂亮目录浏览带搜索功能
2019/09/23 PHP
IE和Firefox的Javascript兼容性总结[推荐收藏]
2011/10/19 Javascript
javascript判断非数字的简单例子
2013/07/18 Javascript
javaScript函数中执行C#代码中的函数方法总结
2013/08/07 Javascript
原生js做的手风琴效果的导航菜单
2013/11/08 Javascript
js中一个函数获取另一个函数返回值问题探讨
2013/11/21 Javascript
Javscript删除数组中指定元素并返回新数组
2014/03/06 Javascript
什么是 AngularJS?AngularJS简介
2014/12/06 Javascript
javascript实现行拖动的方法
2015/05/27 Javascript
JavaScript动态提示输入框输入字数的方法
2015/07/27 Javascript
jQuery仿写百度百科的目录树
2017/01/03 Javascript
js异步编程小技巧详解
2017/08/14 Javascript
Vue的移动端多图上传插件vue-easy-uploader的示例代码
2017/11/27 Javascript
Javascript防止图片拉伸的自适应处理方法
2017/12/26 Javascript
小程序自定义组件实现城市选择功能
2018/07/18 Javascript
JS字典Dictionary类定义与用法示例
2019/02/01 Javascript
微信小程序基于高德地图查找位置并显示文字
2019/10/30 Javascript
探究数组排序提升Python程序的循环的运行效率的原因
2015/04/01 Python
python-docx修改已存在的Word文档的表格的字体格式方法
2018/05/08 Python
python爬虫框架scrapy实现模拟登录操作示例
2018/08/02 Python
详解pandas.DataFrame中删除包涵特定字符串所在的行
2019/04/04 Python
为什么说Python可以实现所有的算法
2019/10/04 Python
PyTorch和Keras计算模型参数的例子
2020/01/02 Python
基于python监控程序是否关闭
2020/01/14 Python
深入浅析python的第三方库pandas
2020/02/13 Python
基于keras中的回调函数用法说明
2020/06/17 Python
python3中布局背景颜色代码分析
2020/12/01 Python
英国领先的互联网葡萄酒礼品商:Vintage Wine & Port
2019/05/24 全球购物
某公司的.net工程师面试题笔试题
2013/11/22 面试题
什么是Connection-oriented Protocol/Connectionless Protocol面向连接的协议/无连接协议
2012/09/06 面试题
数控技术与应用毕业生自荐信
2013/09/24 职场文书
2016年社区“6.26”禁毒日宣传活动总结
2016/04/05 职场文书
导游词之永济鹳雀楼
2020/01/16 职场文书