Skip to main content
 首页 » 编程设计

python之Django 和 Angular POST 请求之CSRF 失败

2025年05月04日13mate10pro

我已经在本地使用 Django REST API Framework 部署了一个 API。 我的移动应用程序是使用 Ionic 框架(使用 AngularJS)开发的。

在我的应用程序中,当我想在 Ajax 中请求(POST 方法)时,出现以下错误:

CSRF Failed: CSRF token missing or incorrect.

我在Django REST API集成项目中请求时没有收到这个错误。

我在网上研究了解决方案,但没有一个奏效。

项目信息:

Django 文件settings.py:

MIDDLEWARE_CLASSES = ( 
'django.contrib.sessions.middleware.SessionMiddleware', 
'corsheaders.middleware.CorsMiddleware', 
'klipix.django-crossdomainxhr-middleware.OrganizationMiddleware', 
'django.middleware.common.CommonMiddleware', 
'django.middleware.csrf.CsrfViewMiddleware', 
'django.contrib.auth.middleware.AuthenticationMiddleware', 
'django.contrib.auth.middleware.SessionAuthenticationMiddleware', 
'django.contrib.messages.middleware.MessageMiddleware', 
'django.middleware.clickjacking.XFrameOptionsMiddleware', 
) 
 
CORS_ORIGIN_ALLOW_ALL = True 
CORS_ALLOW_CREDENTIALS = True 

我使用了 TokenAuthentication 方法 ( http://www.django-rest-framework.org/api-guide/authentication/#tokenauthentication )。我的 django-crossdomainxhr-middleware.py 文件:

class OrganizationMiddleware(object): 
 
def process_view(self, request, view_func, view_args, view_kwargs): 
header_token = request.META.get('HTTP_AUTHORIZATION', None) 
if header_token is not None: 
  try: 
    token = sub('Token ', '', request.META.get('HTTP_AUTHORIZATION', None)) 
    token_obj = Token.objects.get(key = token) 
    request.user = token_obj.user 
  except Token.DoesNotExist: 
    pass 

在我的应用程序中,我尝试添加此解决方案,但没有成功:

angular.module('starter', ['ionic']) 
.run(function($rootScope, $ionicPlatform, $http) { 
 
  $http.defaults.xsrfHeaderName = 'X-CSRFToken'; 
  $http.defaults.xsrfCookieName = 'csrftoken'; 
 
.config(function($stateProvider, $urlRouterProvider, $httpProvider) { 
 
  $httpProvider.defaults.withCredentials = true; 
  $httpProvider.defaults.xsrfCookieName = 'csrftoken'; 
  $httpProvider.defaults.xsrfHeaderName = 'X-CSRFToken'; 

请为此提供宝贵的意见。

请您参考如下方法:

对我来说,这适用于 angular 1.4:

var myApp = angular.module('myApp', []).config(function($httpProvider) { 
    $httpProvider.defaults.xsrfCookieName = 'csrftoken' 
    $httpProvider.defaults.xsrfHeaderName = 'X-CSRFToken' 
});