![](/img/trans.png)
[英]'Request' library hangs temporarily when sending POST requests to the server?! [Python]
[英]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.