要解决跨域请求问题(CORS),你需要在后端配置允许跨域请求的响应头。在 Django 中,可以使用 django-cors-headers 库来轻松处理跨域请求。

解决方案

  1. 安装 django-cors-headers

    首先,你需要安装 django-cors-headers 库。你可以通过 pip 安装:

    pip install django-cors-headers
    
  2. 配置 settings.py

    settings.py 文件中,添加 corsheadersINSTALLED_APPS,并在 MIDDLEWARE 中添加 CorsMiddleware。确保 CorsMiddlewareCommonMiddleware 之前。

    INSTALLED_APPS = [
        ...
        'corsheaders',
        ...
    ]
    
    MIDDLEWARE = [
        ...
        'corsheaders.middleware.CorsMiddleware',
        'django.middleware.common.CommonMiddleware',
        ...
    ]
    
    # 允许所有域名跨域访问
    CORS_ALLOW_ALL_ORIGINS = True
    
    # 如果你只想允许特定的域名跨域访问,可以使用以下配置
    # CORS_ALLOWED_ORIGINS = [
    #     "http://localhost:63342",
    #     "https://yourdomain.com",
    # ]
    

    CORS_ALLOW_ALL_ORIGINS = True 允许所有域名跨域访问。
    CORS_ALLOWED_ORIGINS 允许你指定允许跨域访问的域名列表。

  3. 重启 Django 服务

    修改完 settings.py 后,重启你的 Django 服务以使配置生效。

如果你不想使用 django-cors-headers

如果你不想使用第三方库,也可以手动在视图函数中添加 CORS 头。不过这种方式不够灵活,且容易出错。

from django.http import JsonResponse

def generator_bid_document(request):
    ai_upload_service = AIUploadService()
    ai_ready_call_directory = None
    try:
        uploaded_file, file_name, model_label = ai_upload_service.extract_file_and_metadata(request)
        ai_ready_call_directory, full_ready_call_ai_file_path = ai_upload_service.save_uploaded_file_to_ai_ready_directory(uploaded_file, file_name)
        response = ai_upload_service.process_pdf_and_generate_word(full_ready_call_ai_file_path, model_label)
        
        # 手动添加 CORS 头
        response['Access-Control-Allow-Origin'] = '*'
        return response
    except Exception as e:
        errmsg = str(e)
        logger.error(errmsg)
        response = JsonStateResponse(errcode=ErrorCode.Failure, errmsg=errmsg)
        response['Access-Control-Allow-Origin'] = '*'
        return response
    finally:
        ai_upload_service.remove_ready_call_ai_directory_path(ai_ready_call_directory)

注意事项

安全性CORS_ALLOW_ALL_ORIGINS = True 允许所有域名跨域访问,这在生产环境中是不安全的。建议在生产环境中使用 CORS_ALLOWED_ORIGINS 来指定允许的域名。
OPTIONS 请求:跨域请求通常会先发送一个 OPTIONS 请求来检查服务器是否允许跨域请求。确保你的后端正确处理 OPTIONS 请求。

使用 django-cors-headers 的推荐方式

使用 django-cors-headers 是更推荐的方式,因为它提供了更多的配置选项,并且能够正确处理 OPTIONS 请求。

# settings.py

INSTALLED_APPS = [
    ...
    'corsheaders',
    ...
]

MIDDLEWARE = [
    ...
    'corsheaders.middleware.CorsMiddleware',
    'django.middleware.common.CommonMiddleware',
    ...
]

CORS_ALLOWED_ORIGINS = [
    "http://localhost:63342",
    # 添加其他允许的域名
]

这样配置后,你的 Django 应用将允许来自 http://localhost:63342 的跨域请求,并且浏览器将不再报 CORS 错误。

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐