📅  最后修改于: 2023-12-03 15:09:57.374000             🧑  作者: Mango
在 Django Rest 框架中,CORS_ALLOWED_ORIGINS 是一个重要的设置项,它用于指定哪些源可以跨域访问 API。默认情况下,它是一个字符串列表,包含所有合法的域名。但是有时候我们需要根据用户输入或者其他条件动态地填充这个列表,本文将介绍如何实现这个功能。
我们可以在 settings.py 文件中读取环境变量,然后将其作为 CORS_ALLOWED_ORIGINS 的值。这样做的好处是可以在不修改代码的情况下改变允许跨域的域名。
import os
CORS_ALLOWED_ORIGINS = os.environ.get('CORS_ALLOWED_ORIGINS').split(',')
然后在启动服务时,可以通过设置环境变量来动态改变允许跨域的域名:
CORS_ALLOWED_ORIGINS=http://example.com,https://example.org python manage.py runserver
我们可以编写一个中间件,在每个请求到达服务器之前,根据需要动态修改 CORS_ALLOWED_ORIGINS 的值。
class CorsMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
# 根据需要动态修改 allowed_origins
cors_allowed_origins = ['http://example.com', 'https://example.org']
response = self.get_response(request)
# 设置响应头
response['Access-Control-Allow-Origin'] = ','.join(cors_allowed_origins)
return response
然后在 settings.py 文件中将中间件添加到 MIDDLEWARE 中:
MIDDLEWARE = [
# ... 其他中间件 ...
'path.to.CorsMiddleware',
]
通过这种方式,我们可以在服务器运行期间根据业务需要动态改变允许跨域的域名。
在某些情况下,我们需要根据 URL 或其他条件来动态修改允许跨域的域名。在这种情况下,我们可以使用动态路由配置来实现。
# urls.py
from django.urls import path
from .views import my_api_view
urlpatterns = [
path('api/<cors_origin>/', my_api_view),
]
然后在视图中可以根据参数动态组装允许跨域的域名:
# views.py
from django.http import HttpResponse
def my_api_view(request, cors_origin):
allowed_origins = [f'http://{cors_origin}.example.com']
response = HttpResponse('Hello, world!')
response['Access-Control-Allow-Origin'] = ','.join(allowed_origins)
return response
通过这种方式,我们可以在 URL 中指定允许跨域的域名,从而实现动态修改的功能。
以上是三种常见的动态修改 CORS_ALLOWED_ORIGINS 设置的方法,我们可以根据实际需要选择适合自己的方法。无论使用哪种方法,都应该注意安全性和可维护性,尽可能避免不必要的安全风险和代码冗余。