python - El frasco se cuelga cuando se envía una solicitud de publicación
flask (2)
Antes de 1.0, el servidor de desarrollo de Flask tenía un solo subproceso por defecto. En ese modo, solo puede manejar una solicitud a la vez. Hacer una solicitud bloquea hasta que recibe la respuesta. Su código de Flask realiza una solicitud en un subproceso 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 punto muerto y solucionar el problema inmediato.
app.run(threaded=True)
Sin embargo, hacer una solicitud HTTP completa a la aplicación desde dentro de la aplicación nunca debería ser necesario 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 hacer 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)
...
Estoy tratando de 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 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)
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 acepta un formulario publicado, lo valida y luego lo vuelve a publicar. Una y otra vez.