0

我想做一個非常簡單的登錄表單使用angular.js在前端和api休息在後端。這裏是HTML端形式:403錯誤與angular.js文章和Django休息框架

<form action="" method="post"> 
    {% csrf_token %} 
    <div class="modal-body"> 
     <div class="form-group"> 
      <label for="login-username" class="control-label">Email:</label> 
      <input type="text" class="form-control" name="username" id="login-username" ng-model="loginData.email" required> 
     </div> 
     <div class="form-group"> 
      <label for="login-password" class="control-label">Password:</label> 
      <input type="text" class="form-control" name="password" id="login-password" ng-model="loginData.password" required> 
     </div> 
    </div> 
    <div class="modal-footer"> 
     <button type="button" class="btn btn-default" data-dismiss="modal">Close</button> 
     <button type="button" class="btn btn-primary" ng-click="login()">Login as {$ loginData.email $}</button> 
    </div> 
</form> 

,這裏是我的角度控制器(注:我知道這裏沒有問題,因爲我有一個非常類似的一個寄存器功能工作得很好):

mainApp.controller("mainCtrl", function($scope, $http) { 
    $scope.loginData = {"email":"[email protected]","password":"pass"}; 
    $scope.login = function() { 
     return $http.post('/api/v1/auth/login/', 
      $scope.loginData 
     ).success(function(data, status){ 
      alert("success : "+status); 
      console.log(data); 
     }).error(function(data, status){ 
      alert("error : "+status); 
     }); 
    } 
}); 

這裏是我的角度的應用程序,其中包括CSRF標題:

var mainApp = angular.module("mainApp", []).config(function($interpolateProvider) { 
    $interpolateProvider.startSymbol('{$'); 
    $interpolateProvider.endSymbol('$}'); 
}).run(run); 


function run($http) { 
    $http.defaults.xsrfHeaderName = 'X-CSRFToken'; 
    $http.defaults.xsrfCookieName = 'csrftoken'; 
} 

在Django的一面,我有一個完美的作品爲GET而不是POST方法登錄視圖。這就是我迷失的地方。

class LoginView(views.APIView): 
    """ 
    View for login user 
    """ 
    queryset = BaseUser.objects.all() 

    def get(self, request, format=None): 
     print("get_login098765") # THIS IS PRINTED PERFECTLY 
     return Response() 

    def post(self, request, format=None): #THIS THROWS 403 ERROR 
     print("post_login098765") #THIS IS NOT PRINTED 
     return Response() 

我錯過了什麼?謝謝 !

編輯:

我收到一個名爲登錄一個文件,其中包含:{"detail":"Authentication credentials were not provided."}

+1

您需要在標題中發送csrf標記。 –

+0

請檢查我的編輯。謝謝 –

+1

您是否在請求負載的標頭中看到csrf標記?您可以簽入開發者工具。 –

回答

1

在響應您的編輯,消息: {"detail":"Authentication credentials were not provided."}正在由Django REST Framework引發,並與您在該ViewSet上的權限有關。我會建議在看看http://www.django-rest-framework.org/api-guide/authentication/

這可能包括添加默認的認證類的設置文件,像這樣:

REST_FRAMEWORK = { 
    'DEFAULT_AUTHENTICATION_CLASSES': (
     'rest_framework.authentication.BasicAuthentication', 
     'rest_framework.authentication.SessionAuthentication', 
    ) 
} 

或者視圖爲主,像這樣:

from rest_framework.authentication import SessionAuthentication, BasicAuthentication 
from rest_framework.permissions import IsAuthenticated 

class LoginView(api.APIView): 
    authentication_classes = (SessionAuthentication, BasicAuthentication) 
    permission_classes = (IsAuthenticated,) 
    [...] 

UPDATE :由於使用AllowAny作爲權限的工作,您可以執行以下操作將這些權限限制爲發佈路由。下面是一個示例:

class LoginView(api.APIView): 
    queryset = BaseUser.objects.all() 

    def get_permissions(self): 
     if self.request.method == 'POST': 
      return (permissions.AllowAny(),) 

     return (permissions.IsAuthenticated(),) 

這將覆蓋此端點上的POST請求的權限,並且默認爲其他路由的IsAuthenticated。

+0

謝謝@ZackTanner。我相信問題出在這些問題的周圍。但不幸的是,你提供的並不是解決問題。 –

+0

嘗試將permission_classes設置爲'AllowAny'。首先導入該權限,「從rest_framework.permissions導入AllowAny',然後將permission_classes更新爲'permission_classes =(AllowAny,)' –

+0

它工作!非常感謝你 !但是AllowAny並不危險,爲什麼它不適用於IsAuthenticated?謝謝 ! –

2

從我讀的CRSF參數需要在配置功能應用:

var mainApp = angular.module("mainApp", []).config(function($interpolateProvider, $httpProvider) { 
    $interpolateProvider.startSymbol('{$'); 
    $interpolateProvider.endSymbol('$}'); 
    $httpProvider.defaults.xsrfHeaderName = 'X-CSRFToken'; 
    $httpProvider.defaults.xsrfCookieName = 'csrftoken'; 
}).run(run); 
+0

,並且配置被附加到'$ httpProvider'而不是'$ http' – oliverpool

+0

這沒有幫助,{$不再被解釋。 –