framework example aws django nginx django-rest-framework gunicorn amazon-elb

example - django.request: Prohibido(la comprobación del remitente ha fallado, no hay un Referer).



request.post django example (1)

Estoy desarrollando una aplicación web usando AWS y Django Rest Framework. (Django: v1.8, DRF: v3) He seguido obteniendo django.request: Forbidden (Referer checking failed - no Referer.) para la solicitud de formulario multiparte de POST.

Estoy usando AWS ELB (equilibrador de carga elástico), NGINX en mi ec2 (en el grupo de autocorrección) y Gunicorn.

La configuración del oyente AWS ELB es la siguiente (solo HTTPS):

elb https solo configuración de escucha

La configuración NGINX es como a continuación:

user nginx; worker_processes auto; error_log /var/log/nginx/error.log; pid /var/run/nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main ''$remote_addr - $remote_user [$time_local] "$request" '' ''$status $body_bytes_sent "$http_referer" '' ''"$http_user_agent" "$http_x_forwarded_for"''; access_log /var/log/nginx/access.log main; sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 2048; include /etc/nginx/conf.d/*.conf; index index.html index.htm; upstream my_server { server localhost:8000; } server { listen 80; server_name <server name>; access_log /etc/nginx/log/local-wc.access.log; error_log /etc/nginx/log/local-wc.error.log; root /usr/share/nginx/html; location /api/v1 { proxy_pass http://my_server/api/v1; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Protocol $scheme; } } }

<server name> es el CNAME que apunta a elud el nombre DNS.

En otras palabras, <server name> => xxxx-123456789.us-west-2.elb.amazonaws.com (Un registro). Cada llamada API se realiza mediante https://<server name>/api/v1/*

Finalmente Gunicorn está corriendo por: gunicorn my_django_app.wsgi:application -w 1 -b 127.0.0.1:8000 -t 300 --max-requests=100

y el ajuste de Django es:

ALLOWED_HOSTS = [''*''] SECURE_PROXY_SSL_HEADER = (''HTTP_X_FORWARDED_PROTO'', ''https'') MIDDLEWARE_CLASSES = ( ''django.contrib.sessions.middleware.SessionMiddleware'', ''django.middleware.common.CommonMiddleware'', ''django.middleware.csrf.CsrfViewMiddleware'', ''django.contrib.auth.middleware.AuthenticationMiddleware'', ''django.contrib.auth.middleware.SessionAuthenticationMiddleware'', ''django.contrib.messages.middleware.MessageMiddleware'', ''django.middleware.security.SecurityMiddleware'', )

La función de vista es la siguiente (con CSRF exento):

class UserViewSet(CsrfExemptMixin, mixins.CreateModelMixin, mixins.ListModelMixin, mixins.RetrieveModelMixin, mixins.UpdateModelMixin, viewsets.GenericViewSet): # already tried @csrf_exempt def create(self, request, *args, **kwargs): self.parser_classes = (FormParser, MultiPartParser, ) .........

Problema nuevamente

Cuando envío

curl -i -k -X POST -H "Accept: application/json" / -F "[email protected]" / -F "[email protected]" / https://<server name>/api/v1/users/

y en mi registro de Django:

[WARNING] django.request: Forbidden (Referer checking failed - no Referer.): /api/v1/users/

Funcionó con POST en el método HTTP o GET en HTTPS.

Me pregunto si la configuración de ELB es incorrecta o Nginx Configuration está equivocada con el referer ... Agradecería si alguien me ayudara a resolver este problema ...


Creo que DRF ignora el decorador csrf_exempt y no estoy seguro de dónde se define CsrfExemptMixin. Lo más fácil que puede hacer es agregar Referrer: yourhost a sus encabezados curl.