【问题标题】:render_template not updating page in flaskrender_template 没有更新烧瓶中的页面
【发布时间】:2022-01-22 09:57:50
【问题描述】:

我试图渲染一个页面两次:一个是空表单,另一个是在该表单下,应该显示 POST 请求的结果。我知道这不是最漂亮的方式,但我对 js 或 ajax 一无所知,现在更喜欢这种解决方案。但是,我无法做到这一点,因为网站总是在第一个呈现的页面上。这是我的代码:

from flask import Flask, render_template, request, redirect, url_for
import requests


app = Flask(__name__)
#app.secret_key = 'super_secret'

@app.route('/')
def home():
    return render_template("Home.html")


@app.route('/process', methods=['POST', 'GET'])
def process():
    casa = request.form['casa']
    trasferta = request.form['trasferta']
    r = requests.get(url="http://127.0.0.1:5000/?casa={casa}&trasferta={trasferta}".format(casa=casa, trasferta=trasferta))
    #flash(r.text)
    return render_template('Home.html', winner=r.text)


if __name__ == '__main__':
    app.run(debug=True, port=3000)

每次按下按钮时都会正确处理请求,并且在请求之前肯定会执行代码,但屏幕上没有显示任何新内容。在 Home.html 文件中,我放置了一个变量 nams 获胜者,如下所示:

<div class="output">
    <h2>{{ winner }}</h2>
</div>

提前感谢任何愿意提供帮助的人。

更新

我做了一些更改,但结果是一样的:

@app.route('/')
def home():
    return render_template("Home.html")

@app.route('/result/<winner>')
def print_winner(winner):
    return render_template('Home.html', winner=winner)

@app.route('/process', methods=['GET'])
def process():
    casa = request.args.get("casa")
    trasferta = request.args.get("trasferta")
    r = requests.get(url="http://127.0.0.1:5000/?casa={casa}&trasferta={trasferta}".format(casa=casa, trasferta=trasferta))
    #flash(r.text)
    print(r.text)
    return redirect(url_for('print_winner', winner = r.text), 200)



if __name__ == '__main__':
    app.run(debug=True, port=3000)

如您所见,现在我正在使用一个 GET 请求,并且一个新函数可以根据需要呈现页面。问题是:当有人点击提交按钮时,请求被满足,但网站上没有任何变化(链接和以前一样,页面上没有任何变化)。

这是整个 HTML 表单:

        <form action="{{url_for('process')}}" method="GET" class="u-clearfix u-form-horizontal u-form-spacing-15 u-inner-form" style="padding: 15px;">
          <div class="u-form-group u-form-name">
            <label class="u-form-control-hidden u-label">Casa</label> <input type="text" placeholder="Squadra in casa" name="casa" class="u-border-1 u-border-grey-30 u-input u-input-rectangle" required="">
          </div>
          <div class="u-form-email u-form-group">
            <label class="u-form-control-hidden u-label">Trasferta</label> <input type="text" placeholder="Squadra ospite" name="trasferta" class="u-border-1 u-border-grey-30 u-input u-input-rectangle" required="">
          </div>
          <div class="u-form-group u-form-submit">
            <a href="{{url_for('process')}}" class="u-btn u-btn-submit u-button-style u-palette-2-base u-btn-1">AVVIA SIMULAZIONE<br></a> <input type="submit" value="submit" class="u-form-control-hidden">
          </div>
        </form>

【问题讨论】:

  • 可以显示form标签的html吗?
  • r = request.get() 应该做什么?您在站点的根目录上执行 GET,但它不包含任何处理参数的代码。 充其量它可能会返回您当前在屏幕上看到的相同内容。
  • @MennoHölscher 向另一个端口发出请求,另一个端口正在运行另一个烧瓶会话。如果您愿意,我也可以发布它,但我认为这无关紧要,因为我确信结果已正确保存在 r 中。谢谢你的帮助:)
  • @FareedKhan 抱歉我回复晚了,我已经更新了帖子
  • u-form-control-hidden CSS 类是否隐藏了输入提交按钮?您是否看到请求到达了127.0.0.1:5000 端点? print(r.text) 打印了什么?空字符串?

标签: python html forms flask


【解决方案1】:

在您的表单中,您有两个按钮。第一个是简单的&lt;a&gt;

<a href="{{url_for('process')}}" class="u-btn u-btn-submit u-button-style u-palette-2-base u-btn-1">AVVIA SIMULAZIONE<br></a>

这个对用户可见,但它实际上不提交表单,因为它只是一个简单的&lt;a&gt; 元素,位于表单内。

然后你有第二个按钮:

<input type="submit" value="submit" class="u-form-control-hidden">

这对用户不可见,因为您在其上应用了u-form-control-hidden CSS 类。但是根据定义,这是可以实际提交 HTML 表单的表单。但是你永远不能点击它,因为它被 CSS 隐藏了。

只需删除&lt;a&gt; 按钮,并使实际的提交按钮可见,或者您可以添加一些JS 魔术,在&lt;a&gt; 按钮上的单击事件后提交表单。

【讨论】:

  • 感谢您的回复。我刚刚尝试过,但使用原始提交按钮并没有改变任何东西。正如我所说,请求已正确发送到烧瓶,但新页面没有加载。
  • 您是否将重定向代码200 替换为例如302。这是您的示例和我的本地工作版本之间的唯一区别。使用200,浏览器不会自动转发请求,只会显示“重定向...”页面。
  • 我尝试更改代码,但我什至没有得到您所说的重定向页面。感谢您的帮助
  • 你在 Flask 日志中看到了什么(127.0.0.1:3000 之一)?我看到 3 个请求:1) "GET / HTTP/1.1" 200 - 2) 单击提交按钮后:"GET /process?casa=test1&amp;trasferta=test2 HTTP/1.1" 302 - 3) "GET /result/test-string HTTP/1.1" 200 - 。我直接用winner="test-string"的地方。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-09
  • 1970-01-01
  • 1970-01-01
  • 2020-08-15
相关资源
最近更新 更多