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)
//
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构