Python-peticiones haciendo una solicitud GET en lugar de POST

Tengo un cron diario que maneja algunos de los eventos recurrentes en mi aplicación, y de vez en cuando me doy cuenta de un error extraño que aparece en los registros. El cron, entre otras cosas, realiza una validación de algunos códigos y utiliza la aplicación web que se ejecuta en el mismo servidor, por lo que la solicitud de validación se realiza a través de la solicitud POST con algunos datos.

 url = 'https://example.com/validate/' payload = {'pin': pin, 'sku': sku, 'phone': phone, 'AR': True} validation_post = requests.post(url, data=payload) 

Por lo tanto, esto hace la solicitud real y registro la respuesta. De vez en cuando, y recientemente hasta el 50% de la solicitud, la respuesta contiene el siguiente mensaje de nginx:

  405 Method Not Allowed 

Method Not Allowed

The method GET is not allowed for the requested URL.

Por lo tanto, la solicitud real se realizó utilizando el método GET , no el POST como se indica en el código. En nginx access.log puedo ver esa entrada:

 123.123.123.123 - - [18/Feb/2015:12:26:50 -0500] "GET /validate/ HTTP/1.1" 405 182 "-" "python-requests/2.2.1 CPython/2.7.6 Linux/3.13.0-37-generic" 

Y el registro uwsgi para la aplicación muestra algo similar:

 [pid: 6888|app: 0|req: 1589/58763] 123.123.123.123 () {40 vars in 613 bytes} [Mon Apr 6 11:42:41 2015] GET /validate/ => generated 182 bytes in 1 msecs (HTTP/1.1 405) 4 headers in 234 bytes (1 switches on core 0) 

Por lo tanto, todo indica que la solicitud real no se realizó mediante el POST . La ruta de la aplicación que maneja este código es simple, y este es un extracto: @ app.route (‘/ validate /’, methods = [‘POST’]) @login_required

 def validate(): if isinstance(current_user.user, Sales): try: #do the stuff here except Exception, e: app.logger.exception(str(e)) return 0 abort(403) 

La ruta de la aplicación puede fallar, y hay algunos returns dentro del bloque try , pero incluso si fallan o si hay una explicación, no hay nada que pueda generar el código de error 405 en este bloque, solo 403 que rara vez sucede desde que construyo y iniciar sesión el usuario manualmente desde el cron.

He encontrado algo similar aquí, pero la idea era que había una redirección de HTTP a la versión HTTPS, y también tengo esa redirección presente en el servidor, pero la URL que se está realizando tiene el HTTPS, por lo que dudo esta es la causa

La stack en la que estoy ejecutando esto es uwsgi + nginx + flask . ¿Alguien puede ver lo que podría estar causando esto? Para repetir, no siempre sucede, por lo que a veces funciona como se espera y otras no. Recientemente mod_wsgi de apache y mod_wsgi a esta nueva stack y desde ese punto comencé a encontrar este error; No puedo recordar nunca verlo en un entorno apache .

¡Gracias!

La única vez que cambiamos una solicitud POST a GET es cuando manejamos una redirección. Dependiendo del código de redirección, cambiaremos el método de solicitud. Si desea asegurarse de que no seguimos las redirecciones, debe pasar allow_redirects=False . Dicho esto, debe averiguar por qué su aplicación está generando redirecciones (incluso si se está redirigiendo a HTTP o a un dominio diferente, o usando un código de estado específico).