¿Cómo puedo habilitar CORS en mi marco Django REST? la referencia no ayuda mucho, dice que puedo hacerlo mediante un middleware, pero ¿cómo puedo hacer eso?
¿Cómo puedo habilitar CORS en mi marco Django REST? la referencia no ayuda mucho, dice que puedo hacerlo mediante un middleware, pero ¿cómo puedo hacer eso?
Respuestas:
El enlace al que hizo referencia en su pregunta recomienda usar django-cors-headers
, cuya documentación 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',
...
)
Examine la sección de configuración de su documentación, prestando especial atención a las distintas CORS_ORIGIN_
configuraciones. Deberá configurar algunos de ellos según sus necesidades.
Access-Control-Allow-Origin: *
, no veo por qué cargar todo, pondré otra forma de hacer esto en su respuesta para que ambos métodos puedan estar disponibles. referencia: [link (] enable-cors.org/server.html )
django-cors-headers
es mucho más flexible que eso. Si prefiere crear su propia clase, sea mi invitado. Pero estaría usando esa 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',
...
)
CORS_ORIGIN_ALLOW_ALL = True # If this is used then `CORS_ORIGIN_WHITELIST` will not have any effect
CORS_ALLOW_CREDENTIALS = True
CORS_ORIGIN_WHITELIST = [
'http://localhost:3030',
] # If this is used, then not need to use `CORS_ORIGIN_ALLOW_ALL = True`
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
CORS_ORIGIN_ALLOW_ALL = True
, pero CORS_ORIGIN_WHITELIST
todavía está establecido? Los documentos parecen hacer que parezca que esto no es necesario y parece ser confuso para la respuesta aquí.
'corsheaders.middleware.CorsMiddleware',
debe estar en la parte superior de la lista, de lo contrario, la conexión puede rechazarse antes de acceder a ella.
Puede hacerlo mediante el uso de un middleware personalizado, aunque sepa 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
agregar 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
)
from . import corsMiddleware
En caso de que alguien vuelva a esta pregunta y decida escribir su propio middleware, esta es una muestra de código para el nuevo estilo de middleware 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, de acuerdo con la documentación , se puede escribir un MIDDLEWARE personalizado como una función, digamos en el archivo: yourproject/middleware.py
(como 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 (escriba la raíz de su proyecto) a la lista MIDDLEWARE en su proyecto settings.py
:
MIDDLEWARE = [
.
.
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'yourproject.middleware.open_access_middleware'
]
¡Pan comido!
open_access_middleware
.
A continuación se muestran los pasos de trabajo sin la necesidad de ningún módulo externo:
Paso 1: crea un módulo en tu aplicación.
Por ejemplo, supongamos que tenemos una aplicación llamada user_registration_app . Explore user_registration_app y cree un nuevo archivo.
Llamemos a esto como custom_cors_middleware.py
Pegue la siguiente definición de clase:
class CustomCorsMiddleware:
def __init__(self, get_response):
self.get_response = get_response
# One-time configuration and initialization.
def __call__(self, request):
# Code to be executed for each request before
# the view (and later middleware) are called.
response = self.get_response(request)
response["Access-Control-Allow-Origin"] = "*"
response["Access-Control-Allow-Headers"] = "*"
# Code to be executed for each request/response after
# the view is called.
return response
Paso 2: registrar un middleware
En el archivo settings.py de su proyecto, agregue esta línea
'user_registration_app.custom_cors_middleware.CustomCorsMiddleware'
P.ej:
MIDDLEWARE = [
'user_registration_app.custom_cors_middleware.CustomCorsMiddleware', # ADD THIS LINE BEFORE CommonMiddleware
...
'django.middleware.common.CommonMiddleware',
]
Recuerde reemplazar user_registration_app con el nombre de su aplicación donde ha creado su módulo custom_cors_middleware.py.
¡Ahora puede verificar que agregará los encabezados de respuesta requeridos a todas las vistas en el proyecto!
Django = 2.2.12 django-cors-headers = 3.2.1 djangorestframework = 3.11.0
Seguir las instrucciones oficiales no funciona
Finalmente, usa la forma antigua para resolverlo.
AÑADIR:
# proj/middlewares.py
from rest_framework.authentication import SessionAuthentication
class CsrfExemptSessionAuthentication(SessionAuthentication):
def enforce_csrf(self, request):
return # To not perform the csrf check previously happening
#proj/settings.py
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'proj.middlewares.CsrfExemptSessionAuthentication',
),
}