如何修复加载Django runserver提供的静态文件时出现的cors错误

如何修复加载Django runserver提供的静态文件时出现的cors错误,django,cors,django-cors-headers,Django,Cors,Django Cors Headers,相关信息:Django版本2.2 我已经安装了django cors headers,并将其添加到启用的应用程序中,并将中间件作为第一个中间件添加到中间件设置中 我还配置了以下设置: INSTALLED_APPS = [ ... "corsheaders", "rest_framework", "django.contrib.admin", ... ] MIDDLEWARE = [

相关信息:Django版本2.2

我已经安装了
django cors headers
,并将其添加到启用的应用程序中,并将中间件作为第一个中间件添加到中间件设置中

我还配置了以下设置:


INSTALLED_APPS = [
    ...
    "corsheaders",
    "rest_framework",
    "django.contrib.admin",
    ...
]


MIDDLEWARE = [
    ...
    "corsheaders.middleware.CorsMiddleware",
    "django.contrib.sessions.middleware.SessionMiddleware",
    "django.middleware.common.CommonMiddleware",
    ...
]

CORS_ORIGIN_ALLOW_ALL = True
CORS_ALLOW_CREDENTIALS = True
我的安装程序有两个项目在不同的端口上运行。Django服务器运行在8000上,我的前端运行在8080上

前端发送的所有API请求都与后端工作相对应。但当我尝试加载后端项目提供的一个.js文件时,它失败了,出现以下错误:


Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://127.0.0.1:8000/static/myscript.js. (Reason: CORS header ‘Access-Control-Allow-Origin’ missing)

加载脚本的方法是创建一个新的脚本元素并添加URL
http://127.0.0.1:8000/static/myscript.js
作为脚本标记上src属性的值

当我使用像
https://code.jquery.com/jquery-3.5.1.min.js
而不是
http://127.0.0.1:8000/static/myscript.js
因此,Django runserver提供的静态文件似乎存在一些问题,但我无法理解到底是什么以及为什么

我知道有很多与cors相关的问题,比如,但它们与我的问题无关,或者没有得到回答。另外,我注意到,静态文件中的请求无论如何都会绕过cors中间件,因此,也许我应该在这里做些其他的事情

也许有人能帮我


谢谢

看来我已经找到了答案:

我所做的是将
已安装的应用程序.remove('django.contrib.staticfiles')
添加到开发人员设置中

我创建了一个视图,就像

from django.contrib.staticfiles.views import serve


def cors_serve(request, path, insecure=False, **kwargs):
    kwargs.pop('document_root')
    response = serve(request, path, insecure=insecure, **kwargs)
    response['Access-Control-Allow-Origin'] = '*'
    return response
用于提供静态内容。我将其添加到urlconf中,如下所示:

from utils.views import cors_serve

...

urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT, view=cors_serve)
urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT, view=cors_serve)

这确实为我解决了这个问题。我知道Django文档()建议您可以跳过使用runserver的静态文件,如下所示:
Django admin runserver--nostatic
,但如果我仍然使用
“Django.contrib.staticfiles”,这对我来说绝对没有任何影响
在我的
已安装的应用程序中

基于Odif Yitsaeb的想法,这是一种稍有不同的方法,但是您不需要删除
静态文件
或弄乱
urlpatterns
。只需将以下代码放入您的
设置.py

从django.contrib.staticfiles导入处理程序
#扩展StaticFileHandler,在每个响应中添加“访问控制允许源”
类CORSStaticFilesHandler(handlers.staticFileHandler):
def serve(自我,请求):
响应=超级().服务(请求)
响应['Access-Control-Allow-Origin']='*'
返回响应
#monkeypatch处理程序使用我们的类而不是原始的StaticFileHandler
handlers.staticFileHandler=CORSStaticFilesHandler
注:

  • 不要在生产中使用它(无论如何,您不应该在生产中使用devserver)
  • 在处理任何请求之前,必须尽早对处理程序进行修补。将代码放在
    settings.py中即可