如何使用 django-cors-headers 让我的 API 正常工作而不会出现 405 错误
Posted
技术标签:
【中文标题】如何使用 django-cors-headers 让我的 API 正常工作而不会出现 405 错误【英文标题】:How do I get my API with django-cors-headers working without 405 error 【发布时间】:2021-05-01 12:03:42 【问题描述】:我在其他关于 CORS 和 django 的帖子中找不到我的答案。因此,经过一整天的时间弄清楚我做错了什么,我在这里问我的问题。
我的前端是 VUE.js,这个应用正在使用 Django 和 djangoRestFramework 在 DigitalOcean.com 应用服务器上对我的后端进行 API 调用。
fetch( 'https://someurl.ondigitalocean.app/api/user/token',
method: 'POST',
headers:
'Content-Type': 'application/json',
,
body: JSON.stringify( email: 'emai@email.com', password: 'password' ),
,
).then(function(response)
if (response.ok)
return response.json()
).then(function(data)
console.log(data)
)
这会发布一个接收令牌的帖子。此调用仅用于测试目的。 API 工作正常,为了测试,我使用默认的 django 浏览器界面,而且我的所有单元测试都正常。
我使用 django-cors-headers 作为中间件,并在我的设置文件中将 corsheaders 添加到我的“APP”和“MIDDLEWARE”中。
这些是我的设置:
CORS_ALLOWED_ORIGINS = [
"http://maf-internet.nl",
"http://localhost:8080",
"http://127.0.0.1:8000"
]
CSRF_TRUSTED_ORIGINS = [
"http://maf-internet.nl",
]
CORS_ALLOW_ALL_ORIGINS = True
CORS_ALLOW_METHODS = [
'DELETE',
'GET',
'OPTIONS',
'PATCH',
'POST',
'PUT',
]
CORS_ALLOW_HEADERS = [
'accept',
'accept-encoding',
'authorization',
'content-type',
'dnt',
'origin',
'user-agent',
'x-csrftoken',
'x-requested-with',
]
这些是我的包裹:
Django>= 2.2, <2.2.2
djangorestframework>=3.9.0,<3.10.0
psycopg2-binary
dj-database-url
gunicorn
django-cors-headers>=3.7.0
flake8>=3.6.0,<3.7.0
Digital Ocean 也有一个 CORS 起源的条目。我这里加了前端域,结果还是一样。在这里你可以看到我的错误 405。
我只是不明白我做错了什么。可能是什么问题?
【问题讨论】:
【参考方案1】:已解决,我必须使用 https 保护客户端域。我不知道,为了测试,我认为使用 HTTP 域就可以了。错误的!您需要一个 Https 域来与 DigitalOcena 应用程序上的 django-rest-framework 和 django-cors-headers 对话。
【讨论】:
【参考方案2】:您可以使用这个django-cors-headers 库来解决您的问题。
【讨论】:
【参考方案3】:尝试pip install django-cors-middleware
并为我工作而无需做任何事情,只需确保您的中间件中有“corsheaders.middleware.CorsMiddleware”
【讨论】:
以上是关于如何使用 django-cors-headers 让我的 API 正常工作而不会出现 405 错误的主要内容,如果未能解决你的问题,请参考以下文章
使用 Postman 时 django-cors-header 无法按预期工作
即使使用 django-cors-headers 也得到 304 响应
django-cors-headers 和 nginx 配置:预检响应缺少 CORS 标头
我正在使用 angularjs 和 django-cors-headers 然后给出“这对于需要预检的跨域请求是不允许的。”