2015-05-21 86 views
3

我正試圖重構我的Django項目。 因此,我想從重構:基於Django類的視圖中的身份驗證用戶

@api_view([GET, POST]) 
    @permission_classes((IsAuthenticated, VehiclePermissions,)) 
    def inactive_vehicle_view(request): 

     if request.method == "GET": 
      con = CBaseUtil.get_prod_instance() 
      vehicle_bo = VehicleBO() 
      dongle_dao = OBDDongleDAO(con) 

      since_days = int(request.GET.get("since", 28)) 

      vehicles = vehicle_bo.find_vehicles_by_user_context(request.user.details) 

      return Response(vehicles, status=status_code, headers=get_headers(request)) 

要基於類觀點是這樣的:

class InactiveVehicleView(View): 

    @authentication_classes((BasicAuthentication, WebsiteAuthentication)) 
    @permission_classes((IsAuthenticated, VehiclePermissions,)) 
    def dispatch(self, *args, **kwargs): 
     return super(InactiveVehicleView, self).dispatch(*args, **kwargs) 

    def get(self, request): 
     con = CBaseUtil.get_prod_instance() 
     vehicle_bo = VehicleBO() 
     dongle_dao = OBDDongleDAO(con) 

     since_days = int(request.GET.get("since", 28)) 

     vehicles = vehicle_bo.find_vehicles_by_user_context(request.user.details) 

     return Response(vehicles, status=status_code, headers=get_headers(request)) 

我現在面臨的問題是,我不能像老用戶的詳細信息版本由request.user.details作爲WSGI-Request不包含屬性用戶。我想我做了一些錯誤的裝飾,但我無法弄清楚。

url(r'^vehicles/inactive/?$', InactiveVehicleView.as_view()) 

有沒有人有一個想法,我做錯了什麼與認證和/或裝飾:

僅供參考該視圖的URL這樣的映射?

+0

對,我也試過把api_view裝飾器兩個,但這沒有任何問題。 – Igle

+0

也許這就是你需要的https://docs.djangoproject.com/en/1.8/topics/class-based-views/intro/#decorating-the-class – danielcorreia

+0

@danielcorreia我已經嘗試實現以下基於類的視圖文檔。但是沒有提示如何使用authentication_classes和permission_classes修飾器以及如何獲取已認證用戶的數據。 – Igle

回答

3

根據Django Rest Framework Authentication Docs,您的視圖應繼承APIView,並將authentication_classespermission_classes設置爲屬性而不是使用裝飾器。

from rest_framework.views import APIView 

class InactiveVehicleView(APIView): 

    authentication_classes = (BasicAuthentication, WebsiteAuthentication) 
    permission_classes = (IsAuthenticated, VehiclePermissions) 

    def get(self, request): 
     ... 
+0

謝謝,這解決了我的問題。除了基於班級的教程之外,還應該在碼頭中進行檢查。 – Igle

相關問題