使用Django限制URL访问

时间:2013-05-27 17:04:55

标签: python django

我有一个管理汽车的应用程序。 每个用户都可以添加汽车并访问它,一切都很好,但我有一个问题。 假设bob通过mysite.com/cars/1和mysite.com/cars/3拥有汽车1和3 marc有车2通过mysite.com/cars/2

问题是bob可以通过mysite.com/cars/2读取汽车信息,但不是他的,同意使用marc和mysite.com/cars/1以及通过mysite.com/cars/3.

我如何限制访问?通过中间件?

这个问题可以扩展。汽车由件组成。例如,bob的汽车包含mysite.com/pieces/1,mysite.com/pieces/2,mysite.com/和mysite.com/pieces/3,Marc的汽车mysite.com/pieces/4 Bob无法访问mysite.com/pieces/4,marc无法访问mysite.com/pieces/1 mysite.com/pieces/2和mysite.com/pieces/3。

1 个答案:

答案 0 :(得分:3)

我只是猜测你的模特和观点,但这是一个让你入门的简单方法:

views.py

from django.core.exceptions import PermissionDenied
def cars(request, car_id):
    ...
    if request.user != car.owner:
        raise PermissionDenied
    ...

更新:添加了import指令

更新2 :添加了一些仍在猜测您的观点和模型的中间件代码。

使用中间件,方法应该是这样的:

程序my_app / middleware.py

# custom middleware

class CustomMiddleware(object):

    def process_view(self, request, view_func, view_args, view_kwargs):
        # get the car param passed to the view (not sure if it is with kwargs or args
        car_id = view_kwargs['car_id']
        car = # retrieve car from the db
        if request.user != car.owner:
            raise PermissionDenied

您可以在settings.py中添加完整的python名称空间。

您可以查看docs about middleware及其钩子,这些钩子在我看来非常简单且记录良好。

希望这有帮助!