Django專案解決跨域問題

ConnorK發表於2021-03-07

官方文件:pypi.org/project/django-cors-heade...

要求

  • 支援Python 3.5 - 3.8
  • 支援Django 1.11 - 3.0

安裝

pip install django-cors-headers

在專案的settings.py檔案配置

  • 註冊應用
INSTALLED_APPS  =  [ 
    ...
    'corsheaders'...
]
  • 註冊中介軟體
MIDDLEWARE  =  [
    ... 
    'corsheaders.middleware.CorsMiddleware' ,  # 註冊中介軟體
    'django.middleware.common.CommonMiddleware'... 
]
  • 設定允許的來源
# 允許全部來源
CORS_ORIGIN_ALLOW_ALL  = True  # 如果為True,將不使用白名單,並且將接受所有來源。預設為False。

# 白名單
CORS_ORIGIN_WHITELIST  =  [
    "https://example.com",
    "https://sub.example.com",
    "http:// localhost:8080",
    "http://127.0.0.1:9000"
]

# 白名單也可使用正則
CORS_ORIGIN_REGEX_WHITELIST  =  [
    r"^https://\w+\.example\.com$",
]

以上的配置基本已經足夠,以下為可選配置。

  • 實際請求所允許的HTTP方式列表
# 預設為
CORS_ALLOW_METHODS  =  [ 
    'DELETE''GET''OPTIONS''PATCH''POST''PUT']

# 當有自定義的方式時,可使用以下配置擴充套件
from corsheaders.defaults import default_methods

CORS_ALLOW_METHODS = list(default_methods) + [
    'POKE',
]
  • 實際請求時可以使用的非標準HTTP header 的列表
# 預設為
CORS_ALLOW_HEADERS  =  [ 
    ''accept' ,
    'accept-encoding''authorization''content-type''dnt''origin''user-agent''x-csrftoken''x-requested-with']

# 也可自定義擴充套件
from corsheaders.defaults import default_headers

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

訊號的使用

場景:需要將白名單中允許的地址設定為動態可配置的,比如就是資料庫中的一張表,可在後臺新增或者刪除可允許的地址,此時可用到corsheaders.signals模組中的check_request_enabled來解決。

# myapp/handlers.py
from corsheaders.signals import check_request_enabled

from myapp.models import MySite

def cors_allow_mysites(sender, request, **kwargs):
    return MySite.objects.filter(host=request.host).exists()

check_request_enabled.connect(cors_allow_mysites)
# myapp/__init__.py

default_app_config = 'myapp.apps.MyAppConfig'
# myapp/apps.py

from django.apps import AppConfig

class MyAppConfig(AppConfig):
    name = 'myapp'

    def ready(self):
        # Makes sure all signal handlers are connected
        from myapp import handlers  # noqa
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章