django项目如何判断访问用户的登录状态并让其跳转到登录页?

  • Post author:
  • Post category:其他


这个东西,咳咳咳

有很多写法,我这里就列举三个:

1,你可以自己写一个装饰器,用在需要进行用户登录验证的视图上,

2,也可以写一个自定义中间件,过滤请求,

3,还可以写一个mixin类,帮助类视图进行验证

第一个:装饰器:

def loginValid(fun):
    def inner(request,*args,**kwargs):
        cookie = request.COOKIES.get('username')
        session = request.session.get('username')
        user_id = request.COOKIES.get('user_id')
        if cookie and session and cookie == session:
            user = Seller.objects.filter(username=cookie).first()
            if user:
                return fun(request,*args,**kwargs)
            else:
                return redirect('store:login')
        else:
            return redirect('store:login')
    return inner

这是自定义的一个简单的装饰器

利用cookie和session进行判断用户登录状态,其实单独判断session或cookie的键是否存在就行了,我这里算是多写了

如果你的用户表继承自AbstrctUser,

那么你可以使用自带的验证装饰器@login_required

但是这种装饰器装饰类的时候,需要在url中使用

例如:

url(r'content/(?P<uid>\S+)/$',login_required(views.Content.as_view()),name="content"),

这样子写会使url写的十分臃肿,且加起来也不是很方便,于是第三种方法我就提前说了:写个mixin类

from django.contrib.auth.decorators import login_required


class LoginRequiredMixin(object):
    @classmethod
    def as_view(cls,**initkwargs):
        view = super(LoginRequiredMixin,cls).as_view(**initkwargs)
        return login_required(view)

然后在想要的加登录验证的类视图中继承就好了,就像下面这样:

class Content(LoginRequiredMixin,DetailView):
    model = Article
    template_name = 'article_content.html'
    slug_field = 'uid'
    slug_url_kwarg = 'uid'

好了,这样就完成了

但是还是需要每个视图都加,很麻烦

于是乎

啊哈哈哈哈

我就用中间件了,简单快捷,浪人必备

class AccountsAuthMiddleware(object):

    def __init__(self,get_response):
        self.get_response = get_response

    def __call__(self,request, *args, **kwargs):
        ret_url = request.get_full_path()
        if ret_url[1:9] == 'accounts' and ret_url != '/accounts/user/login/' and ret_url[:22] != '/accounts/verify/code/':
            user = request.user
            if user.is_anonymous:
                return render(request,'error.html')
        response = self.get_response(request)
        return response

我写的这个中间件直接获取请求过来的地址,然后根据地址前缀判断此地址是否需要登录验证

囖囖囖,然后就ojbk了

嗯嗯,目前差不多就分享到这了



版权声明:本文为weixin_45154837原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。