python - Flask 在向自身发送 post 请求时挂起

标签 python flask

我正尝试从我的 Flask 应用程序的一个 View 向我的 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 请求,这表明存在更深层次的设计问题。例如,观察内部请求将无法访问客户端浏览器上的 session 。提取公共(public)代码并在内部调用它,而不是提出新的请求。

def common_login(data):
    ...

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

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

关于python - Flask 在向自身发送 post 请求时挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33353192/

相关文章:

python - 给定大小为 n 的矩阵,计算距中心的距离矩阵

python - Flask 登录和注销

python-3.x - 未在Python Flask的装饰器中定义名称“字符串”

python - Django shell 命令更改 json 数据中的值

python - Flask 模板中的全局变量

python - 如何使用 FormFields 的 WTForms FieldList?

python / flask : only one user can call a endpoint at one time

python - AMF 通信如何工作?

python - 使用 Celery worker 与 SQLAlchemy DB 交互,包括从请求中了解用户

python - 使用 python 发送 HTTP 请求