Django devuelve 403 error al enviar una solicitud POST

cuando estoy usando el siguiente código de Python para enviar una solicitud POST a mi sitio web de Django, obtengo 403: Error prohibido.

url = 'http://www.sub.domain.com/' values = { 'var': 'test' } try: data = urllib.urlencode(values, doseq=True) req = urllib2.Request(url, data) response = urllib2.urlopen(req) the_page = response.read() except: the_page = sys.exc_info() raise 

Cuando estoy abriendo cualquier otro sitio web funciona correctamente. domain.com es el sitio web de Django también, y funciona correctamente también. Creo que ese es el problema de configuración de Django, ¿alguien puede decirme qué debo hacer para proporcionar acceso a mi script?

¿La vista que está publicando para tener un Formulario Django en él? Si es así, me pregunto si está dando un error csrf. Creo que eso se manifiesta como un 403. En ese caso, deberías agregar la etiqueta {{csrf_token}}. Solo un pensamiento.

Consulte aquí https://docs.djangoproject.com/en/dev/ref/csrf/#how-to-use-it .

Intenta marcar tu vista con @csrf_exempt . De esa manera, el middleware CSRF de Django ignorará la protección CSRF. También deberá utilizar from django.views.decorators.csrf import csrf_exempt . Consulte: https://docs.djangoproject.com/en/dev/ref/csrf/#utilities

Tenga en cuenta que al deshabilitar la protección CSRF en su opinión, está abriendo una puerta para los ataques CSRF.

Si la seguridad es vital para usted, considere usar @csrf_exempt seguido de @requires_csrf_token (consulte: https://docs.djangoproject.com/en/dev/ref/csrf/#unprotected-view-needs-the-csrf-token ). Luego, en tu script pasa este token y eso es todo.

La respuesta es 403 porque django requiere un token csrf (incluido en los datos de la publicación) en cada solicitud POST que realice.

Hay varias maneras de hacer esto, tales como:

La adquisición del token de la cookie y el método se ha explicado en el artículo.

o

Puedes acceder desde DOM usando {{csrf_token}}, disponible en la plantilla

Así que ahora usando el segundo método:

 var post_data = { ... 'csrfmiddlewaretoken':"{{ csrf_token }}" ... } $.ajax({ url:'url', type:'POST' data:post_data, success:function(data){ console.log(data); }, error:function(error){ console.log(error); } }); 

O puede permitir el permiso para realizar esta solicitud de publicación.

Nota: debe utilizarse en los casos en que no necesite autenticar a los usuarios para publicar nada en nuestro servidor, por ejemplo, cuando un nuevo usuario se registra por primera vez .

 from rest_framework.permissions import AllowAny class CreateUser(APIView): permission_classes = (AllowAny,) def post(self, request, format=None): return(Response("hi")) 

Además, tenga en cuenta que, si desea que la solicitud de publicación forme un dominio diferente (en caso de que el frente de la aplicación esté en React o angular y el backend esté en Django), asegúrese de agregar lo siguiente en el archivo de configuración:

  1. Actualice las INSTALLED_APPS para usar ‘coreHeaders’:

    INSTALLED_APPS = [
    ‘corsheaders’,
    ]

  2. Lista blanca de su dominio de front-end agregando siguiente al archivo de configuración de nuevo:

    CORS_ORIGIN_WHITELIST = (‘localhost: 8080’,)

La documentación de Django proporciona varias formas de garantizar que se incluyan los tokens CSRF. Consulte https://docs.djangoproject.com/en/1.11/ref/csrf/ para obtener más información.

Recibí este error cuando un Token de autenticación expiró o cuando no se envió ningún Token con la solicitud. El uso de un token renovado solucionó el problema.

 curl -X POST -H "Authorization: Token mytoken" -d "name=myname&age=0" 127.0.0.1:8000/myapi/ 

o

 curl -X POST -H "Authorization: JWT mytoken" -d "name=myname&age=0" 127.0.0.1:8000/myapi/ 

Dependiendo del tipo de Token.