Python中如何解决Django跨域问题

我现在用 Django 写了一个测试的网页用于测试如果不用模板如何进行前后端信息交互,正常访问成功返回一个 json 数据,在页面中用 jquery 发出请求,出现了浏览器跨域问题,应该如何解决。

<script> $.get('http://127.0.0.1:8000/index/index',function(data){ alert('data='+data); });

</script>

浏览器报错 XMLHttpRequest cannot load http://127.0.0.1:8000/index/index. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access.


Python中如何解决Django跨域问题

3 回复

在Django里解决跨域问题,最直接的办法就是用django-cors-headers这个第三方库。这玩意儿专门处理CORS(跨源资源共享),配置起来很简单。

首先,安装它:

pip install django-cors-headers

然后,在你的settings.py文件里加几行配置就行:

  1. 'corsheaders'加到INSTALLED_APPS里:

    INSTALLED_APPS = [
        ...
        'corsheaders',
        ...
    ]
    
  2. 'corsheaders.middleware.CorsMiddleware'这个中间件加到MIDDLEWARE的最前面(顺序很重要):

    MIDDLEWARE = [
        'corsheaders.middleware.CorsMiddleware',  # 放第一个
        'django.middleware.common.CommonMiddleware',
        ...
    ]
    
  3. 最后,设置允许跨域的来源。最省事的就是允许所有来源(开发环境用用还行):

    CORS_ALLOW_ALL_ORIGINS = True
    

    要是上生产环境,最好指定具体的域名,这样更安全:

    CORS_ALLOWED_ORIGINS = [
        "https://你的前端域名.com",
        "http://localhost:3000",  # 本地开发常用
    ]
    

搞定这几步,你的Django后端就能正常响应前端跨域请求了。如果前端发请求时还带了Cookie之类的凭证,记得把CORS_ALLOW_CREDENTIALS也设成True

总结:用django-cors-headers库,配一下中间件和允许的源就行。


用装饰器

回到顶部