Django默认是不支持跨域操作的,如果其他Web页面中需要使用到iframe标签将Django项目引用,是需要Django项目自身支持跨域操作,才能够正常使用的。
我们可以在命令行中红通过pip install django-cors-headers来安装django-cors-headers库来解决跨域支持的问题。
django-cors-headers安装完成后,需要对Django项目的settings.py文件添加一些配置。

settings.py相关配置

INSTALLEDAPPS

    INSTALLEDAPPS = [
        ...
        "corsheaders",
    ]

MIDDLEWARE(Django1.10之前的版本使用MIDDLEWARE_CLASSES)

MIDDLEWARE = [
    ...
    "corsheaders.middleware.CorsMiddleware",
    "django.middleware.commonm.CommonMiddleware",
    ...
]

CorsMiddleware应尽可能放置再可以生成相应的任何中间件之前,例如Django的CommonMiddleware。如果不是在之前,将无法将CORS表头添加到这些响应中。

CORSORIGINALLOWALL

默认为Fasle。设置为True时,将不使用白名单,并将接受所有的来源。

CORSORIGIN_WHITELIST

默认为[]。授权进行跨站点HTTP请求的来源列表。
示例:

CORS_ORIGIN_WHITELIST = [
    "http://www.example.com",
    "http://localhost:8000",
    "http://127.0.0.1:8080",
]

CORSORIGINREGEX_WHITELIST

默认为[]。表示与授权进行跨站点HTTP强求的Origins匹配的正则表达式的字符串列表。
示例:

CORS_ORIGIN_REGEX_WHITELIST = [
    r"^https://\w+\.example\.com$",
]

CORSURLSREGEX

默认为r'^.*$',即匹配所有的URL。一个正则表达式,用来限制将为其发送CORS标头的URL。

CORSALLMETHODS

实际允许的HTTP请求方式列表,默认为

CORS_ALLOW_METHODS  = [
     'DELETE',
     'GET',
     'OPTIONS',
     'PATCH',
     'POST',
     'PUT',
]

可以通过from corsheaders.defaultsdefault_methods import default_methods导入默认值,并进行扩展。

from corsheaders.defaults import default_methods

CORS_ALLOW_METHODS = list(default_methods) + [
    'POKE',
]

CORSALLOWHEARDER

发出实际请求时可以使用的非标准的HTTP标头列表,默认为

CORS_ALLOW_HEADERS = [
    'accept',
    'accept-encoding',
    'authorization',
    'content-type',
    'dnt',
    'origin',
    'user-agent',
    'x-csrftoken',
    'x-requested-with',
]

可以通过from corsheaders.defaultsdefault_methods import default_headers导入默认值,并进行扩展。

from corsheaders.defaults import default_headers

CORS_ALLOW_HEADERS  = list(default_headers ) + [
    'my-custom-header',
]

CORSEXPOSEHEADERS

默认为[]。要向浏览器公开的HTTP标头列表。

CORSPREFLIGHTMAXAGE

默认为86400(一天)。客户端/浏览器可以缓存预响应的描述。如果这是0(或任何假值),则不会发送maxage标头。

CORSALLOWCREDENTIALS

默认为False。如果为True,cookie将被允许包含在跨站点请求中。
Django2.1版本添加了SESSIONCOOKIESAMESITE的设置,默认为”LAX”,它将阻止Django的cookie, session被跨域发送。CORSALLOWCREDENTIALS设置为True时,需要将SESSIONCOOKIESAMESITE设置为None。
Django2.1版本还添加了对CSRFCOOKIESAMESITE的设置,默认值为”LAX”,它将组织Django的csrf cookie的跨域使用。需要将CSRFCOOKIESAMESITE设置为None,才可以保证csrf跨域的正常使用。

CSRF集成

很多网站都会使用Django提供的跨站点请求伪造保护。但是CORS和CSRF是分开的,Django无法使用CORS配置来免除站点Referer对安全请求所造成的检查。需要对CSRFTRUSTEDORIGINS进行设置。
示例:

CORS_ORIGIN_WHITELIST  = [
     'http://change.allowed.com',
] CSRF_TRUSTED_ORIGINS = [
     'change.allowed.com',
]

CSRF_TRUSTED_ORISINS是在Django1.9引入的。在Django1.9之前的版本,需要将CORS_REPLACE_HTTPS_REFERER设置为True,CorsMiddleware则会Referer在CORS检查通过时将标头更改为将传递Django的CSRF检查的内容。其默认值为False。
并在MIDDLEWARE_CLASSES中添加以下设置:

MIDDLEWARE_CLASSES = [
    ...
    'corsheaders.middleware.CorsMiddleware',
    ...
    'django.middleware.csrf.CsrfViewMiddleware',
    'corsheaders.middleware.CorsPostCsrfMiddleware',
    ...
]

iframe标签引用

Django中间件中的django.middleware.clickjacking.XFrameOptionsMiddleware将会对iframe标签进行限制,被其他域名的iframe标签引用时,将不会显示页面。可以通过下面的方法进行允许。

  1. 在中间件中注释掉django.middleware.clickjacking.XFrameOptionsMiddleware
  2. settings.py中添加对X_FRAME_OPTIONS的设置, 其默认值为SAMEORIGIN
    示例:
    X_FRAME_OPTIONS = 'ALLOWALL'  # 表示允许所有的域名使用