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之模块的加载
Oct 24 Python
浅析Python中的join()方法的使用
May 19 Python
Python读取MRI并显示为灰度图像实例代码
Jan 03 Python
python通过百度地图API获取某地址的经纬度详解
Jan 28 Python
Django跨域请求问题的解决方法示例
Jun 16 Python
CentOS 7 安装python3.7.1的方法及注意事项
Nov 01 Python
pygame游戏之旅 添加游戏界面按键图形
Nov 20 Python
Python 多维List创建的问题小结
Jan 18 Python
python抓取搜狗微信公众号文章
Apr 01 Python
python3 通过 pybind11 使用Eigen加速代码的步骤详解
Dec 07 Python
opencv 分类白天与夜景视频的方法
Jun 05 Python
Python使用OpenCV实现虚拟缩放效果
Feb 28 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
详解WordPress中分类函数wp_list_categories的使用
2016/01/04 PHP
thinkPHP5框架中widget的功能与用法详解
2018/06/11 PHP
Extjs中常用表单介绍与应用
2010/06/07 Javascript
jQuery之浮动窗口实现代码(两种方法)
2010/09/08 Javascript
event.X和event.clientX的区别分析
2011/10/06 Javascript
浅谈 jQuery 事件源码定位问题
2014/06/18 Javascript
jQuery 复合选择器应用的几个例子
2014/09/11 Javascript
jquery实现图片放大镜功能
2015/11/23 Javascript
jquery弹出遮掩层效果【附实例代码】
2016/04/28 Javascript
JS封装通过className获取元素的函数示例
2016/12/20 Javascript
深入理解Node.js中的进程管理
2017/03/13 Javascript
一篇看懂vuejs的状态管理神器 vuex状态管理模式
2017/04/20 Javascript
Vue2 使用 Echarts 创建图表实例代码
2017/05/18 Javascript
javascript实现延时显示提示框效果
2017/06/01 Javascript
JSON在Javascript中的使用(eval和JSON.parse的区别)详细解析
2017/09/05 Javascript
再谈Angular4 脏值检测(性能优化)
2018/04/23 Javascript
angularjs 的数据绑定实现原理
2018/07/02 Javascript
js实现点击展开隐藏效果(实例代码)
2018/09/28 Javascript
细说webpack6 Babel的使用详解
2019/09/26 Javascript
uniapp实现可以左右滑动导航栏
2020/10/21 Javascript
React Native登录之指纹登录篇的示例代码
2020/11/03 Javascript
Python matplotlib的使用并自定义colormap的方法
2018/12/13 Python
TensorFlow保存TensorBoard图像操作
2020/06/23 Python
CSS3新增布局之: flex详解
2020/06/18 HTML / CSS
html5使用Canvas绘图的使用方法
2017/11/21 HTML / CSS
Lululemon英国官网:加拿大瑜伽服装品牌
2019/01/14 全球购物
高校教师思想汇报
2014/01/11 职场文书
工程项目经理任命书
2014/06/05 职场文书
车辆年审委托书范本
2014/09/18 职场文书
招标授权委托书样本
2014/09/23 职场文书
买卖合同纠纷代理词
2015/05/25 职场文书
2015年乡镇纪委工作总结
2015/05/26 职场文书
青少年法制教育心得体会
2016/01/14 职场文书
nginx对http请求处理的各个阶段详析
2021/03/31 Servers
vue判断按钮是否可以点击
2022/04/09 Vue.js
css中有哪些方式可以隐藏页面元素及区别
2022/06/16 HTML / CSS