-1

我需要将一个变量var从 HTML 页面传递到烧瓶,并尝试了下面的代码,但问题是 request.form 将vars 类型从 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是一个字典并包含:

var = {"number": 3, "date": datetime.datetime(2020, 5, 14, 0, 0)}<class 'str'>以 Flask 的形式返回,但我希望它保留为 dict。

4

1 回答 1

0

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

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 不会序列化您的日期时间

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

相反,您应该将数据保存到用户会话并在他们提交时进行检查

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或数据库中,甚至保存在磁盘上的文件中……或者根本不知道,因为我不确定您要完成什么

于 2020-05-14T04:56:50.023 回答