在某些页面中,我们不希望匿名用户能够访问,例如个人页面等,这种页面只允许已经登录的用户去访问,在django中,我们也有比较多的方式去实现。

最简单的,我们在viewz中去判断用户is_authenticated,但这种方法也相对比较笨拙,最理想的的我们当然不希望这个请求能够进入到我们view,在这之前就能够返回一个相关的response,而django其实已经给我们封装好了相关的函数与类。

基于fbv模式的login_required装饰器

def login_required(function=None, redirect_field_name=REDIRECT_FIELD_NAME, login_url=None):# 实际上这个方法也是调用is_authenticated去判断pass
复制代码

使用方法也很简单:

# fbv模式
from django.contrib.auth.decorators import login_required
@login_required
def user_info_view(request):# 用户个人界面pass
复制代码

那么,我们希望如果是匿名用户在访问这个界面后能够重定向到login界面,我们可以设置相关参数,login_required装饰器会默认去读取settings.LOGIN_URL,并重定向到这个页面,如果希望更为灵活,那么我们也可以给装饰器传相关参数。

# fbv模式
@login_required(login_url='/login/', redirect_field_name='next')
def user_info_view(request):# 用户个人界面pass
复制代码

login_url就是匿名用户访问后重定向的url,一般都是login的页面
redirect_field_name是一个get请求的参数
假设当前页面会/user/info/
那么重定向的url为: /login/?next=/user/info/ 这个参数可以用于登陆后直接跳转回这个页面,后面还会具体介绍!

基于cbv的LoginRequiredMixin类

博主一般常用都是cbv模式,在这个模式下,我们会重写get和post方法,理论上可以用login_required装饰器去装饰这两个方法

# cbv模式
from django.contrib.auth.decorators import login_required
from django.utils.decorators import method_decorator
class UserInfoView(View):@method_decorator(login_required(login_url='/login/', redirect_field_name='next'))def get(self, request):# 获取用户个人界面pass
复制代码

login_required是函数装饰器,method_decorator可以将函数装饰器转化成方法装饰器。如果这里还有post请求,那这样的代码我们还要在写一遍,这样就显得有点冗余,我们既然用了类来实现,当然通过类的优势来实现!继承LoginRequiredMixin!

from django.contrib.auth.mixins import LoginRequiredMixin
class UserInfoView(LoginRequiredMixin, View):def get(self, request):# 获取用户个人界面pass
复制代码

那么,LoginRequiredMixin是怎么去实现的呢? 看看源代码

class LoginRequiredMixin(AccessMixin):def dispatch(self, request, *args, **kwargs):if not request.user.is_authenticated():return self.handle_no_permission()return super(LoginRequiredMixin, self).dispatch(request, *args, **kwargs)
复制代码

其实它重写了dispatch方法,因为我们还继承了view,其实它重写的view中的dispatch函数,如果知道view的逻辑,你就知道为什么能够这样实现了!
当我们在url中,调用你的view类,如UserInfoView.as_view()方法,它会去调用dispatch(),这个方法起到一个分配器的作用,如果get请求,那么他就调用get方法,如果是post请求,那么就调用post方法。那么,在dispatch中去判断用户是否登录,当然可以起到这个作用。
那既然只是重写dispatch,我们也可以自己实现!

# 自定义LoginRequiredMixin
class LoginRequiredMixin(object):@method_decorator(login_required(login_url='/login/', redirect_field_name='next'))def dispatch(self, request, *args, **kwargs):return super(LoginRequiredMixin, self).dispatch(request, *args, **kwargs)
复制代码

当然,有没有必要自己实现,那就看各自的需求啦~

重定向与跳转

(login_url='/login/', redirect_field_name='next')
复制代码

这两个参数提供了一个重定向与跳转的url给我们,当匿名用户登录需要登录的页面时,就会跳转到login_url,这个get请求还带着redirect_field_name参数,值是'next'。 假如他访问的是个人页面,那么跳转到

http://127.0.0.1/login/?next=/user/info/
复制代码

我们可以通过这个参数,在登录后直接跳转到个人页面。

class LoginView(View):"""用户登录逻辑"""def get(self, request):# 获取到next参数,渲染到template中,在form表单添加一个hidden类型的元素next = request.GET.get('next', '')return render(request, "login.html", {'next': next})def post(self, request):login_form = LoginForm(request.POST)if login_form.is_valid():user_name = request.POST.get("username", "")pass_word = request.POST.get("password", "")next = request.POST.get('next', '')user = authenticate(username=user_name, password=pass_word)if user is not None:if user.is_active:login(request, user)if next:# 如果next存在,直接跳转到指定页面return HttpResponseRedirect(next)# 不存在跳转到index界面return HttpResponseRedirect(reverse('index'))else:return render(request, "login.html", {"msg": "用户未激活"})else:return render(request, "login.html", {"msg": "用户名或密码错误"})else:return render(request, "login.html", {"login_form": login_form})复制代码
# login.html template form中添加
<input name="next" type="hidden" value="{{ next }}"/>
复制代码

普通页面的登录跳转问题

如果普通页面也想要实现登录后跳转回原来的页面,十分简单,在request中有个path参数,它表示当前页面,我们只需要在跳转到login界面把这个参数带上即可

# template
<a class="loginbtn" href="/login/?next={{ request.path }}">登录</a>
<a class='logoutbtn' href="/logout/?next={{ request.path }}"退出</a>
<a class='registerbtn' href="/register/?next={{ request.path }}"注册</a>
复制代码

login的实现逻辑同上面的一样,其实logout和注册界面的实现逻辑也是一样的。

# logout
class LogoutView(View):def get(self, request):next = request.GET.get('next', '')logout(request)try:return HttpResponseRedirect(next)except:return HttpResponseRedirect(reverse('index'))复制代码

后言

本篇重点在于@login_required装饰器的使用,以及LoginReqiredMixin类的使用和自定义,最后实现登录的重定向以及跳转!

django 限制匿名用户访问以及重定向相关推荐

  1. 运维之道 | Samba 文件共享传输服务(匿名用户访问、指定用户访问、共享账号映射访问)

    前言 1.Samba 概述 Samba 最先在Linux和Windous两个平台之间架起一座桥梁,正式由于Samba的出现,我们可以在Linux系统和Windows系统之间互相通信,比如拷贝文件.实现 ...

  2. Linux FTP配置匿名用户访问

    匿名用户首先要配置的就是配置文件中的"anonymous_enable=YES"这一项,默认情况下是允许匿名访问,在Windows系统用命令行去匿名访问FTP,也还是要输入用户名和 ...

  3. centos7搭建ftp,匿名用户访问

    centos7搭建ftp,匿名用户访问 注意 #安装服务 yum install vsftpd -ycd /etc/vsftpd mv vsftpd.conf vsftpd.conf.bak #编辑配 ...

  4. vsftpd匿名用户访问

    简介:vsftpd 是"very secure FTP daemon"的缩写,安全性是它的一个最大的特点.vsftpd 是一个 UNIX 类操作系统上运行的服务器的名字,它可以运行 ...

  5. linux上存的私钥文件不能访问_linux中配置vsftpd服务器匿名用户访问,实现文件上传下载服务...

    1.安装vsftpd服务器 安装VSFTPD 安装更新完毕 2.添加防火墙使用规则 添加防火墙iptables使用规则 iptables -F 查看iptables使用情况 添加前查看防火墙列表 添加 ...

  6. Linux中搭建FTP服务器,匿名用户访问、本地用户访问、虚拟用户访问(详细解答安装配置步骤)

    对于Linux搭建服务器步骤详解:可以基于匿名访问.本地用户访问.虚拟用户访问 FTP服务访问可分为三种 匿名用户:用户名为ftp或者anonymous,提供任意密码或无密码访问即可. 本地用户:要求 ...

  7. SpringSecurity匿名用户访问权限

    在SpringSecurity中定义一个匿名访问权限,实现未登录用户可以访问默写页面 1 <http use-expressions="false" entry-point- ...

  8. 匿名用户访问用发布站点模板创建网站的列表项时要求登录的问题解决

    因为发布站点中的一个Feature被打开了,造成将列表FormPage的查看给Lock了,所以需要登录,将其关闭就OK了.哈哈. 英文KB: Users are unexpectedly prompt ...

  9. 允许匿名用户访问VisualSVN

    1.需要修改VisualSVN Server\conf\httpd-custom.conf require valid-user上面添加一行:Satisfy Any ################# ...

最新文章

  1. 【linux】route使用小结
  2. [安卓] 12、开源一个基于SurfaceView的飞行射击类小游戏
  3. rhel6下配置ftp服务器
  4. Delphi 字符串转十六进制
  5. python 可视化界面_给大家分享一些实用的Python库
  6. C程序运用递归求阶乘
  7. linux的系统移植——交叉编译器
  8. 《ELK Stack权威指南(第2版)》一3.5 Windows系统日志
  9. 缝衣间走出来的创始人,他的开源软件公司被 340 亿美元收购了
  10. html position的学习
  11. python基础代码大全-python基础语法,python 代码命令大全
  12. SPSS(十五)spss之聚类分析(图文+数据集)
  13. 统计学中p值计算公式_统计学中的P值如何计算?
  14. PC浏览器播放m3u8
  15. 这内容感觉不咋滴,啊咧怎么就十万+了?
  16. python无限循环小数_如何把一个无限循环小数转换成一个分数(算法)
  17. 杜静20176395
  18. 多种图像配准方法的综合比较(KAZE、SIFT、SURF等)
  19. RADIUS 服务器之 hostapd 配置说明
  20. obs无法录屏或无法保存视频的解决方法

热门文章

  1. Android是怎么启动的-[Android取经之路]
  2. 30分钟搞定ES6常用基础知识
  3. nginx下的session一致性
  4. UIViewAnimationOptions类型与modalTransitionStyle模态样式
  5. (0049)iOS开发之数据精度处理四舍五入问题
  6. java json 去重_js操作两个json数组合并、去重,以及删除某一项元素
  7. c++无穷大怎么表示_压缩机接线柱烧坏怎么处理?
  8. mac mongodb可视化工具_「时序数据库」和MongoDB:第3部分-查询、分析和呈现
  9. 【Rollo的Python之路】Python 同步条件 学习笔记 Event
  10. 一些关键字表明变量属性值