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)

 

 

//

 

posted @ 2021-01-27 14:11  小城熊儿  阅读(1465)  评论(0编辑  收藏  举报