Django:权限验证中间件如何使用

有时候我们需要在访问页面前进行权限验证,比如有些页面是需要在登录后才能进行访问,如个人中心、我的订单等。

一.后端配置中间件

1.检验逻辑

创建一个middleware.py,在里面写上检验的逻辑

复制代码
from django.http import JsonResponse
from users.models import User

class CookieAuthMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        # 检查请求是否为登录请求
        if request.path == '/login/':
            return self.get_response(request)

        mobile = request.COOKIES.get('mobile')
        if mobile:
            try:
                user = User.objects.get(mobile=mobile)
                request.user = user
            except User.DoesNotExist:
                return JsonResponse({'detail': 'Unauthorized'}, status=401)
        else:
            return JsonResponse({'detail': 'Unauthorized'}, status=401)

        response = self.get_response(request)
        return response

对登录操作则不进行检验

2.配置中间件

复制代码
MIDDLEWARE = [
    'corsheaders.middleware.CorsMiddleware',
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    # 'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',

    'utils.middleware.CookieAuthMiddleware',
]

实际路径跟自己项目匹配,我是把中间件的文件放在了utils文件夹里

3.运行效果

可以看到这里未登录状态访问我的订单已经返回了401

二.前端页面跳转

然后我们在页面的js里配置响应拦截,如果检测到返回响应为401,则说明用户未登录,就给他跳转到登录界面

复制代码
mounted: function(){
    axios.interceptors.response.use(
        response => {
            return response;
        },
        error => {
            if (error.response && error.response.status === 401) {
                window.location.href = 'http://127.0.0.1:8080/login.html';
            } else {
                return Promise.reject(error);
            }
        }
    );}

这时我们在未登录状态下访问就会跳转到登录界面

相关推荐
张张123y3 分钟前
RAG从0到1学习:技术架构、项目实践与面试指南
人工智能·python·学习·面试·架构·langchain·transformer
Shi_haoliu11 分钟前
openClaw源码部署-linux
前端·python·ai·openclaw
gf132111113 分钟前
python_查询并删除飞书多维表格中的记录
java·python·飞书
带娃的IT创业者1 小时前
WeClaw 离线消息队列实战:异步任务队列如何保证在服务器宕机时不丢失任何一条 AI 回复?
运维·服务器·人工智能·python·websocket·fastapi·实时通信
坐吃山猪3 小时前
Python进度条
linux·服务器·python
l1t3 小时前
四种python工具包用SQL查询csv和parquet文件的方法比较
大数据·python·sql
清水白石0083 小时前
Python 并发三剑客:多线程、多进程与协程的实战抉择
java·服务器·python
2301_793804693 小时前
更优雅的测试:Pytest框架入门
jvm·数据库·python
dinl_vin3 小时前
python:常用的基础工具包
开发语言·python
wefly20174 小时前
无需安装、开箱即用!m3u8live.cn 在线 HLS 播放器,调试直播流效率翻倍
前端·后端·python·前端开发工具·后端开发工具