簡體   English   中英

Flask 在向自身發送 post 請求時掛起

[英]Flask hangs when sending a post request to itself

我試圖從我的 Flask 應用程序自己的一個視圖中向我的 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)
    ...

我對燒瓶不熟悉。 但是這段代碼:

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

似乎您正在接受已發布的表單,對其進行驗證,然后再次發布。 一遍又一遍。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM