【问题标题】:Submitting code created form data to POST将代码创建的表单数据提交到 POST
【发布时间】:2018-09-09 03:37:31
【问题描述】:

我正在尝试将表单数据提交到路由,类似于浏览器的方式,但是遇到了问题。我已将提供的代码简化为重现问题所需的最低限度。我可能没有使用我应该使用的功能或做错了其他事情,但我无法在我搜索过的所有其他帖子中找到答案。我不希望数据位于 URL 上,而是通过 request.form 访问。我正在使用 Python 2.7.9。我知道下面显示的代码目前没有做我想要的(它将 formdata 字典放在命令行上)并返回一个无限循环,因为 formdata 永远不会被读取。我明白这一点,我这样做只是为了表明我正在尝试将 formdata 传递给 post 函数,我只是不知道该怎么做,同时还使用了重定向。如果我正确阅读了重定向文档,它似乎说你不能这样做。那么我可以使用其他一些函数来将参数传递给 URL 并提供表单数据吗?我没有使用下面代码中的参数,但我的实际代码在我确实使用它们的地方具有类似的函数结构。这里的主要目标是在通过表单提交或不提交“选择”时使用相同的功能(URL 路径)。任何帮助表示赞赏。谢谢。

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

web_server = Flask(__name__)

@web_server.route("/test_<param1>_<param2>",methods=['POST','GET'])
def test1(param1,param2):
    if request.method == 'GET':
        choice1 = 'No choice made yet'
        templateData = {'choice':choice1} 
        return render_template('form_page.html', **templateData)
    elif request.method == 'POST':
        if 'choice' in request.form:
            choice1 = request.form['choice']
            templateData = {'choice':choice1} 
            return render_template('form_page.html', **templateData)
        else:
            formdata = {'choice':'QQQ'}
            p1='AAA'
            p2='BBB'
            # the following line is NOT what I want to do. See question 
            return redirect(url_for('.test1',param1=p1,param2=p2,data=formdata),code=307)


# run server
if __name__ == "__main__":
    web_server.run(host='0.0.0.0',port=80,debug=True)

HTML:

Choice was {{choice}}<br><br>

<form method="post">
Make a choice:
<input type="text" name="choice"><br><br>
<input type="submit">
</form>

<form method="post">
Do anything else:
<input type="text" name="other"><br><br>
<input type="submit">
</form>

【问题讨论】:

  • 我不太清楚你想要完成什么。你能改写实际问题吗?
  • 感谢您的评论和评论。我正在尝试将表单数据(我可以通过 request.form 在我的程序中访问的内容)从我的代码提交到我服务器上的 URL。表单数据不应在 URL 中,而应像“提交”表单那样提交。我遇到的帖子并没有完全做到这一点。关于我的代码,如果我的第一个代码注释下方的行已修复,您将能够运行它并在“做其他事情”html 表单上提交任何内容,它会在网页顶部显示“QQQ” .如果这仍然不清楚,请告诉我,我会尽力澄清。谢谢。
  • 我刚刚测试了你的代码,看看发生了什么,我想我现在明白你的问题了。它位于重定向 url_for 语句中。您尝试传递要在模板内部使用的参数,但它会在 url 中显示它们(而不是在模板中)。据我所知,这是不可能的。 url_for 需要 url 参数,不能在模板中使用它们。作为一种解决方案,您可以使用 render_template 或使用 session 来存储任何 request.form 发布数据。
  • 我知道 url_for 不会像我想做的那样提交表单(我不够清楚,是我的错)。我正在尝试了解是否有办法通过 POST 请求提交表单数据(除了在 URL 上包含它)。只要request.form中的数据可用,如果有其他方法,我就不必使用redirect或url_for。会话存储数据似乎是一种解决方法(尽管这是个好主意,但我没有想到),但如果必须,我不反对使用它。我应该使用其他命令将表单数据发布到该行上的 URL 而不是重定向或 url_for?
  • 您能澄清一下“将表单数据发布到 url”是什么意思吗?

标签: python redirect flask


【解决方案1】:

让我们看看这是否是您的意思,请参阅下面的快速而肮脏的代码。仔细查看 request.args 语句,您可以在其中获取存储在 url 中的变量。

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

app = Flask(__name__)

@app.route('/',methods=['POST','GET'])
def test1():
if request.method == 'POST':
    if 'choice' in request.form:
        choice = request.form['choice']
        return render_template('test.html', choice = choice)
    else:
        choice = 'QQQ'
        p1 = 'AAA'
        p2 = 'BBB'
        return redirect(url_for('.test1',param1 = p1, param2 = p2, choice = choice))

choice = request.args.get("choice")
if choice == None:
    choice = 'No choice made yet'
return render_template('test.html',  choice = choice)

if __name__ == "__main__":
    app.run(host='0.0.0.0',port=5000,debug=True)

【讨论】:

  • request.args不是只用来访问URL中的参数吗?我正在尝试发布可以从 request.form 访问的数据。
  • 查看编辑。基本上有渲染模板,您可以在其中将变量传递给模板。这些变量可以从 request.form 语句中得到。通过 url_for 你可以得到 request.args。如果两者都不可能,我建议使用 session.您可以在 post 方法部分写入 session,并在 get 方法中从 session 中读取。如果这些可能性仍然无法解决您的问题,我很高兴收到您的来信。
  • 好的,我会在今晚回家(现在正在工作)时尝试你的最后一个建议,如果需要,我会使用 session。感谢您的所有帮助和耐心。
猜你喜欢
  • 2014-12-13
  • 1970-01-01
  • 2010-10-08
  • 2017-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-06
  • 2015-03-11
相关资源
最近更新 更多