python - resource - ¿Cómo puedo habilitar CORS en Django REST Framework?
django rest framework cors (6)
¿Cómo puedo habilitar CORS en mi Django REST Framework? la reference no ayuda mucho, dice que puedo hacerlo con un middleware, pero ¿cómo puedo hacer eso?
El enlace al que hizo referencia en su pregunta recomienda usar
django-cors-headers
, cuya
documentation
dice que instale la biblioteca
pip install django-cors-headers
y luego agréguelo a sus aplicaciones instaladas:
INSTALLED_APPS = (
...
''corsheaders'',
...
)
También deberá agregar una clase de middleware para escuchar las respuestas:
MIDDLEWARE_CLASSES = (
...
''corsheaders.middleware.CorsMiddleware'',
''django.middleware.common.CommonMiddleware'',
...
)
También es posible que desee explorar
la sección
de
configuración
de su documentación, prestando especial atención a las diversas configuraciones de
CORS_ORIGIN_
.
En caso de que alguien vuelva a esta pregunta y decida escribir su propio middleware, este es un ejemplo de código para el nuevo middleware de estilo de Django:
class CORSMiddleware(object):
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
response = self.get_response(request)
response["Access-Control-Allow-Origin"] = "*"
return response
Para las versiones de Django> 1.10, según la
documentation
, se puede escribir un MIDDLEWARE personalizado como una función, digamos en el archivo:
yourproject/middleware.py
(como un hermano de
settings.py
):
def open_access_middleware(get_response):
def middleware(request):
response = get_response(request)
response["Access-Control-Allow-Origin"] = "*"
response["Access-Control-Allow-Headers"] = "*"
return response
return middleware
y finalmente, agregue la ruta de Python de esta función (wrt la raíz de su proyecto) a la lista MIDDLEWARE en settings.py de su proyecto:
MIDDLEWARE = [
.
.
''django.middleware.clickjacking.XFrameOptionsMiddleware'',
''yourproject.middleware.open_access_middleware''
]
¡Pan comido!
Puede hacerlo utilizando un middleware personalizado, aun sabiendo que la mejor opción es utilizar el enfoque probado del paquete
django-cors-headers
.
Dicho esto, aquí está la solución:
cree la siguiente estructura y archivos:
-
myapp/middleware/__init__.py
from corsMiddleware import corsMiddleware
-
myapp/middleware/corsMiddleware.py
class corsMiddleware(object):
def process_response(self, req, resp):
resp["Access-Control-Allow-Origin"] = "*"
return resp
agregue a
settings.py
la línea marcada:
MIDDLEWARE_CLASSES = (
"django.contrib.sessions.middleware.SessionMiddleware",
"django.middleware.common.CommonMiddleware",
"django.middleware.csrf.CsrfViewMiddleware",
# Now we add here our custom middleware
''app_name.middleware.corsMiddleware'' <---- this line
)
También es posible que deba agregar el modelo CorsModel a su base de datos. Estaba obteniendo excepciones al intentar eliminarlo de otra manera.
python3 manage.py makemigrations corsheaders
python3 manage.py migrate
pip install django-cors-headers
y luego agréguelo a sus aplicaciones instaladas:
INSTALLED_APPS = (
...
''corsheaders'',
...
)
También deberá agregar una clase de middleware para escuchar las respuestas:
MIDDLEWARE_CLASSES = (
...
''corsheaders.middleware.CorsMiddleware'',
''django.middleware.common.CommonMiddleware'',
...
)
CORS_ORIGIN_ALLOW_ALL = True
CORS_ALLOW_CREDENTIALS = True
CORS_ORIGIN_WHITELIST = [
''http://localhost:3030'',
]
CORS_ORIGIN_REGEX_WHITELIST = [
''http://localhost:3030'',
]
Más detalles: https://github.com/ottoyiu/django-cors-headers/#configuration
leer la documentación oficial puede resolver casi todos los problemas