zoukankan      html  css  js  c++  java
  • 用django-cors-headers做跨域

    什么是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提示的:

    ?

    1

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

    如何解决Ajax跨域访问问题?
    解决跨域问题,有两个方法:1.使用jsonp 2.使CORS生效
    使用jsonp方法,需要让服务器端放回jsonp格式的response,如Django可以加jsonp相关的decorator,如:https://coderwall.com/p/k8vb_a/returning-json-jsonp-from-a-django-view-with-a-little-decorator-help由于我不太喜欢这种方式,所以这里略过了,可看后面的参考资料。
    使用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请求数据:

    ?

    1

    2

    3

    4

    5

    6

    7

    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中做一些简单的配置即可,见:https://github.com/ottoyiu/django-cors-headers/现在用起来服务器端完全开放,开启CORS,没有跨域烦恼,真爽!~
    安装django-cors-headers:

    ?

    1

    pip install django-cors-headers

    在settings.py中增加:

    INSTALLED_APPS = (

      ...

      'corsheaders',

      ...

    )

    ...

    MIDDLEWARE_CLASSES = (

      ...

      'corsheaders.middleware.CorsMiddleware',

      'django.middleware.common.CommonMiddleware',

      ...

    )

    #跨域增加忽略

    CORS_ALLOW_CREDENTIALS = True

    CORS_ORIGIN_ALLOW_ALL = True

    CORS_ORIGIN_WHITELIST = ( '*' )

    CORS_ALLOW_METHODS = (

            'DELETE',

            'GET',

            'OPTIONS',

            'PATCH',

            'POST',

            'PUT',

            'VIEW',

    )

    CORS_ALLOW_HEADERS = (

            'XMLHttpRequest',

            'X_FILENAME',

            'accept-encoding',

            'authorization',

            'content-type',

            'dnt',

            'origin',

            'user-agent',

            'x-csrftoken',

            'x-requested-with',

            'Pragma',

    )

       
  • 相关阅读:
    Blender基础操作
    反汇编及linux下edb的下载
    混淆矩阵(confusion_matrix)含义
    Python大数据第三次的作业
    Python的DataFrame基础使用
    Python数据标准化
    爬虫之xpath
    luffy项目上线
    爬虫之selenium
    celery
  • 原文地址:https://www.cnblogs.com/zhangningyang/p/9896415.html
Copyright © 2011-2022 走看看