簡體   English   中英

使用 Frozen Flask 的 POST 請求

[英]POST request with Frozen Flask

在查看了 web 上的示例后,似乎可以將 forms 與使用普通 HTML/CSS/JS 構建的 static 網站中的 POST 請求一起使用。 但我無法用 Flask 做到這一點。 我正在使用Frozen-Flask 庫

我的主要server.py腳本如下( modelencoder在文件頂部正確加載)

app = Flask(__name__)
app.config['FREEZER_RELATIVE_URLS'] = True

@app.route('/')
def main():
    return render_template("index.html")

@app.route('/predict', methods=["POST"])
def predict():
    if request.method == "POST":
        message = request.form['submission'] # gets submission
        prediction = model.predict([message]) # feeds to model
        classification = encoder.inverse_transform(prediction) # decodes prediction

        return render_template('index.html', message=message, classification=classification)

if __name__ == "__main__":
    app.run(debug=True)

以及我的freeze.py腳本:

from flask_frozen import Freezer
from server import app

freezer = Freezer(app)

if __name__ == '__main__':
    freezer.freeze()

最后,我的index.html的相關部分:

<form class="form-group" action="{{ url_for('predict') }}" method="POST">
    <textarea class="form-control" name="submission" id="submission" rows="10"></textarea> 
    <button type="submit" class="btn btn-primary">Classify</button>
</form>

如果我運行python server.py ,也就是常規的 Flask,網站運行良好。 它在http://localhost:5000/加載並單擊分類按鈕將我帶到http://localhost:5000/predict/ ,屏幕上顯示分類。

當我運行python freeze.py (又名 Frozen-Flask)來生成 static 網站時,我遇到了錯誤。

$ python freeze.py
Traceback (most recent call last):
  File "freeze.py", line 11, in <module>
    freezer.freeze()
  File "C:\Users\User\Documents\Projects\Spam Classifier\spam-classifier-hoohacks-starter\env\lib\site-packages\flask_frozen\__init__.py", line 199, in freeze
    return set(page.url for page in self.freeze_yield())
  File "C:\Users\User\Documents\Projects\Spam Classifier\spam-classifier-hoohacks-starter\env\lib\site-packages\flask_frozen\__init__.py", line 199, in <genexpr>
    return set(page.url for page in self.freeze_yield())
  File "C:\Users\User\Documents\Projects\Spam Classifier\spam-classifier-hoohacks-starter\env\lib\site-packages\flask_frozen\__init__.py", line 183, in freeze_yield
    new_filename = self._build_one(url)
  File "C:\Users\User\Documents\Projects\Spam Classifier\spam-classifier-hoohacks-starter\env\lib\site-packages\flask_frozen\__init__.py", line 322, in _build_one
    % (response.status, url))
ValueError: Unexpected status '405 METHOD NOT ALLOWED' on URL /predict/

我為調查/嘗試解決此問題所做的工作:405 錯誤表明在預測中調用了除 POST 之外的 HTTP 請求。 因此,出於測試目的,我changed methods=["POST"]更改為methods=["GET"] 然后我讓我的預測頁面只呈現正常的主頁。

@app.route('/predict/', methods=["GET"])
def predict():
    return render_template("index.html")

運行凍結腳本不再引發錯誤。 該網站位於.../build/index.html並單擊分類按鈕將我帶到.../build/predict/index.html 但是預測頁面沒有用,因為它與主頁相同。

我猜 Frozen-Flask 需要對頁面進行 GET 訪問才能構建它們的 static 版本,但我不應該也可以使用 POST 提供的信息更新這些頁面嗎? 或者無法做到“靜態”定義的那部分

從代碼中我可以看到,Frozen-Flask 使用 test_client 的 GET 方法來獲取每個要生成的頁面的內容。 因此,如果不破解 Frozen-Flask,您將無法使用 POST。

另一方面,GET 請求可以包含 URL 參數:

/predict?message=123456

所以你可以像這樣獲得你的參數:

request.args.get('message', '')

現在,請記住 Forozen-Flask 不知道要發送什么作為 arguments。 所以我會做的是這樣的:

    @app.route('/predict', methods=["GET"])
    def predict():
        message = "some message" # hardcode a value
        prediction = model.predict([message]) # feeds to model
        classification = encoder.inverse_transform(prediction) # decodes prediction

        return render_template('index.html', message=message, classification=classification)

暫無
暫無

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

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