繁体   English   中英

通过按钮将变量从 HTML 传递到 Flask,将类型更改为字符串

[英]Passing a variable from HTML to Flask through a button, changes the type to string

我需要将一个变量var从 HTML 页面传递给 flask,并尝试了下面的代码,但问题是 request.form 将var的类型从 dict 更改为 string。 我使用json.loads(item)将其改回,但变量 dict 包含一个datetime时间值,该值给出json.decoder.JSONDecodeError: Expecting value: line 1 column 95 (char 94)错误。 我宁愿不必处理它从一开始就改变类型的问题,任何有更好的想法将变量从 HTML 传递到 Flask 的人?

my_bookings.html

<form action="#" method="POST">
   <input name="cancel_var" value="{{var}}" type=hidden>
   <button type="submit"> Cancel var </button>
</form>

app.py

@app.route('/my_bookings', methods=['GET', 'POST'])
def my_bookings():
if request.method == 'POST':
    var = request.form['cancel_var']
    cancel_var = json.loads(var) # This gives a json.decoder error because of one value is datetime-object

为了澄清, var是一个 dict 并包含:

var = {"number": 3, "date": datetime.datetime(2020, 5, 14, 0, 0)}并作为<class 'str'>返回到 Flask,但我希望它保持不变一个字典。

那不是它的工作原理......但我想你可以做一些疯狂的事情

import cPickle,base64

def my_endpoint():
    if request.method == "POST":
         my_data = request.form['cancel_var']
         my_data = base64.b64decode(my_data) # convert back to binary
         # note that pickle can be dangerous and this is really probably
         # not a good idea if someone might submit malicious code
         my_data = cPickle.loads(my_data) # back to python objects
         print("GOT DATA:",repr(my_data))    

    my_var = cPickle.dumps(var) # serialize to a string
    my_var = base64.b64encode(my_var) # ensure ascii character set
    return render('my_html.html',var=my_var)

但这通常是一个非常糟糕的主意...您可以序列化为 json 而不是 pickle (更安全,更快),但 json 不会序列化您的日期时间

可能你应该做的不是这个....

相反,您应该将数据保存给用户 session 并在他们提交时检查

def my_endpoint():
    if request.method == "POST":
         print("GOT DATA:",request.session['cancel_var'])    
    request.session['cancel_var'] = var
    return render('my_html.html',var="you dont need this")

或将其保存在用户 cookies 或数据库中,甚至保存在磁盘上的文件中……或者根本不知道您要完成什么

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM