我正在尝试从其自己的一个视图向我的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)
答案 0 :(得分:23)
在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)
...
答案 1 :(得分:0)
我不熟悉Flask。不过这段代码:
if form.validate_on_submit():
return requests.post(request.url_root + '/api/login', data={"test": True})
好像您正在接受已发布的表单,对其进行验证,然后再次发布。一遍又一遍。