django自定义实现登录验证-更新版

django自定义实现登录验证


  • django内置的登录验证必须让开发者使用django内置的User模块,这会让开发者再某些方面被限制住
  • 下面的模块是我自己自定义实现的django验证,使用方式和django的一样
  •  1 from django.http import HttpResponse
     2 from django.shortcuts import redirect
     3 from django.conf import settings
     4 from django.views import View
     5 
     6 
     7 class HttpResponseUnauthorized(HttpResponse):
     8     status_code = 401
     9 
    10 
    11 def login(request, user):
    12     request.session['login'] = user.id
    13 
    14 
    15 def logout(request):
    16     request.session.flush()
    17 
    18 
    19 def login_required(func):
    20     """
    21     对需要登录的视图函数进行验证
    22     @login_required
    23     def your_view(request, *args, **kwargs):
    24         ''''''
    25     """
    26 
    27     def wrapper(*args, **kwargs):
    28         request = args[0]
    29         is_login = request.session.get('login')
    30 
    31         if not is_login:
    32             redirect_url = '%s?next=%s' % (settings.LOGIN_URL, request.path)
    33             return redirect(redirect_url)
    34         else:
    35             result = func(*args, **kwargs)
    36             return result
    37 
    38     return wrapper
    39 
    40 
    41 class LoginRequired(View):
    42     """
    43     对需要登录的类视图进行验证
    44     class YouView(LoginRequired):
    45         ''''''
    46     """
    47 
    48     @classmethod
    49     def as_view(cls, **initkwargs):
    50         view = super(LoginRequired, cls).as_view()
    51         return login_required(view)

     

  • 当验证用户名密码成功后,使用login登入一个用户,将request,和登录后的user对象(model的实例)传进去, 即可记录下当前用户的登录状态
  • 退出用户直接将session清除即可。
  • 对于函数视图,用装饰器对函数视图进行装饰:
    • 判断当前的请求request里面的session有没有被login生成一个key为'login'的值:
      • 如果没有则跳转到登录页面
      • 有则进行正常访问
  • 类视图调用的是as_view方法,可以在urls里面对该url对应的类视图的as_view用login_required进行调用,这种方法比较繁琐,代码可读性查
  • 对于类视图,因为类视图最后都要调用as_view方法,可以重新写一个类来继承View,重写View的as_view方法。
    • 调用父类的as_view方法,将返回的view对象用login_required进行调用,最后实现了类方法的验证

 

posted @ 2019-07-15 12:45  Ivy丶  阅读(1265)  评论(0编辑  收藏  举报