You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django中间件不抛出异常时向用户返回错误提示的实现方法

实现方法

你不需要抛出异常,只需要在判定密码泄露的分支中直接返回Django内置的响应对象即可,Django收到中间件直接返回的响应后会直接终止后续请求流程,不会继续调用后端视图逻辑。


修改后的完整代码示例

# 先导入需要的响应类
from django.http import HttpResponse
import ast
import pwned_passwords_django.api

def password_validator_middleware(get_response):
    def my_function(request):
        # 增加请求类型判断,避免GET等无body的请求解析报错
        if request.method == 'POST' and request.body:
            # 转换bytes类型为字典
            dict_str = request.body.decode("UTF-8")
            details_entered = ast.literal_eval(dict_str)
            # 检查密码是否在泄露数据库中
            if pwned_passwords_django.api.pwned_password(details_entered.get('password', '')):
                # 直接返回错误提示,status可根据业务需求调整为400/403等标准错误码
                return HttpResponse('你的密码已泄露', status=400)
            else:
                print("your password looks fine")
        # 其余情况正常走后续请求流程
        response = get_response(request)
        return response
    return my_function

额外场景适配

如果是前后端分离的项目,需要返回JSON格式的响应,可替换为JsonResponse:

from django.http import JsonResponse
# 对应分支内的返回逻辑改为
return JsonResponse({'code': 40001, 'msg': '你的密码已泄露'}, status=400)

注意事项

你当前直接用ast.literal_eval解析原始request.body的兼容性较差,如果是普通表单提交的请求,直接用request.POST.get('password')获取参数更稳妥;如果是用Django REST Framework的项目,用request.data.get('password')即可,不需要自己手动解析请求body。

内容的提问来源于stack exchange,提问作者Dhruv Singhal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 01:24:03