【发布时间】:2015-10-12 16:55:42
【问题描述】:
我正在尝试使用前端的 angular.js 和后端的 api 制作一个非常简单的登录表单。这是html端的表单:
<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":"bernard@mail.com","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);
});
}
});
这是我的 Angular 应用程序,其中包括 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()
我错过了什么?谢谢!
编辑:
我收到一个名为 login 的文件,其中包含:{"detail":"Authentication credentials were not provided."}
【问题讨论】:
-
您需要在 headers 中发送 csrf 令牌。
-
请检查我的编辑。谢谢
-
您是否在请求负载的标头中看到了 csrf 令牌?您可以签入开发者工具。
-
@ZackTanner 是的,我可以看到它。
-
不是响应,是请求。在那里,寻找标题
X-CSRFToken
标签: angularjs django rest django-rest-framework http-status-code-403