【问题标题】:Flask hangs when sending a post request to itself向自身发送发布请求时,Flask 挂起
【发布时间】:2015-10-26 18:38:23
【问题描述】:

我正在尝试从我的 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)

【问题讨论】:

    标签: python flask


    【解决方案1】:

    在 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)
        ...
    

    【讨论】:

      【解决方案2】:

      我不熟悉 Flask。然而这段代码:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-04-08
        • 1970-01-01
        • 2021-02-19
        • 2012-01-08
        • 2021-11-07
        • 2018-07-04
        • 1970-01-01
        相关资源
        最近更新 更多