我正尝试从其自己的视图之一向我的Flask应用发送发布请求,但该请求一直挂起,直到我杀死服务器为止。如果我使用JavaScript进行请求,则效果很好。为什么从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)
在1.0之前,Flask的开发服务器默认为单线程。在这种模式下,它一次只能处理一个请求。发出请求直到接收到响应为止。您的Flask代码在一个线程中发出一个请求,然后等待。没有其他线程可以处理第二个请求。因此,请求永远不会完成,并且原始请求将永远等待。
在开发服务器中启用线程以避免死锁并解决当前问题。
app.run(threaded=True)
但是,永远不需要从应用程序内部向应用程序发出完整的HTTP请求,这表明存在更深的设计问题。例如,观察内部请求将无法访问客户端浏览器上的会话。提取通用代码并在内部调用它,而不是发出新请求。
def common_login(data): ... @app.route("/login") def login(): ... common_login(data) ... @app.route("/api/login") def api_login(): ... common_login(data) ...