2013-05-27 85 views
2

我有一個管理汽車的應用程序。每個用戶都可以添加一輛車並訪問它,一切都很好,但我有一個問題。 假設bob有車1和3通過mysite.com/cars/1和mysite.com/cars/3 marc有車2通過mysite.com/cars/2使用Django限制網址訪問

問題是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。

回答

3

我只是猜測你的模型和視圖,但在這裏,這是一個簡單的方法,讓你開始:

views.py

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

UPDATE:添加了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和他們的鉤子,這是我的觀點非常簡單,有據可查。

希望這會有所幫助!

+0

很好。我必須爲每一個我想要「保護」的視圖做到這一點,但我尋找一種全球解決方案來防止這種解決方案。這就是爲什麼中間件對我來說似乎是一個很好的解決方案:( – billyJoe

+0

好吧,我只是試圖提供一個非常簡單的解決方案。如果其他視圖共享相同的方法簽名,也許你可能想創建一個裝飾器並將其包裝。 –

+0

@gorjuce我添加了一箇中間件的簡單例子,你可以用它來完成這個任務,也許它可以幫助你 –