📜  django-cors-headers - Python (1)

📅  最后修改于: 2023-12-03 15:00:27.621000             🧑  作者: Mango

django-cors-headers


django-cors-headers是Django应用程序,它是Django中的 CORS(跨来源资源共享)的实现。

CORS是Web应用程序中的一个安全性问题。它允许在一个域中运行的JS客户端访问来自另一个域的资源,所以这样的资源共享需要得到服务端的授权。在Django应用程序中,django-cors-headers可以帮助您轻松地实现CORS。

安装

pip install django-cors-headers

配置

  • settings.py 中的 INSTALLED_APPS 中添加 corsheaders,如

    INSTALLED_APPS = (
        ...
        'corsheaders',
        ...
    )
    
  • settings.py 中添加 MIDDLEWARE 选项,并将 CorsMiddleware 添加到此选项中。

    MIDDLEWARE = [
        ...
        'corsheaders.middleware.CorsMiddleware',
        'django.middleware.common.CommonMiddleware',
        ...
    ]
    
  • 添加 CORS_ORIGIN_ALLOW_ALLCORS_ORIGIN_WHITELIST选项。如果你想允许所有的资源访问API,则设置 CORS_ORIGIN_ALLOW_ALL = True,或者将您希望访问您的API的域名添加到 CORS_ORIGIN_WHITELIST 中,如下所示:

    CORS_ORIGIN_ALLOW_ALL = False
    
    CORS_ORIGIN_WHITELIST = (
        'https://example.com',
        'https://www.example.com',
    )
    

    注意:建议使用 CORS_ORIGIN_WHITELIST 选项

用法

django-cors-header 自带一个装饰器 @cross_origin,通过将该装饰器应用到视图上,您可以允许通过 AJAX 访问您的 API。以APIView为例:

from django.views.generic import View
from django.utils.decorators import method_decorator
from django.views.decorators.csrf import csrf_exempt
from corsheaders.decorators import cors_allowed_methods

@method_decorator(cors_allowed_methods(['GET', 'POST', 'PUT', 'DELETE']), name='dispatch')
@method_decorator(csrf_exempt, name='dispatch')
class MyView(View):
    ...

cors_allowed_methods 与视图的HTTP方法 (GET, POST, PUT, DELETE, etc.) 列表一起使用。如果不提供方法列表,则默认为 ['OPTIONS']

这里是一个 Django Rest Framework 视图集的示例,使用 @api_view 装饰器可以使用非DRF Views的基础视图。

from rest_framework.decorators import api_view
from rest_framework.response import Response

from corsheaders.decorators import cors_allowed_methods

@api_view(['GET'])
@cors_allowed_methods(['GET'])
def my_view(request):
    data = {
        'name': 'John Doe',
        'age': 45,
        'location': 'New York'
    }
    return Response(data)

结论

使用 django-cors-headers 可以轻松实现 Django 应用程序中的越域访问。在应用程序中添加 CORS_ORIGIN_ALLOW_ALLCORS_ORIGIN_WHITELIST 选项,以允许特定域名或所有域名访问API。使用装饰器 @cross_origin 将CORS功能应用到视图上,并在必要的时候指定HTTP方法。