如何在Django REST Framework上启用CORS? reference没什么用,它说我可以通过中间件来做,但我怎么能这样做呢?
答案 0 :(得分:81)
您在问题中引用的链接建议使用django-cors-headers
,其documentation表示安装库
pip install django-cors-headers
然后将其添加到已安装的应用中:
INSTALLED_APPS = (
...
'corsheaders',
...
)
您还需要添加一个中间件类来收听响应:
MIDDLEWARE_CLASSES = (
...
'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.CommonMiddleware',
...
)
您可能还想浏览其the configuration section文档,特别注意各种CORS_ORIGIN_
设置。
答案 1 :(得分:21)
pip install django-cors-headers
然后将其添加到已安装的应用中:
INSTALLED_APPS = (
...
'corsheaders',
...
)
您还需要添加一个中间件类来收听响应:
MIDDLEWARE_CLASSES = (
...
'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.CommonMiddleware',
...
)
CORS_ORIGIN_ALLOW_ALL = True
CORS_ALLOW_CREDENTIALS = True
CORS_ORIGIN_WHITELIST = (
'localhost:3030',
)
CORS_ORIGIN_REGEX_WHITELIST = (
'localhost:3030',
)
更多详情:https://github.com/ottoyiu/django-cors-headers/#configuration
阅读官方文档可以解决几乎所有问题答案 2 :(得分:12)
您可以使用自定义中间件,即使知道最佳选项是使用包django-cors-headers
的测试方法。话虽如此,这是解决方案:
创建以下结构和文件:
- myapp/middleware/__init__.py
from corsMiddleware import corsMiddleware
- myapp/middleware/corsMiddleware.py
class corsMiddleware(object):
def process_response(self, req, resp):
resp["Access-Control-Allow-Origin"] = "*"
return resp
将标记的行添加到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
)
答案 3 :(得分:6)
如果有人回到这个问题并决定编写他们自己的中间件,这是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
答案 4 :(得分:2)
嗯,我不认识,但是:
在这里使用python 3.6和django 2.2
在settings.py中将MIDDLEWARE_CLASSES重命名为MIDDLEWARE起作用。
答案 5 :(得分:1)
对于Django版本> 1.10,根据documentation,可以将自定义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
最后,将此函数的python路径(带有项目根目录)添加到项目settings.py
的MIDDLEWARE列表中:
MIDDLEWARE = [
.
.
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'yourproject.middleware.open_access_middleware'
]
轻松自如!
答案 6 :(得分:0)
您可能还需要将 CorsModel 模型添加到数据库中。尝试刷新时出现异常。
python3 manage.py makemigrations corsheaders
python3 manage.py migrate
答案 7 :(得分:0)
以下是不需要任何外部模块的工作步骤:
步骤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
步骤2:注册中间件
在您的项目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',
]
请记住将 user_registration_app 替换为您在其中创建了custom_cors_middleware.py模块的应用的名称。
您现在可以验证它会将必需的响应标头添加到项目中的所有视图中!
答案 8 :(得分:0)
Django = 2.2.12 django-cors-headers = 3.2.1 djangorestframework = 3.11.0
遵循官方指示无效
最后使用旧的方法进行计算。
添加:
# proj/middlewares.py
from rest_framework.authentication import SessionAuthentication
class CsrfExemptSessionAuthentication(SessionAuthentication):
def enforce_csrf(self, request):
return # To not perform the csrf check previously happening
#proj/settings.py
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'proj.middlewares.CsrfExemptSessionAuthentication',
),
}