当前位置: 首页 > Linux

Flask5.Form

时间:2023-04-07 03:24:14 Linux

Form1.Flask-WTFextensionFlask-WTF及其依赖可以使用pip安装:(venv)$pipinstallflask-wtf2,跨站请求伪造保护[setkey]app=Flask(__name__)app.config['SECRET_KEY']='hardtoguessstring'app.config字典可用于存储框架、扩展和应用程序本身的配置变量。3.Form类创建表单三步:定义Form的子类,在类中添加字段,在字段中添加验证函数#Form基类由Flask-WTF扩展定义fromflask_wtfimportFlaskForm#字段直接导入fromtheWTFormspackagefromwtformsimportStringField,SubmitField#验证函数直接从WTFormspackage中导入fromwtforms.validatorsimportDataRequired,LengthclassNameForm(Form):name=StringField('Inputyourname:',validators=[DataRequired()])submit=SubmitField('Submit')与其他扩展的区别在于:①不是实例化,而是继承;②还需要从wtforms中导入字段和校验函数[注意]Form基类是由Flask-WTF扩展定义的,所以从flask_wtf中导入。字段和校验函数可以直接从WTForms包中导入。4.将表单渲染成HTML表单字段是可调用的,在模板中调用后会渲染成HTML。假设视图函数通过参数form传入一个NameForm实例到模板中,就可以在模板中生成一个简单的表单,如下所示:{{form.hidden_??tag()}}{{form.name.label}}{{form.name()}}{{form.submit()}}可以使用Bootstrap中预定义的表单样式渲染整个Flask-WTF表单,使用Flask-Bootstrap,上面的form可以使用下面的方式进行渲染:{%import"bootstrap/wtf.html"aswtf%}{{wtf.quick_form(form)}}具体的渲染方式如下:【form.html】{%extends"base.html"%}{%import"bootstrap/wtf.html"aswtf%}{%blocktitle%}Flasky{%endblock%}{%blockpage_content%}

你好,{%ifname%}{{name}}{%else%}陌生人{%endif%}!

{{wtf.quick_form(form)}}{%endblock%}模板的内容区域现在有两部分。第一部分是页眉,显示欢迎信息。这里使用模板条件语句。Jinja2中条件语句的格式是{%ifcondition%}...{%else%}...{%endif%}。如果条件计算结果为True,则呈现if和else指令之间的值。如果条件评估为False,则呈现else和endif指令之间的值。在此示例中,如果未定义模板变量名称,则字符串“Hello,Stranger!”将被渲染。内容区域的第二部分使用wtf.quick_form()函数呈现NameForm对象。5.在视图函数中处理表单视图函数index()不仅渲染表单,还接收表单中的数据。@app.route('/form/',methods=['GET','POST'])defform():name=Noneform=NameForm()ifform.validate_on_submit():name=form.name.dataform.name.data=''returnrender_template('form.html',form=form,name=name)6.重定向和用户会话上面的视图函数存在可用性问题。用户输入姓名并提交表单后,然后点击浏览器的刷新按钮,他们会看到一个莫名其妙的警告,要求在再次提交表单之前进行确认:发生这种情况是因为浏览器会在刷新页面时重新发送上一页。已发送的最后一个请求。如果请求是带表单数据的POST请求,页面刷新后会再次提交表单。在大多数情况下,这不是理想的做事方式。许多用户不理解来自浏览器的这个警告。因此,最好不要让Web应用程序将POST请求作为浏览器发送的最后一个请求。此要求是通过使用**redirect**作为对POST请求的响应而不是常规响应来实现的。这个技巧称为Post/Redirect/Get模式。程序可以在**用户会话**中存储数据并“记住”请求之间的数据。用户会话是为连接到服务器的每个客户端而存在的私有存储。我们在请求和响应中引入了用户会话,它是请求上下文中名为**session**的变量,其操作类似于标准Python字典。fromflaskimportsession@app.route('/form2/',methods=['GET','POST'])defform2():form=NameForm()ifform.validate_on_submit():session['name']=form.name.data#这里不用设置form.name.data='',#因为已经重定向到另一个url,所以下次来这个界面return时会自动初始化为''redirect(url_for('hello'))returnrender_template('form.html',form=form,name=session.get('name'))7.Flash消息请求完成后,有时需要让用户知道状态已经改变。可以在此处使用确认消息、警告或错误通知。一个典型的例子是,用户提交了一个错误的登录表单后,服务器返回的响应重新渲染登录表单,并在表单上显示一条消息,提示用户输入了错误的用户名或密码。通过Flask的核心特性**flash()函数**可以实现这个效果fromflaskimportflash@app.route('/form3/',methods=['GET','POST'])defform3():form=NameForm()ifform.validate_on_submit():old_name=session.get('name')ifold_nameisnotNoneandold_name!=form.name.data:flash('youhavechangedyourname')session['name']=form.name.datareturnredirect(url_for('hello'))returnrender_template('form.html',form=form,name=session.get('name'))只需调用flash()函数消息无法显示,程序使用的模板需要渲染这些消息。最好在基本模板中呈现Flash消息,因为这样所有页面都可以使用它们。Flask将get_flashed_messages()函数公开给模板以获取和呈现消息。【base.html】{%blockcontent%}{%formessageinget_flashed_messages()%}×{{message}}
{%endfor%}{%blockpage_content%}{%endblock%}
{%endblock%}中在此示例中,警报消息是使用Bootstrap提供的警报CSS样式呈现的。【注意】模板中使用循环的原因是在之前的请求循环中每次调用flash()函数都会产生一条消息,所以队列中可能有多条消息等待显示。get_flashed_messages()函数获得的消息在下次调用时不会再次返回,所以闪现消息只显示一次然后消失。

最新推荐
猜你喜欢