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
相关产品推荐
相关产品推荐

