【问题标题】:Flask button passing variable back to python烧瓶按钮将变量传递回python
【发布时间】:2017-04-22 22:20:09
【问题描述】:

我发现了很多类似的东西,但我就是不能让它发挥作用。基本上,我有一个按钮,按下它后,我想将该值返回到我的烧瓶后端。

HTML 按钮:

<form action="" method="POST" ><button class="btn btn-danger" type="submit" name="delete" value="{{  item2  }}"><span class="glyphicon glyphicon-trash"></span> Delete</button> </form>

Python:

@app.route('/', methods=["GET","POST"])
def home():    
    if request.method == 'POST':
        if request.form['delete'] == post_id:
            (my sql login/cursor stuff....)
            sql = "DELETE FROM test_table WHERE post_id = ?"
            c.execute(sql, (post_id,))
            return redirect("/")

如您所见,我正在使用 jinja 填充链接(和后续变量)。它按应有的方式填充了按钮,但是将其发送回我的 python 脚本不起作用。

更新: 当我运行它时,我得到一个内部服务器错误。我看不到路由错误是什么,因为我无法进行调试(使用 wsgi/werkzeug)。

我认为我们可以肯定地说,不定义 post id 是它不起作用的原因。所以我的问题是,当按钮将数据发送回 python 时,python 获取什么值(以及如何获取)?是name= 还是value= 还是别的什么?

【问题讨论】:

  • 你能告诉我们更多关于什么不起作用的信息吗?我使用您的代码在现有 Flask 应用程序中创建了一个简单视图,它通过了request_method == 'POST' 的测试,并将我重定向回/ url。显然我删除了 mysql 的东西,并测试了 post_id 值 - 但我可以测试的部分似乎运行正常(包括按钮输入的 value 属性)。
  • 当我单击按钮时,我收到错误:内部服务器错误服务器遇到内部错误,无法完成您的请求。要么服务器超载,要么应用程序出错。
  • Marc,“内部服务器错误”可能表示路由中存在一些编程错误。如果您以交互方式运行应用程序,您可能可以获得回溯。正如大卫所提到的,你没有定义post_id——这可能是票。请使用任何回溯或错误消息更新您的问题。 app.debug=True 也可能有帮助。
  • "你没有定义post_id" 这绝对是问题所在。我不确定如何从按钮中获取该值。我会从name= 字段或value= 字段中提取它吗?就调试而言,我正在使用 wsgi,但无法让它与 werkzeug 一起使用。谢谢你对我的包容。我还是 Flask/Python 的新手。
  • 不错!现在我明白了。 'for kicks' 的建议正是我所希望的——返回了号码。现在我可以把它传下去了。

标签: python html flask


【解决方案1】:

你的问题是

request.form['delete'] == post_id 

您从按钮 (request.form['delete']) 获取值并尝试与不存在的变量 post_id 中的值进行比较。

如果您想从按钮获取值并分配给变量post_id,那么您需要

post_id = request.form['delete']

post_id = request.form.get('delete')

然后你可以在 SQL 查询中使用post_id

@app.route('/', methods=["GET","POST"])
def home():    
    if request.method == 'POST':

        post_id = request.form.get('delete')

        if post_id is not None:
            (my sql login/cursor stuff....)
            sql = "DELETE FROM test_table WHERE post_id = ?"
            c.execute(sql, (post_id,))
            return redirect("/")

【讨论】:

  • 太棒了!这基本上对我有用......唯一的区别是我必须这样做:sql = ("DELETE FROM test_table WHERE post_id=%s")c.execute(sql, (post_id_delete,) )
猜你喜欢
  • 2020-12-21
  • 1970-01-01
  • 2013-11-16
  • 1970-01-01
  • 1970-01-01
  • 2017-07-29
  • 2018-04-08
  • 2017-11-19
  • 1970-01-01
相关资源
最近更新 更多