django 用户如何保持登录状态

用户保持登录状态 本篇是基于session验证登录

  1. 最不可行的方法就是在每一个需要验证用户的视图函数上加装饰器 @login_required 每个认证函数都加的话比较繁琐。
  2. 可行的办法是在访问视图函数前给他来一个拦截 中间件就派上用场了。
  3. 首先你需要定义一些不需要登录验证的页面集合。例如:
# 无需登录接口
no_login_urls = [ '/', '/check/', '/register/', '/login/']
  1. 然后你需要 在middleware里的AuthenticationMiddleware 定义视图函数 def process_request(self, request) 请求确定视图函数之前加入限制条件,以下为程序代码实现:
class AuthenticationMiddleware(MiddlewareMixin):
    def process_request(self, request):
        re_method = request.method
        if re_method == 'OPTIONS' or (re_method == 'POST' and not request.body):
            return HttpResponse()
        if next((0 for x in no_login_urls if x in request.path), 1):
            if not request.user.is_authenticated:
                return HttpResponse(json.dumps(dict(message="not_login")))
            if not request.user.status:
                return HttpResponse(json.dumps(message="not login"))
        return None

此时就可以实现没有登录的用户无法访问限制的页面了

另一种方法也是基于session,通过登录返回的sessionid 判断,这样即使进程杀死也可以保留一些用户信息

  1. 以下为middleware代码实现过程
 class AuthenticationMiddleware(MiddlewareMixin):
    def process_request(self, request):
        re_method = request.method
        if re_method == 'OPTIONS' or (re_method == 'POST' and not request.body):
            return HttpResponse()
        if next((0 for x in no_login_urls if x in request.path), 1):
            session_key = ""
            if request.GET.get("sessionid"):
                session_key = request.GET.get("sessionid")
            if not session_key:
                if request.META.get("HTTP_SESSIONID"):
                    session_key = request.META.get("HTTP_SESSIONID")

            uid = request.GET.get("uid", 0)
           	return None

你可能感兴趣的:(Python)