中间件是否可以检查URL中是否有值,例如图像ID(“/ image / 152 /”),如果是,则进行一些检查以确保当前用户有权查看该图像,如果没有重定向到另一个网址?
我必须为我正在处理的这个网站滚动自己的权限,我不想几乎用我用相同的代码编写整个网站的每个视图,所以我认为中间件是个好主意为此,但我不知道如何去做。
答案 0 :(得分:8)
是的,这是可能的。 django middleware docs for process_request表示:
def process_request(self,request)
request是一个HttpRequest对象。在Django决定执行哪个视图之前,会在每个请求上调用此方法。
process_request()应返回None或HttpResponse对象。如果它返回None,Django将继续处理此请求,执行任何其他中间件,然后执行相应的视图。如果它返回一个HttpResponse对象,Django将不会打扰调用任何其他请求,视图或异常中间件或相应的视图;它将返回HttpResponse。
HttpRequest
对象具有path
属性,可以为您提供所请求的网址。
但是,如果您愿意,请注意您还可以扩展Django的系统以进行身份验证后端,以根据任何任意条件(例如您的手动权限方案)使用权限填充请求中的用户。这样,您可以利用默认的身份验证装饰器(@permission_required
和@user_passes_test
),而其他应用程序/管理站点也可以使用这些权限。创建的User对象和权限不需要驻留在Django的用户/权限表中,并且可以在登录时虚拟创建;我已经取得了相当大的成功。
如果上诉,请参阅Writing an authentication backend。
答案 1 :(得分:0)
如果在中间件中实现授权(权限系统),最终将有两个选项:
如果您的要求非常简单,那就没问题,因为您不必触摸视图。
但总的来说,权限系统比这复杂得多,例如:
如果你想要一起实现3以上的工具,我建议你自己编写授权后端,DJango乐意与之合作。您需要做的就是实现几个方法(您的特定逻辑)并作为后端附加。
阅读:http://docs.djangoproject.com/en/dev/topics/auth/#handling-authorization-in-custom-backends