CAS_hzl 2022-01-07 15:49 采纳率: 100%
浏览 146
已结题

python flask中的重定向(redirect)无法运行,求帮助,如何解决?

本人写了一个轻量级的Flask程序。按逻辑,当用户填写表单的Username和Password字段后单击Log in按钮时,应闪现一条相关的flash消息,并且页面应被重定向到 /upload 页面(即upload视图函数)。但运行时消息闪现未出现,且页面并未重定向,而是不断停留在原页面(即index视图函数)(类似于刷新)。经本人检查,表单理论上定义应该通过了视图函数内置的检验。相关代码如下:

 (app.py)(on windows 10)(Visual Studio Code)
from flask import Flask,session,request,render_template,flash,redirect,url_for
from forms import LoginForm,UploadForm

app = Flask(__name__)
app.secret_key='a62f2225bf70bfaccbc7f1ef2a397836717377de'

@app.route('/',methods=['GET','POST'])
def index():
    form = LoginForm()
    if request.method =='POST' and form.validate():
        username = form.username.data
        password = form.password.data
        flash('Welcome! %s' % username) #to a teat
        session['username'] = username #to a test
        return redirect(url_for('upload')) # to a test
        #FINAL: database operation:
        # pass
        
    return render_template('index.html',form=form)

@app.route('/upload',methods=['GET','POST'])
def upload():
    form = UploadForm()
    if request.method=='POST' and form.validate():
        file = form.file.data
        message = '' #prevent null error
        message = form.message.data
        #FINAL: database operation:
        #   pass
    return render_template('upload.html',form=form,username=session.get('username'))

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

 (forms.py)
from wtforms import Form,StringField,PasswordField,SubmitField,FileField, TextAreaField
from wtforms.validators import DataRequired,Length
class LoginForm(Form):
    username = StringField('Username',validators=[DataRequired()])
    password = PasswordField('Password',validators=[DataRequired()])
    submit = SubmitField('Log In')

class UploadForm(Form):
    file = FileField('Your File',validators=[DataRequired()])
    message = TextAreaField('Other Message',validators=[Length(min=-1,max=150,message=None)])
    submit = SubmitField('OK')


(index.html)
{% extends 'base.html' %}

{% block title %}Welcome!{% endblock %}
{% block content %}
    <h1>Welcome! Please Log In</h1>
    <form method="post">
        {{form.csrf_token}}
        <div class="form-group">
            {{form.username.label}}<br>{{form.username(class='form-control')}}<br>
        </div>
        <div class="form-group">
            {{form.password.label}}<br>{{form.password(class='form-control')}}<br>
        </div>
        {{form.submit(class='btn btn-primary')}}<br>
    </form>
{% endblock %}


(upload.html)
{% extends 'base.html' %}

{% block title %}Upload{% endblock %}
{% block content %}
    <h1>Hi, {{username}}</h1>
    <form method="post">
        {{form.csrf_token}}
        <div class="form-group">
            {{form.file.label}}<br>{{form.file(class='form-control')}}<br>
        </div>
        <div class="form-group">
            {{form.message.label}}<br>{{form.message(class='form-control')}}<br>
        </div>
        {{form.submit(class='btn btn-primary')}}<br>
    </form>
{% endblock %}
(base.html)
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>{%block title%}{%endblock%}</title>
    <link rel="icon" type="image/x-icon" href="{{url_for('static',filename='favicon.ico')}}">
    <link rel="stylesheet" href="{{url_for('static',filename='css/bootstrap.css')}}">
</head>
<body>
    <main>
        {% for message in get_flashed_messages() %}
            <div class="alert">{{message}}</div>
        {% endfor %}
        {% block content %}{% endblock %}
    </main>
</body>
<script src="{{url_for('static',filename='js/bootstrap.js')}}"></script>
</html>

问题截图:
单击前(用户名与密码是虚拟的)

img

单击后

img

  • 写回答

1条回答 默认 最新

  • CSDN专家-showbo 2022-01-07 16:43
    关注

    传入数据,下面的upload同理,要不没有数据form.validate()为false,当然不走跳转分支
    def index():
    form = LoginForm(formdata=request.form)

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 1月16日
  • 已采纳回答 1月8日
  • 创建了问题 1月7日

悬赏问题

  • ¥15 帮我解决一下膳食平衡的线性规划模型的数据实例
  • ¥40 万年历缺少农历,需要和阳历同时显示
  • ¥250 雷电模拟器内存穿透、寻基址和特征码的教学
  • ¥200 比特币ord程序wallet_constructor.rs文件支持一次性铸造1000个代币,并将它们分配到40个UTXO上(每个UTXO上分配25个代币),并设置找零地址
  • ¥15 关于Java的学习问题
  • ¥15 如何使用chatgpt完成文本分类任务?
  • ¥15 已知速度v关于位置s的等式,怎么转化为已知位置求速度v的等式
  • ¥15 我有个餐饮系统,用wampserver把环境配置好了,但是后端的网页却进去,是为什么,能不能帮远程一下?
  • ¥15 R运行没有名称为"species"的插槽对于此对象类"SDMmodelCV"
  • ¥20 基于决策树的数字信号处理,2ask 2psk 2fsk的代码,检查下报错的原因