2011-07-23 31 views
25

cuando estoy usando el siguiente código Python para enviar una solicitud POST a mi sitio web Django recibo 403: error prohibido.Django devuelve el error 403 al enviar una solicitud POST

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 también el sitio web de Django, y también funciona correctamente. Creo que ese es el problema de configuración de Django. ¿Alguien puede decirme qué debo hacer para proporcionar acceso a mi script?

+0

¿Puede acceder a la página web desde un navegador web normal? –

+0

Puedo obtener desde el navegador normal. Los registros de mi servidor están vacíos, no tengo suficientes licencias para verlos todos en mi hosting. – Djent

+0

http://stackoverflow.com/a/30210391/940098 – Wtower

Respuesta

22

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

+0

¿Dónde tengo que agregar esa etiqueta? Si está en la plantilla, no funciona. Esta es mi opinión: http://dpaste.com/575405/, t.html es simplemente {{form}} – Djent

+2

puede actualizar la pregunta original para incluir su código (vista, urls, formulario) y html en lugar de enlazar a dpaste? –

+0

@Djent ¿por qué t.html es solo un {{form}} está incluido en otras páginas? si simplemente pone {{form}} no es una página web válida, y ni siquiera es un formulario válido, ya que {{form}} solo pone los elementos del formulario, aún necesita agregar las etiquetas de formulario a su alrededor. –

41

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

Intente marcar su punto de vista con @csrf_exempt. De esta forma, el middleware CSRF de Django ignorará la protección CSRF. También necesitarás usar from django.views.decorators.csrf import csrf_exempt. Ver: https://docs.djangoproject.com/en/dev/ref/csrf/#utilities

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

Si la seguridad es vital para usted, entonces considere usar @csrf_exempt seguido de @requires_csrf_token (vea: https://docs.djangoproject.com/en/dev/ref/csrf/#unprotected-view-needs-the-csrf-token). Luego, en su script, pase este token y listo.

+0

Muchas gracias por compartir más de dos enlaces. Mi código está funcionando perfectamente bien después de añadir esta declaración de importación de django.views.decorators.csrf csrf_protect importación y después de hacer la función específica exentos como esto @csrf_exempt Una vez más muchas gracias. –

2

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 de la ficha de galleta y el método se ha explicado en el artículo introduce Descripción enlace aquí

o

Puede acceder a él desde DOM usando {{}} csrf_token, disponibles en la plantilla

Así que ahora con 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); 
    } 
}); 
0

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

Nota: Debe utilizarse en los casos en que no es necesario 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")) 

adicional Tenga en cuenta que, si usted quiere hacer esa solicitud posterior forman un dominio diferente (en caso de que la parte delantera de la aplicación está en Reaccionar o angulares y el back-end está en Django), asegúrese de que el complemento siguiente en el archivo de configuración:

  1. actualización de la INSTALLED_APPS utilizar 'coreHeaders':

    INSTALLED_APPS = [
    'corsheaders',
    ]

  2. lista blanca de su dominio extremo frontal mediante la adición siguiente para la configuración de archivo de nuevo:

    CORS_ORIGIN_WHITELIST = ( 'localhost: 8080', )

0

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 Token.

Cuestiones relacionadas