[英]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.