gpt4 book ai didi

django - 创建 Django 响应的自定义异常

转载 作者:行者123 更新时间:2023-12-03 20:29:18 26 4
gpt4 key购买 nike

对于我的站点,我创建了一个抽象模型,它实现了模型级读取权限。系统的那部分已完成并正常工作。许可模型公开的方法之一是 is_safe(user)它可以手动测试是否允许用户查看该模型。

我想做的是为continue_if_safe的效果添加一个方法可以在任何模型实例上调用,而不是返回像 is_safe 这样的 bool 值它会首先测试模型是否可以被查看,然后在 False 的情况下,它会将用户重定向到登录页面,如果他们尚未登录,或者如果他们已登录则返回 403 错误。

理想用法:

model = get_object_or_404(Model, slug=slug)
model.continue_if_safe(request.user)
# ... remainder of code to be run if it's safe down here ...

我偷看了 get_object_or_404 是如何工作的,它抛出一个 Http404错误似乎有道理。但是,问题是似乎没有等效的重定向或 403 错误。解决这个问题的最佳方法是什么?

(非工作) continue_if_safe 方法:
def continue_if_safe(self, user):

if not self.is_safe(user):
if user.is_authenticated():
raise HttpResponseForbidden()
else:
raise HttpResponseRedirect('/account/')

return

编辑 - 解决方案

最终解决方案的代码,以防其他“堆栈器”需要一些帮助:

在抽象模型中:
def continue_if_safe(self, user):
if not self.is_safe(user):
raise PermissionDenied()
return

View 被中间件捕获:
class PermissionDeniedToLoginMiddleware(object):
def process_exception(self, request, exception):
if type(exception) == PermissionDenied:
if not request.user.is_authenticated():
return HttpResponseRedirect('/account/?next=' + request.path)
return None

View 中的用法(非常简短和甜蜜):
model = get_object_or_404(Model, slug=slug)
model.continue_if_safe(request.user)

最佳答案

对于禁止 (403) 错误,您可以引发 PermissionDenied异常(来自 django.core.exceptions )。

对于重定向行为,没有内置的方法可以按照您在问题中描述的方式来处理它。您可以编写一个自定义中间件来捕获您的异常并在 process_exception 中重定向.

关于django - 创建 Django 响应的自定义异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2299077/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com