博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
django 限制匿名用户访问以及重定向
阅读量:6303 次
发布时间:2019-06-22

本文共 4434 字,大约阅读时间需要 14 分钟。

在某些页面中,我们不希望匿名用户能够访问,例如个人页面等,这种页面只允许已经登录的用户去访问,在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_requiredfrom django.utils.decorators import method_decoratorclass 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 LoginRequiredMixinclass 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,我们也可以自己实现!

# 自定义LoginRequiredMixinclass 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中添加复制代码

普通页面的登录跳转问题

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

# template登录复制代码

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

# logoutclass 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类的使用和自定义,最后实现登录的重定向以及跳转!

转载地址:http://qmfxa.baihongyu.com/

你可能感兴趣的文章
走红日本 阿里云如何能够赢得海外荣耀
查看>>
在市场营销中使用敏捷方法:过程、团队与成功案例
查看>>
新书问答:Agile Management
查看>>
苹果将iOS应用带入macOS
查看>>
react入门
查看>>
VUE高仿饿了么app
查看>>
针对Kubernetes软件栈有状态服务设计的思考
查看>>
你的可用性达标了吗?云端业务性能高可用的深度实践
查看>>
linux yum清缓存脚本
查看>>
基于epoll封装的事件回调miniserver
查看>>
天猫高管全面解读大快消2018新零售打法
查看>>
idea springboot热部署无效问题
查看>>
第八章 进程间通信
查看>>
「镁客早报」AI可预测心脏病人死亡时间;机器人开始在美国送外卖
查看>>
MoQ(基于.net3.5,c#3.0的mock框架)简单介绍
查看>>
物联网全面升级,十年内推动工业进入智能化新阶段
查看>>
spring-通过ListFactory注入List
查看>>
一种基于SDR实现的被动GSM嗅探
查看>>
阿里云ECS每天一件事D1:配置SSH
查看>>
SQL Server 性能调优(性能基线)
查看>>