Django Middleware + URL

时间:2009-04-15 21:59:49

标签: django middleware

中间件是否可以检查URL中是否有值,例如图像ID(“/ image / 152 /”),如果是,则进行一些检查以确保当前用户有权查看该图像,如果没有重定向到另一个网址?

我必须为我正在处理的这个网站滚动自己的权限,我不想几乎用我用相同的代码编写整个网站的每个视图,所以我认为中间件是个好主意为此,但我不知道如何去做。

2 个答案:

答案 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)

如果在中间件中实现授权(权限系统),最终将有两个选项:

  1. 检查网址并允许访问
  2. 检查网址并拒绝访问
  3. 如果您的要求非常简单,那就没问题,因为您不必触摸视图。

    但总的来说,权限系统比这复杂得多,例如:

    1. 用户可以访问FOO / show_all /
    2. 但是,他看不到或访问foo实例,即FOO / show / foo_1 /
    3. 因为,他无法访问foo_1实例,我们不应该在show_all中显示它们 (所有foo实例)
    4. 如果你想要一起实现3以上的工具,我建议你自己编写授权后端,DJango乐意与之合作。您需要做的就是实现几个方法(您的特定逻辑)并作为后端附加。

      阅读:http://docs.djangoproject.com/en/dev/topics/auth/#handling-authorization-in-custom-backends