我正在尝试使用 Angular 和 Django 设置一个 Web 应用程序,但 CORS 标头有问题。
据我了解,为了在请求中包含来自前端的cookie数据(例如csrf令牌和会话id),我需要在请求中将withCredentials设置为true。所以 GET 请求看起来像
this.http.get(this.url, { withCredentials: true });
。然后浏览器显示
Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at xxx. (Reason: expected ‘true’ in CORS header ‘Access-Control-Allow-Credentials’).
我可以通过使用
response["Access-Control-Allow-Credentials"] = "true"
将标头添加到响应中来解决 GET 请求的问题,但是当我发出 POST 请求时,问题就出现了。在这种情况下,前端会在 POST 之前自动发送 OPTIONS 请求,据我所知,这是标准的,用于检查后端允许发布的内容。但是,我无法为 OPTIONS 请求的响应设置 CORS 标头,因此实际上我无法发送 POST 请求。
有没有办法设置 OPTIONS 响应的标题,或者我一般做错了什么?
是的,有一种方法可以设置 OPTIONS 响应的标头。
您可以通过运行来做到这一点:
pip install django-cors-headers
接下来,将 corsheaders 添加到您的
settings.py
文件中已安装的应用程序和中间件中:
INSTALLED_APPS = [
...
'corsheaders',
...
]
MIDDLEWARE = [
...
'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.CommonMiddleware',
...
]
CORS_ORIGIN_ALLOW_ALL = True
CORS_ALLOW_CREDENTIALS = True
因此,如果您按照上述步骤进行操作,您的 Django 后端将正确响应 OPTIONS 请求并设置正确的 CORS 标头,这样您的 Angular 应用程序将能够发出 POST 请求而不会出现 CORS 问题。