python django-cors-headers不允许来自允许来源的请求

5rgfhyps  于 2023-05-16  发布在  Python
关注(0)|答案(4)|浏览(254)

我面临的问题是我无法从我的NextJS前端获取现有用户。我使用的后端框架是Django(沿着django-cors-headers包)。django-cors-headers不允许特定的HTTP请求,而它应该。
我的next.config.js包含重写,以便我可以访问我的后端。

async redirects() {
    return [
      {
        source: '/api/:path*',
        destination: 'http://localhost:8000/:path*/',
        permanent: true,
      },
    ]
  },

我的django-cors-headers设置看起来像这样:

# CORS

CSRF_TRUSTED_ORIGINS = [
    'http://localhost:3000',
]

CORS_ALLOWED_ORIGINS = [
    'http://localhost:3000',
    'http://localhost:8000',
    'http://127.0.0.1:3000',
    'http://127.0.0.1:8000',
]

CORS_ALLOW_ALL_ORIGINS = True

失败的请求尝试获取ID为1的用户。此用户已存在,因此此请求应成功。

fetch(`/api/users/${String(userId)}/`, {
    mode: 'cors',
    credentials: 'include',
    headers: {
      'Content-Type': 'application/json',
    },
  })

然而,我从请求中得到的唯一结果是一条关于CORS的错误消息。

Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://localhost:8000/users/1.
(Reason: CORS header ‘Access-Control-Allow-Origin’ missing).
Status code: 301.

看起来我的django-cors-headers设置错误。但我可以获得我的JWT代币。以下请求成功。

fetch('/api/token', {
    method: 'POST',
    mode: 'cors',
    headers: {
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({
      email: mail,
      password,
    }),
  })
aelbi1ox

aelbi1ox1#

我几乎尝试了所有的方法,除了仔细检查我的中间件的加载顺序。我通过从以下加载顺序修复了我的问题

MIDDLEWARE = [
    # Default
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    # CORS
    'corsheaders.middleware.CorsMiddleware',
]

。。。到

MIDDLEWARE = [
    # CORS
    'corsheaders.middleware.CorsMiddleware',
    # Default
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

我知道这必须是简单的事情,但现在我只是觉得自己像个大白痴...

vhmi4jdf

vhmi4jdf2#

这是django cors header的设置。单位:settings.py

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    # add this 
    'corsheaders',        
]

MIDDLEWARE = [
    # add this
    'corsheaders.middleware.CorsMiddleware',
    'whitenoise.middleware.WhiteNoiseMiddleware',
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

 # set this
 CORS_ALLOW_ALL_ORIGINS=True

Status code: 301表示请求的资源无效,因此请求应重定向到正确的URL。很可能您正在向无效的端点发送请求

umuewwlo

umuewwlo3#

对于CORS,我们有几件事需要考虑。你可以在这里找到更多:https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers,转到访问控制链接。
你上面的配置,你已经设置好了:

  • CORS_ALLOWED_ORIGINS:http://localhost:8000,...
  • CORS_ALLOW_METHODS:“DELETE”、“GET”、“OPTIONS”、“PATCH”、“POST”、“PUT”(默认值)
  • CORS_ALLOW_CREDENTIALS:False(默认)
  • CORS_ALLOW_HEADERS = [“accept”,“accept-encoding”,“authorization”,“content-type”,“dnt”,“origin”,“user-agent”,“x-csrftoken”,“x-requested-with”,](默认)

因此,如果您的应用使用凭据,请将CORS_ALLOW_CREDENTIALS更改为True。如果它仍然不起作用,请检查您的请求头,确保其中没有特殊的头,如果您的请求中有特殊的头,最好在CORS_ALLOW_HEADERS内。

bvhaajcl

bvhaajcl4#

我也有同样的问题,我试图在react app中调用Django API,这个错误困扰了我几天,但我找到了解决方案。
1.首先检查网络上所有建议的解决方案,例如:在Django中安装corsheaders,并将其添加到setting.py中的安装应用程序和MIDDLEWARE中。所以下一步:在任何浏览器中打开网络选项卡,我们必须检查两个重要的标题。在请求期间。1.请求报头中的访问控制请求报头。2.响应头中的Access-Control-Allow-Headers。
1.如图所示,请求头中的Access-Control-Request-Headers是content-type,但响应中的Access-Control-Allow-Headers是http://localhost:3000,content-type。这就是问题所在。enter image description here
1.要解决这个问题,请转到settings.py,在后端检查CORS_ALLOW_HEADERS并删除除'content-type'之外的所有内容。所以再查一遍我的窃听器不见了。

相关问题