### Django 中使用 `django-cors-headers` 版本 4.7.0 进行跨域 CORS 设置
为了实现跨域资源共享 (CORS),可以利用 `django-cors-headers` 库来简化配置过程。以下是详细的配置说明:
#### 安装依赖库
首先需要安装 `django-cors-headers`,可以通过 pip 工具完成安装:
```bash
pip install django-cors-headers==4.7.0
```
#### 配置 settings.py 文件
在项目的 `settings.py` 文件中进行如下修改:
1. **添加应用到 INSTALLED_APPS**
将 `'corsheaders'` 添加到已有的应用程序列表中。
```python
INSTALLED_APPS = [
...
'corsheaders',
...
]
```
2. **调整中间件顺序**
确保 `'corsheaders.middleware.CorsMiddleware'` 出现在 `'django.middleware.common.CommonMiddleware'` 之前。
```python
MIDDLEWARE = [
...
'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.CommonMiddleware',
...
]
```
3. **定义允许的源地址**
使用 `CORS_ALLOWED_ORIGINS` 来指定哪些域名被允许访问资源[^1]。
```python
CORS_ALLOWED_ORIGINS = [
"http://www.s5.com:8000",
]
```
如果希望开放所有来源,则可启用以下选项(注意生产环境的安全风险):
```python
CORS_ALLOW_ALL_ORIGINS = True
```
4. **其他可选参数**
可以进一步自定义行为,例如支持的方法、头部字段等:
```python
CORS_ALLOW_METHODS = [
"DELETE",
"GET",
"OPTIONS",
"PATCH",
"POST",
"PUT",
]
CORS_ALLOW_HEADERS = [
"accept",
"authorization",
"content-type",
"user-agent",
"x-csrftoken",
"x-requested-with",
]
```
#### URL 和视图函数中的处理
对于特定视图函数,可以直接通过响应对象设置跨域头信息,如示例所示:
```python
from django.http import JsonResponse, HttpResponse
import json
def new_users(request):
user_list = ['lleo', 'tom', 'jack']
obj = HttpResponse(json.dumps(user_list))
obj["Access-Control-Allow-Origin"] = "http://www.s5.com:8000"
return obj
```
或者更推荐的方式是在全局范围内统一管理跨域策略。
#### 测试跨域功能
启动开发服务器并尝试从外部前端页面发起 AJAX 请求验证是否成功获取数据。
---
### 示例代码总结
完整的项目结构可能涉及多个文件协同工作,下面是一个简单的例子展示如何集成上述组件。
**settings.py**
```python
INSTALLED_APPS = [
...
'corsheaders',
]
MIDDLEWARE = [
'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.CommonMiddleware',
...
]
CORS_ALLOWED_ORIGINS = ["http://www.s5.com:8000"]
CORS_ALLOW_METHODS = ["GET", "POST", "OPTIONS"]
CORS_ALLOW_HEADERS = ["Content-Type", "Authorization"]
```
**views.py**
```python
from django.http import JsonResponse
def write_stock_list(request):
data = {"status": "success"}
response = JsonResponse(data)
return response
```
**urls.py**
```python
from django.conf.urls import url
from . import accessdata
urlpatterns = [
url('write/', accessdata.write_stock_list),
]
```
---