Python 向其自身发送post请求时,Flask挂起

Python 向其自身发送post请求时,Flask挂起,python,flask,Python,Flask,我正试图从Flask应用程序自己的一个视图向其发送post请求,但它会一直挂起,直到我关闭服务器。如果我用JavaScript执行请求,它就可以正常工作。为什么它不能从Python代码中工作 from flask import Blueprint, render_template, abort, request, Response, session, url_for from jinja2 import TemplateNotFound from flask.ext.wtf import Fo

我正试图从Flask应用程序自己的一个视图向其发送post请求,但它会一直挂起,直到我关闭服务器。如果我用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)

我对烧瓶不熟悉。但是,这段代码:

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

似乎您正在接受已发布的表单,对其进行验证,然后再次发布。反复。

在1.0之前,Flask的开发服务器默认为单线程。在这种模式下,它一次只能处理一个请求。发出请求直到收到响应为止。您的Flask代码在一个线程中发出请求,然后等待。没有其他线程处理第二个请求。因此,请求永远不会完成,原始请求将永远等待

在dev服务器中启用线程以避免死锁并修复即时问题

app.run(threaded=True)
但是,从应用程序内部向应用程序发出完整的HTTP请求是不必要的,这表明存在更深层次的设计问题。例如,请注意,内部请求将无法访问客户端浏览器上的会话。提取公共代码并在内部调用,而不是发出新请求

def公共_登录(数据):
...
@app.route(“/login”)
def login():
...
通用登录(数据)
...
@app.route(“/api/login”)
def api_login():
...
通用登录(数据)
...