视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
Python的Django应用程序解决AJAX跨域访问
2020-11-27 14:26:14 责编:小采
文档

针对Django中在编写供AJAX调用的API时碰到的跨域问题,我们来总结下Python的Django应用程序解决AJAX跨域访问问题的方法,其中使用GitHub上开源分享的django-cors-headers尤其推荐

引子
使用Django在服务器端写了一个API,返回一个JSON数据。使用Ajax调用该API:

但是,Chrome浏览器提示错误:

No 'Access-Control-Allow-Origin' header is present on the requested resource.

经过一番Google发现这个问题是——CORS导致的。

什么是CORS?
CORS(跨域资源共享,Cross-Origin Resource Sharing)是一种跨域访问的机制,可以让Ajax实现跨域访问。
其实,在服务器的response header中,加入“Access-Control-Allow-Origin: *”即可支持CORS,非常的简单,apache/nginx等怎么配置,见参考文档。
举个例子:

  • API部署在DomainA上;

  • Ajax文件部署在DomainB上,Ajax文件会向API发送请求,返回数据;

  • 用户通过DomainC访问DomainB的Ajax文件,请求数据

  • 以上过程就发生了跨域访问。如果直接使用Ajax来请求就会失败,就像Chrome提示的:

    No 'Access-Control-Allow-Origin' header is present on the requested resource.

    如何解决Ajax跨域访问问题?
    解决跨域问题,有两个方法:1.使用jsonp 2.使CORS生效
    使用jsonp方法,需要让服务器端放回jsonp格式的response,如Django可以加jsonp相关的decorator,如:http://www.gxlcms.com/由于我不太喜欢这种方式,所以这里略过了,可看后面的参考资料。
    使用CORS:这个用起来比较方便,现在大多数浏览器都支持了,且我web服务器完全开放给别人调用,所以比较推荐CORS。
    1.使用JSONP
    使用Ajax获取json数据时,存在跨域的。不过,在Web页面上调用js的script脚本文件时却不受跨域的影响,JSONP就是利用这个来实现跨域的传输。因此,我们需要将Ajax调用中的dataType从JSON改为JSONP(相应的API也需要支持JSONP)格式。
    JSONP只能用于GET请求。

    2.直接修改Django中的views.py文件
    修改views.py中对应API的实现函数,允许其他域通过Ajax请求数据:

    def myview(_request):
     response = HttpResponse(json.dumps({"key": "value", "key2": "value"}))
     response["Access-Control-Allow-Origin"] = "*"
     response["Access-Control-Allow-Methods"] = "POST, GET, OPTIONS"
     response["Access-Control-Max-Age"] = "1000"
     response["Access-Control-Allow-Headers"] = "*"
     return response

    3.安装django-cors-headers
    这里还有一各发现!在Django中,有人开发了CORS-header的middleware,只在settings.py中做一些简单的配置即可,见:http://www.gxlcms.com/现在用起来服务器端完全开放,开启CORS,没有跨域烦恼,真爽!~
    安装django-cors-headers:

    pip install django-cors-headers

    在settings.py中增加:

    INSTALLED_APPS = (
     ...
     'corsheaders',
     ...
    )
    
    ...
    
    MIDDLEWARE_CLASSES = (
     ...
     'corsheaders.middleware.CorsMiddleware',
     'django.middleware.common.CommonMiddleware',
     ...
    )

    可以配置允许跨域访问的白名单或者直接设置为允许所有的跨域访问,具体的配置可以看看他们的github页说明。

    更多Python的Django应用程序解决AJAX跨域访问相关文章请关注PHP中文网!

    下载本文
    显示全文
    专题