Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django Rest框架返回200 OK,即使登录请求的凭据不正确_Django_Django Rest Framework_Django Rest Auth - Fatal编程技术网

Django Rest框架返回200 OK,即使登录请求的凭据不正确

Django Rest框架返回200 OK,即使登录请求的凭据不正确,django,django-rest-framework,django-rest-auth,Django,Django Rest Framework,Django Rest Auth,这是我的URL.py: from django.conf.urls import include, url from django.contrib import admin urlpatterns = [ url(r'^CMS/', include('CMSApp.urls')), url(r'^admin/', include(admin.site.urls)), ] 这是CMSApp/url.py: from django.conf.urls import url fro

这是我的URL.py:

from django.conf.urls import include, url
from django.contrib import admin

urlpatterns = [
    url(r'^CMS/', include('CMSApp.urls')),
    url(r'^admin/', include(admin.site.urls)),
]
这是CMSApp/url.py:

from django.conf.urls import url
from django.conf.urls import include
from CMSApp import views

urlpatterns = [
    url(r'^$', views.HomePageView.as_view()),
    url(r'^users$', views.user_list.as_view()),
    url(r'^users/(?P<pk>[0-9]+)$', views.user_detail.as_view()),
    url(r'^api-auth/', include('rest_framework.urls',
                                   namespace='rest_framework')),
]
从django.conf.url导入url
从django.conf.url导入包括
从CMSApp导入视图
URL模式=[
url(r'^$',views.HomePageView.as_view()),
url(r“^users$”,views.user\u list.as\u view()),
url(r'^users/(?P[0-9]+)$,views.user\u detail.as\u view()),
url(r“^api auth/”,包括('rest\u framework.url',
namespace='rest_framework'),
]
My HomePageView服务于此home.html页面:

<h3>Register</h3>
<form ng-submit="ctrl.add()" name="myForm">
    <label>Username</label>
    <input type="text" name="uname" ng-model="ctrl.user.username" required> 
    <label>Password</label>
    <input type="password" name="pwd" ng-model="ctrl.user.password" required>
    <label>Email</label>
    <input type="email" name="mail" ng-model="ctrl.user.email" required> 
    <input type="submit" value="Register"> 
</form>

<h3>Login</h3>
<form ng-submit="ctrl.loginUser()" name="myLoginForm">
    <label>Username</label>
    <input type="text" name="uname" ng-model="ctrl.user.username" required> 
    <label>Password</label>
    <input type="password" name="pwd" ng-model="ctrl.user.password" required>
    <input type="submit" value="Login"> 
</form>

<script>
angular.module("notesApp", [])
    .config(['$httpProvider', function($httpProvider) {
        $httpProvider.defaults.xsrfCookieName = 'csrftoken';
        $httpProvider.defaults.xsrfHeaderName = 'X-CSRFToken';
    }])

    .controller("MainCtrl", ["$http", function($http) {
    var self = this;
    self.users = {};
    var fetchUsers = function() {
        return $http.get("/CMS/users").then(function(response) { // get list of existing users
            self.users = response.data;
        }, function(errResponse) {
        console.error("Error while fetching users.");
        });
    };

    self.loginUser = function() {
        $http.post("/CMS/api-auth/login/", self.user)
        .error(function(data, status, headers, config) {
            console.log(data);
         })
        .then(fetchUsers);

        console.log("Success Login with ", self.user);
    };
    }]);
</script>
寄存器
用户名
密码
电子邮件
登录
用户名
密码
角度模块(“notesApp”,[])
.config(['$httpProvider',函数($httpProvider){
$httpProvider.defaults.xsrfCookieName='csrftoken';
$httpProvider.defaults.xsrfHeaderName='X-CSRFToken';
}])
.controller(“MainCtrl”、[“$http”、函数($http){
var self=这个;
self.users={};
var fetchUsers=function(){
返回$http.get(“/CMS/users”)。然后(函数(响应){//get现有用户列表
self.users=response.data;
},函数(错误响应){
错误(“获取用户时出错”);
});
};
self.loginUser=函数(){
$http.post(“/CMS/api auth/login/”,self.user)
.error(函数(数据、状态、标题、配置){
控制台日志(数据);
})
。然后(用户);
console.log(“成功登录”,self.user);
};
}]);
当我注册一个已经存在的用户时,Django返回一个400错误请求错误,这是好的,因为我在前端使用AngularJS来处理400状态代码

问题是,当我尝试使用不正确的用户名和密码(用户名不存在或用户名和密码不匹配)登录时,Django返回200 OK状态码,因此我无法在前端使用AngularJS跟踪问题。知道为什么Django在我尝试使用错误的用户名和密码登录时返回200 OK吗?当提交错误的用户名/密码时,如何让Django返回400


编辑:这是我最初的帖子,charlietfl评论说“至于ajax错误处理。如果登录失败……使用真正的REST方法将发送回401状态,然后触发ajax错误处理程序”,这就是为什么我不希望在登录失败时使用200 OK。

首先要了解的是,Django在默认情况下不会强制执行身份验证。。您可以使用auth模块注册用户并对其进行身份验证,但必须明确保护视图。认证应用程序只提供供您使用的API,除非您使用这些API,否则它实际上不会保护任何内容

任何未明确检查身份验证的视图都将对任何人开放

当然,管理员要求您登录,但这是因为管理员应用程序的作者在其代码中包含检查

Django REST框架对此有自己的检查,因此只需要很少的编码,您只需配置每个视图(参见文档):

对于您可能想要保护的任何其他视图,您需要添加一些检查。对于常规函数类型视图,视图上的@login_required装饰器是实现这一点的一种方法。由于您处理的是基于类的视图,请查看以下Django文档:

检查登录状态的另一个选项是使用中间件类。这就是我在当前系统中所做的,因为我们网站上的几乎所有内容都要求用户登录。因此,在中间件类中,我们检查request.user.u是否是匿名的。如果他们是,那么他们只能访问页面的一小部分,如果他们不访问这些页面,我们将他们重定向到登录。中间件在任何视图之前运行,以覆盖整个站点

好的,现在我知道您希望通过ajax请求实际登录用户,而不仅仅是检查他们的访问。。如果您希望控制返回的响应,那么我建议您为登录服务实现自己的视图。比如:

class LoginView(View):
    def get(self, request, *args, **kwargs):
        user = auth.authenticate(
            username=request.GET.get('username'),
            password=request.GET.get('password'))

        # return whatever you want on failure
        if not user or not user.is_active:
            return HttpResponse(status=500)

        auth.login(request, user)
        return HttpResponse('OK')

我没有测试这段代码,但应该非常接近。

您的DRF身份验证和权限设置是什么?@MarkGalloway我正在使用内置的Django Rest Framework身份验证及其默认设置(我做了“from Django.conf.url import include”,然后添加了“url(r'^api auth/),include”('rest\u framework.urls',namespace='rest\u framework'))到我的URL.py)。我使用的默认设置是什么(我没有更改任何内容,我只使用这里讨论的一个URL:@little\u bridie right,我会在之后添加“LoginRequired”混音。但目前,我的问题是,1)如果我尝试使用不正确的用户名/密码登录,AngularJS如何确定它不正确?因为Django返回200 OK状态,而不管登录是否正确。2)如果我确实使用了正确的用户名/密码(将用户名和密码传递给“api auth/login”)Django返回一个200 OK状态代码,但不会将用户重定向到登录\重定向\ URL。如果我转到“api auth/LOGIN”并从那里登录,它只会重定向到LOGIN\u REDIRECT\u URL。好的,那么您正在向何处发出ajax请求?为ajax登录编写自己的特殊登录视图可能更容易。接受用户名和密码作为url参数,然后使用auth模块对其进行身份验证。。user=auth.authenticate(用户名=,密码=),然后auth.login(请求,用户)。。文件:。我将把它添加到我的答案中。在回答“那么你正在向何处发出ajax请求?”的问题时,这是我的请求:“$http.post(“/CMS/api auth/login/”,self.user)”-我更新了我的帖子以显示我的AunglarJS代码。所以基本上,我正在做一个ajax post请求,请求“CMS/api auth/login”(这里讨论的是“api auth”URL:)。哦,