Jul*_*ins 69 python django middleware cors django-rest-framework
如何在我的Django REST框架上启用CORS?该参考文献没有多大帮助,它说我可以用中间件做,但我怎么能这样做?
Chr*_*ris 102
您在问题中引用的链接建议使用django-cors-headers,其文档说明要安装库
pip install django-cors-headers
Run Code Online (Sandbox Code Playgroud)
然后将其添加到已安装的应用中:
INSTALLED_APPS = (
...
'corsheaders',
...
)
Run Code Online (Sandbox Code Playgroud)
您还需要添加一个中间件类来监听响应:
MIDDLEWARE_CLASSES = (
...
'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.CommonMiddleware',
...
)
Run Code Online (Sandbox Code Playgroud)
您可能还想浏览其文档的配置部分,特别注意各种CORS_ORIGIN_设置.
lik*_*ppy 31
pip install django-cors-headers
Run Code Online (Sandbox Code Playgroud)
然后将其添加到已安装的应用中:
INSTALLED_APPS = (
...
'corsheaders',
...
)
Run Code Online (Sandbox Code Playgroud)
您还需要添加一个中间件类来监听响应:
MIDDLEWARE_CLASSES = (
...
'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.CommonMiddleware',
...
)
CORS_ORIGIN_ALLOW_ALL = True
CORS_ALLOW_CREDENTIALS = True
CORS_ORIGIN_WHITELIST = [
'http://localhost:3030',
]
CORS_ORIGIN_REGEX_WHITELIST = [
'http://localhost:3030',
]
Run Code Online (Sandbox Code Playgroud)
更多细节:https://github.com/ottoyiu/django-cors-headers/#configuration
阅读官方文档可以解决几乎所有问题
Sub*_*lik 14
对于所有拥有最新版本 Django v3.xx 的人来说,已于2021 年更新,下面给出了允许来自任何来源的 CORS 的步骤。
第1步:安装所需的库
pip install django-cors-headers
Run Code Online (Sandbox Code Playgroud)
第 2 步:然后在INSTALLED_APPS中的适当位置添加settings.py- 在rest_framework应用程序之后和之前myapp
'rest_framework',
'corsheaders',
'myapp.apps.MyAppConfig',
Run Code Online (Sandbox Code Playgroud)
第 3 步:允许 api 的来源(在 内部settings.py)
CORS_ORIGIN_WHITELIST = (
'http://localhost:3000', # for localhost (REACT Default)
'http://192.168.10.45:3000', # for network
)
Run Code Online (Sandbox Code Playgroud)
Jul*_*ins 12
您可以使用自定义中间件,即使知道最佳选项是使用包的测试方法django-cors-headers.话虽如此,这是解决方案:
创建以下结构和文件:
- myapp/middleware/__init__.py
from corsMiddleware import corsMiddleware
Run Code Online (Sandbox Code Playgroud)
- myapp/middleware/corsMiddleware.py
class corsMiddleware(object):
def process_response(self, req, resp):
resp["Access-Control-Allow-Origin"] = "*"
return resp
Run Code Online (Sandbox Code Playgroud)
添加到settings.py标记的行:
MIDDLEWARE_CLASSES = (
"django.contrib.sessions.middleware.SessionMiddleware",
"django.middleware.common.CommonMiddleware",
"django.middleware.csrf.CsrfViewMiddleware",
# Now we add here our custom middleware
'app_name.middleware.corsMiddleware' <---- this line
)
Run Code Online (Sandbox Code Playgroud)
Jul*_*s-Z 12
更新了 2022 年并添加了新的用例
当您使用带有选项的 Axios POST 时withCredentials: true,需要考虑一些其他选项。
我使用这个特定案例通过基本或/和会话登录进行身份验证。
避免出现错误消息:
对预检请求的响应未通过访问控制检查:响应中“Access-Control-Allow-Credentials”标头的值为“”,当请求的凭据模式为“include”时,该值必须为“true”。XMLHttpRequest 发起的请求的凭据模式由 withCredentials 属性控制。
还有上面别人提到的。我用这种方式解决了这个问题。
[IP地址来自我本地的示例,请记住更改它]
设置.py
INSTALLED_APPS = [
...
'rest_framework',
'corsheaders',
'rest_framework.authtoken',
...
]
ALLOWED_HOSTS = ["localhost","192.168.0.50"]
CORS_ALLOW_CREDENTIALS = True
CORS_ORIGIN_WHITELIST = (
'http://localhost:3000', # for localhost (REACT Default)
'http://192.168.0.50:3000', # for network
'http://localhost:8080', # for localhost (Developlemt)
'http://192.168.0.50:8080', # for network (Development)
)
CSRF_TRUSTED_ORIGINS = [
'http://localhost:3000', # for localhost (REACT Default)
'http://192.168.0.50:3000', # for network
'http://localhost:8080', # for localhost (Developlemt)
'http://192.168.0.50:8080', # for network (Development)
]
MIDDLEWARE = [
...
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'corsheaders.middleware.CorsMiddleware',
...
Run Code Online (Sandbox Code Playgroud)
]
在浏览器上,必须发送 Axios 请求标头,并且在服务器站点上必须允许该标头。如果不是,则会出现错误消息。
预检响应中的 Access-Control-Allow-Headers 不允许请求标头字段 access-control-allow-origin。
到目前为止,我们都在玩头球。如果需要,您可以添加更多标头,例如:
CORS_ALLOW_HEADERS = [
'accept',
'accept-encoding',
'authorization',
'content-type',
'dnt',
'origin',
'user-agent',
'x-csrftoken',
'x-requested-with',
]
Run Code Online (Sandbox Code Playgroud)
干杯:)
如果有人回到这个问题并决定编写自己的中间件,这是Django新风格中间件的代码示例 -
class CORSMiddleware(object):
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
response = self.get_response(request)
response["Access-Control-Allow-Origin"] = "*"
return response
Run Code Online (Sandbox Code Playgroud)
根据文档,对于Django版本1.1或更高版本,可以将自定义MIDDLEWARE编写为函数,例如在文件中:(yourproject/middleware.py作为的同级文件settings.py):
def open_access_middleware(get_response):
def middleware(request):
response = get_response(request)
response["Access-Control-Allow-Origin"] = "*"
response["Access-Control-Allow-Headers"] = "*"
return response
return middleware
Run Code Online (Sandbox Code Playgroud)
最后,将此函数的python路径(写入项目的根目录)添加到项目的MIDDLEWARE列表中settings.py:
MIDDLEWARE = [
.
.
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'yourproject.middleware.open_access_middleware'
]
Run Code Online (Sandbox Code Playgroud)
十分简单!
好吧,我不认识大家,但是:
这里使用 python 3.6 和 django 2.2
在 settings.py 中将 MIDDLEWARE_CLASSES 重命名为 MIDDLEWARE 有效。
以下是不需要任何外部模块的工作步骤:
第 1 步:在您的应用中创建一个模块。
例如,假设我们有一个名为user_registration_app的应用程序。探索 user_registration_app 并创建一个新文件。
让我们称之为custom_cors_middleware.py
粘贴以下类定义:
class CustomCorsMiddleware:
def __init__(self, get_response):
self.get_response = get_response
# One-time configuration and initialization.
def __call__(self, request):
# Code to be executed for each request before
# the view (and later middleware) are called.
response = self.get_response(request)
response["Access-Control-Allow-Origin"] = "*"
response["Access-Control-Allow-Headers"] = "*"
# Code to be executed for each request/response after
# the view is called.
return response
Run Code Online (Sandbox Code Playgroud)
第二步:注册一个中间件
在您的项目 settings.py 文件中,添加这一行
'user_registration_app.custom_cors_middleware.CustomCorsMiddleware'
例如:
MIDDLEWARE = [
'user_registration_app.custom_cors_middleware.CustomCorsMiddleware', # ADD THIS LINE BEFORE CommonMiddleware
...
'django.middleware.common.CommonMiddleware',
]
Run Code Online (Sandbox Code Playgroud)
请记住将user_registration_app替换为您在其中创建 custom_cors_middleware.py 模块的应用程序的名称。
您现在可以验证它会将所需的响应标头添加到项目中的所有视图!
首先安装django包
pip install django-cors-headers
Run Code Online (Sandbox Code Playgroud)
并添加到设置文件中的应用程序
INSTALLED_APPS = (
...
'corsheaders',
...
)
Run Code Online (Sandbox Code Playgroud)
然后将cors中间件添加到设置文件中
MIDDLEWARE = [
...,
'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.CommonMiddleware',
...,
]
Run Code Online (Sandbox Code Playgroud)
最后添加跨域白名单
#CORS_ORIGIN_ALLOW_ALL = True
#CORS_ALLOW_CREDENTIALS = True
#CORS_ALLOW_HEADERS = ['*']
CORS_ORIGIN_WHITELIST = ('http://localhost:5000',)
Run Code Online (Sandbox Code Playgroud)
这将很容易解决cors错误。快乐编码
| 归档时间: |
|
| 查看次数: |
60646 次 |
| 最近记录: |