Frasco se cuelga al enviar una solicitud de publicación a sí mismo

Estoy intentando enviar una solicitud de publicación a mi aplicación Flask desde una de sus propias vistas, pero se cuelga hasta que mato el servidor. Si hago la solicitud en JavaScript, funciona bien. ¿Por qué no funciona desde el código de Python?

from flask import Blueprint, render_template, abort, request, Response, session, url_for from jinja2 import TemplateNotFound from flask.ext.wtf import Form from wtforms import BooleanField, TextField, PasswordField import requests login = Blueprint('login', __name__, template_folder='templates') class LoginForm(Form): email = TextField('Email') password = PasswordField('Password') @login.route('/login', methods=['GET', 'POST']) def _login(): form = LoginForm(request.form, csrf_enabled=False) if form.validate_on_submit(): return requests.post(request.url_root + '/api/login', data={"test": True}) return render_template('login.html', form=form) 

Antes de la versión 1.0, el servidor de desarrollo de Flask era de un solo hilo por defecto. En ese modo, solo puede manejar una solicitud a la vez. Hacer una solicitud bloquea hasta que recibe la respuesta. El código del matraz realiza una solicitud en el hilo y luego espera. No hay otros hilos para manejar esta segunda solicitud. Por lo tanto, la solicitud nunca se completa y la solicitud original espera para siempre.

Habilite subprocesos en el servidor de desarrollo para evitar el interlocking y solucionar el problema inmediato.

 app.run(threaded=True) 

Sin embargo, nunca debe ser necesario realizar una solicitud HTTP completa a la aplicación desde dentro de la aplicación e indica un problema de diseño más profundo. Por ejemplo, observe que la solicitud interna no tendrá acceso a la sesión en el navegador del cliente. Extraiga el código común y llámelo internamente, en lugar de realizar una nueva solicitud.

 def common_login(data): ... @app.route("/login") def login(): ... common_login(data) ... @app.route("/api/login") def api_login(): ... common_login(data) ... 

No estoy familiarizado con Flask. Sin embargo este bit de código:

 if form.validate_on_submit(): return requests.post(request.url_root + '/api/login', data={"test": True}) 

Parece que estás aceptando un formulario publicado, validándolo y luego publicándolo nuevamente. Una y otra vez.