flask入門之表單的實(shí)現(xiàn)
一、原生表單
form.html
{% extends 'common/base.html' %} {% block title %} 原生表單 {% endblock %} {% block pagecontent %} {# <form action="{{ url_for('check') }}" method="post">#} <form action="{{ url_for('form') }}" method="post"> <p>用戶名: <input type="text" name="username" placeholder="請(qǐng)輸入用戶名" maxlength="12"></p> <p>密碼: <input type="password" name="userpass" placeholder="請(qǐng)輸入密碼..."></p> <p><input type="submit" value="提交"></p> </form> {% endblock %}
manage.py
@app.route('/form/') def form(): return render_template('form1.html') #接收表單的數(shù)據(jù) @app.route('/check/',methods=['POST']) def check(): print(request.form) return '提交過來了'
將倆個(gè)路由地址合并為同一個(gè)
@app.route('/form/',methods=['GET','POST']) def form(): if request.method == 'POST': print(request.form) return render_template('form1.html')
二、使用flask-wtf表單擴(kuò)展庫(kù)
作用: 是一個(gè)用于表單處理的擴(kuò)展庫(kù) 提供表單的校驗(yàn) csrf的功能
pip install flask-wtf
使用
(1) 字段類型
字段名稱 | 字段類型 |
---|---|
StringField | 普通文本字段 |
PasswordField | 密碼框 |
SubmitField | 提交按鈕 |
TextAreaField | 多行文本域 |
HiddenField | 隱藏域 |
DateField | 日期 |
DateTimeField | 日期時(shí)間 |
IntegerField | 整形 |
FloatFIeld | 浮點(diǎn)型 |
RadioField | 單選字段 |
SelectField | 下拉 |
FileField | 文件上傳字段 |
BooleanField | 布爾字段 |
(2) 驗(yàn)證器
驗(yàn)證器 | 說明 |
---|---|
DataRequired | 必填 |
Length | 長(zhǎng)度 min max |
IPAddress | IP地址 |
郵箱 | |
URL | 地址 |
Regexp | 正則匹配 |
EqualTo | 驗(yàn)證倆個(gè)字段值的正確性 |
NumberRange | 輸入值的范圍 min max |
實(shí)例
在manage中
from flask import Flask,render_template,request from flask_script import Manager from flask_bootstrap import Bootstrap #導(dǎo)入自定義表單類的基類 from flask_wtf import FlaskForm #導(dǎo)入表單的字段 from wtforms import StringField,PasswordField,SubmitField #導(dǎo)入驗(yàn)證器 from wtforms.validators import Length,DataRequired app = Flask(__name__) bootstrap = Bootstrap(app) #加密種子 csrf需要使用 app.config['SECRET_KEY'] = 'abcdedff' manager = Manager(app) class Login(FlaskForm): username = StringField('用戶名',validators=[Length(min=6,max=12,message='用戶名的長(zhǎng)度為6~12為'),DataRequired(message='用戶名不能為空!!!')]) userpass = PasswordField('密碼',validators=[Length(min=6,max=12,message='用戶名的長(zhǎng)度為6~12為'),DataRequired(message='密碼不能為空!!!')]) submit = SubmitField('登錄') @app.route('/') def index(): return render_template('index.html') @app.route('/form/',methods=['GET','POST']) def form(): #將表單類實(shí)例化 form = Login() if request.method == 'POST': #驗(yàn)證是否存在正確的csrftoken和 數(shù)據(jù)的正確性 如果都正確則為真 if form.validate_on_submit(): # print(request.form) print(form.username.data) return render_template('form2.html',form=form) from flask import Flask,render_template,request from flask_script import Manager from flask_bootstrap import Bootstrap #導(dǎo)入自定義表單類的基類 from flask_wtf import FlaskForm #導(dǎo)入表單的字段 from wtforms import StringField,PasswordField,SubmitField #導(dǎo)入驗(yàn)證器 from wtforms.validators import Length,DataRequired app = Flask(__name__) bootstrap = Bootstrap(app) #加密種子 csrf需要使用 app.config['SECRET_KEY'] = 'abcdedff' manager = Manager(app) class Login(FlaskForm): username = StringField('用戶名',validators=[Length(min=6,max=12,message='用戶名的長(zhǎng)度為6~12為'),DataRequired(message='用戶名不能為空!!!')]) userpass = PasswordField('密碼',validators=[Length(min=6,max=12,message='用戶名的長(zhǎng)度為6~12為'),DataRequired(message='密碼不能為空!!!')]) submit = SubmitField('登錄') @app.route('/') def index(): return render_template('index.html') @app.route('/form/',methods=['GET','POST']) def form(): #將表單類實(shí)例化 form = Login() if request.method == 'POST': #驗(yàn)證是否存在正確的csrftoken和 數(shù)據(jù)的正確性 如果都正確則為真 if form.validate_on_submit(): # print(request.form) print(form.username.data) return render_template('form2.html',form=form)
在模板中
{% extends 'common/base.html' %} {% block title %} 原生表單 {% endblock %} {% block pagecontent %} <form action="{{ url_for('form') }}" method="post"> <p>{{ form.csrf_token }}</p> <p>{{ form.username.label() }} {{ form.username(style='color:red;',class='userclass',placeholder='請(qǐng)輸入用戶名') }} {% if form.errors%} <span style="color:red;">{{ form.errors.username.0 }}</span> {% endif %} </p> <p>{{ form.userpass.label() }} {{ form.userpass() }}</p> <p>{{ form.submit() }}</p> </form> {% endblock %}
使用 bootstrap渲染表單
{% import 'bootstrap/wtf.html' as wtf %} {% block pagecontent %} <div class="row"> <div class="col-md-8">圖片</div> <div class="col-md-4">{{ wtf.quick_form(form,action="",method="") }} </div> </div> {% endblock %}
自定義表單驗(yàn)證器
class Login(FlaskForm): ... def validate_username(self,field): # print(field) if field.data == 'zhangsan': # if self.username.data == 'zhangsan': raise ValidationError('該用戶已存在')
注意:
validate_ 驗(yàn)證的字段名稱 為固定格式
所有字段和驗(yàn)證器方法的使用
class Login(FlaskForm): username = StringField('用戶名',validators=[Length(min=6,max=12,message='用戶名的長(zhǎng)度為6~12為'),DataRequired(message='用戶名不能為空!!!')]) userpass = PasswordField('密碼',validators=[Length(min=6,max=12,message='用戶名的長(zhǎng)度為6~12為'),DataRequired(message='密碼不能為空!!!'),EqualTo('confirm',message='倆次密碼輸入不一致')]) confirm = PasswordField('確認(rèn)密碼') info = TextAreaField('個(gè)人簡(jiǎn)介',validators=[Length(min=6,max=20,message='內(nèi)容為6-20個(gè)長(zhǎng)度'),DataRequired(message='內(nèi)容不能為空')],render_kw={"style":"resize:none;",'placeholder':"請(qǐng)輸入你此刻的感謝..."}) hidde = HiddenField() birth = DateField('出生日期') birth = DateTimeField('出生日期') age = IntegerField('年齡',validators=[NumberRange(min=6,max=99,message='年齡為6~99歲')]) money = FloatField() sex = RadioField(choices=[('w','女'),('m','男')]) address = SelectField(choices=[('1001','北京'),('1002','上海'),('1003','天津')]) file = FileField('文件上傳') argee = BooleanField('請(qǐng)仔細(xì)閱讀以上條款') ip = StringField('IPV4',validators=[IPAddress(message='請(qǐng)輸入正確的ip地址')]) url = StringField('url地址',validators=[URL(message='輸入正確的url地址')]) email = StringField('email',validators=[Email(message='請(qǐng)輸入正確的郵箱地址')]) preg = StringField('手機(jī)號(hào)碼',validators=[Regexp('^[1][3-8][0-9]{9}$',flags=re.I,message='請(qǐng)輸入正確的手機(jī)號(hào)碼')]) submit = SubmitField('登錄')
三、flash 消息的顯示
概述: 當(dāng)用戶請(qǐng)求 或者有消息的顯示 通過flash,get_flashed_messages 來進(jìn)行操作
導(dǎo)入
from flask import flash,get_flashed_messages
from flask import flash,get_flashed_messages class Login(FlaskForm): username = StringField('用戶名',validators=[DataRequired(message='用戶名不能為空')]) userpass = PasswordField('密碼',validators=[DataRequired(message='密碼不能為空')]) submit = SubmitField('登錄') @app.route('/form/',methods=['GET','POST']) def form(): form = Login() if form.validate_on_submit(): if form.username.data == 'zhangsan' and form.userpass.data == '123456': flash('登錄成功') return redirect(url_for('index')) else: flash('當(dāng)前用戶不存在') return render_template('user/login.html',form=form)
使用
{% for message in get_flashed_messages() %} <div class="alert alert-danger" role="alert">{{ message }}</div> {% endfor %}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- flask中主動(dòng)拋出異常及統(tǒng)一異常處理代碼示例
- Flask教程之重定向與錯(cuò)誤處理實(shí)例分析
- Flask web開發(fā)處理POST請(qǐng)求實(shí)現(xiàn)(登錄案例)
- Flask框架學(xué)習(xí)筆記之使用Flask實(shí)現(xiàn)表單開發(fā)詳解
- Flask框架學(xué)習(xí)筆記之表單基礎(chǔ)介紹與表單提交方式
- Python的Flask框架中web表單的教程
- 在Python的Flask中使用WTForms表單框架的基礎(chǔ)教程
- 在Python的Flask框架中構(gòu)建Web表單的教程
- Python Flask-web表單使用詳解
- 詳解flask表單提交的兩種方式
- Flask框架WTForm表單用法示例
- Flask框架學(xué)習(xí)筆記之消息提示與異常處理操作詳解
相關(guān)文章
利用Python如何實(shí)現(xiàn)一個(gè)小說網(wǎng)站雛形
這篇文章主要給大家介紹了關(guān)于利用Python如何實(shí)現(xiàn)一個(gè)小說網(wǎng)站雛形的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用python具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-11-11Pandas中把dataframe轉(zhuǎn)成array的方法
下面小編就為大家分享一篇Pandas中把dataframe轉(zhuǎn)成array的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-04-04python通過加號(hào)運(yùn)算符操作列表的方法
這篇文章主要介紹了python通過加號(hào)運(yùn)算符操作列表的方法,實(shí)例分析了Python使用加號(hào)運(yùn)算符實(shí)現(xiàn)列表追加的方法,需要的朋友可以參考下2015-07-07Anaconda3+tensorflow2.0.0+PyCharm安裝與環(huán)境搭建(圖文)
這篇文章主要介紹了Anaconda3+tensorflow2.0.0+PyCharm安裝與環(huán)境搭建(圖文),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02python opencv實(shí)現(xiàn)任意角度的透視變換實(shí)例代碼
這篇文章主要介紹了python opencv實(shí)現(xiàn)任意角度的透視變換實(shí)例代碼,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01tensorflow實(shí)現(xiàn)從.ckpt文件中讀取任意變量
這篇文章主要介紹了tensorflow實(shí)現(xiàn)從.ckpt文件中讀取任意變量,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-05-05Python request設(shè)置HTTPS代理代碼解析
這篇文章主要介紹了Python request設(shè)置HTTPS代理代碼解析,分享了相關(guān)代碼示例,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-02-02修改python plot折線圖的坐標(biāo)軸刻度方法
今天小編就為大家分享一篇修改python plot折線圖的坐標(biāo)軸刻度方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-12-12