flask中图片reload以及session中信息不对应的问题


#1

各位好,我遇到了一个问题,希望能寻求下帮助。
我做出了一个这样的页面:
pic
预期的成果是:当用户正确的输入了用户名时,点击button提交表单,用户名和img_url都储存到session中并打印出来,当用户没有按要求输入用户名时,则弹出error信息,图片保持为当前图片。

但是现在的问题是:1)用户没有按要求输入用户名,警示信息会弹出来,但是图片刷新了;
2)用户按要求输入了用户名,打印出的user_name和img_url没有对应。比如当前图片url为’/static/images/a_195.jpg’,输入的用户名为:hello,那么我想让session中对应的是 {‘img_url’: ‘/static/images/a_195.jpg’, ‘uer’: 'hello’}。但实际情况是,当我输了用户名并且提交表单后,图片就刷新了,session中储存的是当前用户名和刷新后图片的url。

请问这个问题该如何解决呢?

以下为代码:
demo.py

@app.route('/random_image',methods=['POST','GET'])
def random_image():
    form=myForm()
    names = os.listdir(os.path.join(app.static_folder, 'images'))
    img_url = url_for('static', filename=os.path.join('images', random.choice(names)))
    session['uer']=form.user.data
    session['img_url']=img_url
    if form.validate_on_submit():
        #user_name=request.form['user']
        print(session)
    else:
        print(form.errors)
    return render_template('random_image.html',img_url=img_url,form=form)



if __name__ == '__main__':
    app.run(debug=True)

form.py

class myForm(Form):
    user = StringField('user',validators=[Length(min=4,max=25)])

random_image.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Recipe Survey</title>
</head>

<body>
<div class="container" style="margin-top: 50px">
<div align="center">
    <h2>Welcome to the "Online Recipe Origin" Survey</h2>
    <form method="POST" action="">
        {{ form.hidden_tag() }}

        {% for error in form.user.errors %}
            <span style="color: red;">[{{ error }}]</span>
            {% endfor %}
        <img src="{{ img_url }}">
        <h5>{{ img_url }}</h5>
    {{ form.user() }}
    <button type="submit" class="'btn btn-lg btn-success">Start Survey</button>
    </form>
</div>
</div>

</body>
</html>

#2

你的视图函数同时处理 GET 和 POST 请求,处理逻辑如下图,GET 请求触发红框代码,提交表单时的 POST 请求触发绿框代码:

如果你想让表单验证通过时才保存 session 值,那就把操作 session 那两行放到绿框部分。

另外,可以在表单的 user 字段添加一个 DataRequired 验证器,这样会添加 HTML 验证属性 required。如果用户没输入内容就提交,会进行前端验证,直接弹出提示,而不会刷新页面。

#3

感谢老师的回复。也要感谢您上次提示说利用session[‘page_num’]控制翻页,现在翻页也不是问题啦~但是还是有问题。
如果form中的type是Stringfield,那么添加DataRequired验证器,页面是不会再刷新了。但是如果添加的表单是Radiofield,即使是是添加了验证器,还是会出现页面刷新的情况。form代码如下:

class testform(Form):
    examples = RadioField('portals', choices=[('1', 'Option1'), ('2', 'Option2'), ('3', 'Option3')],validators=[DataRequired()])

google了一下还是没有找到解决办法。
另外,按照您的指导,将session放到submit的部分,打印出的结果还是不能对应的。

修改代码如下:

@app.route('/random_image',methods=['POST','GET'])
def random_image():
    form=testform()
    names = os.listdir(os.path.join(app.static_folder, 'images'))
    img_url = url_for('static', filename=os.path.join('images', random.choice(names)))
    print(img_url)
    if form.validate_on_submit():
        session['option'] = form.examples.data
        session['img_url'] = img_url
        print(session)
        return redirect('random_image')  # 这里加了一行是想要清空用户的选择,为翻页做准备
    else:
        print(form.errors)
    return render_template('random_image.html',img_url=img_url,form=form)

if __name__ == '__main__':
    app.run(debug=True)

#4

不客气。新问题请发新帖。


#5

好的