django 做用户认证的时候需要在大多数url上添加 @login_required(login_url="login/")太过繁琐的一种解决方法
django内部已经有一套完整的用户认证系统,我们只需要调用这个系统就好,一般使用方法是@login_required(login_url="login/"),这样需要在每个需要的url上做认证,太繁琐,图示是一种比较简单的方式
参考 https://www.94e.cn/info/195
middleware 文件夹对应的 loginrequired.py 文件代码,记得修改对应的setting文件
from django.shortcuts import redirect from django.conf import settings class LoginRequiredMiddleware: def __init__(self, get_response): self.get_response = get_response self.login_url = settings.LOGIN_URL self.open_urls = [self.login_url] + getattr(settings, 'OPEN_URLS', []) def __call__(self, request): print("request.path",request.path) print("self.login_url",self.login_url) if not request.user.is_authenticated and request.path_info not in self.open_urls: return redirect(self.login_url + '?next=' + request.path) return self.get_response(request)
setting配置(注意中间件有先后顺序,别随意乱加)
'app_home.middleware.loginrequired.LoginRequiredMiddleware',#使用这个为所有的views添加@login_required
LOGIN_URL = "/login/" # 如果未登录则重定向到这个url上,正确的请求类似于 http://127.0.0.1:8000/login?next=/ OPEN_URLS = ['/login/'] # 排除在外的url,这个不加,会一直重定向,比如出现 http://127.0.0.1:8000/login/login?next=/login/login
图示 写的LOGIN_URL = "login" 经过测试有bug,修改为 LOGIN_URL = "/login/" 目前未测试出bug
附带使用django的用户机制的登录登出代码做笔记, 此处使用了@login_required(login_url="login/") 如果上面这个形式,记得删掉
from django.shortcuts import render,redirect from django.contrib.auth.models import User from django.contrib.auth import authenticate,login,logout from django.contrib.auth.decorators import login_required def loginPage(request): message = "" if request.user.is_authenticated: return redirect("/home/") else: if request.method == "POST": name_get = request.POST.get("adminName") pwd_get = request.POST.get("adminPassword") # django设置认证用户是否可以登录 userAuth = authenticate(request,username=name_get,password=pwd_get) if userAuth is not None and userAuth.is_active: try: login(request,userAuth) return redirect("/home/") except Exception as e: print(e) message = "此账号不存在..." else: message = "用户名或者密码错误" # print("message",message) context = {'message': message} return render(request, "login.html",context) # 登出界面 @login_required(login_url="login/") def logoutPage(request): logout(request) return redirect("/login/") # 主界面 @login_required(login_url="login/") def home(request): count = [1,2,3,4,5,2,3,4,5,2,3,4,5,2,3,4,5,2,3,4,5,2,3,4,5] res = {'count': count} return render(request, "home.html",res)
//