这个东西,咳咳咳
有很多写法,我这里就列举三个:
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 版权协议,转载请附上原文出处链接和本声明。