flask===表單
阿新 • • 發佈:2018-11-17
一、巨集 macro
概述:
類似python中的函式
主體機構
{% macro 名稱([引數]...) %}
...
{% endmacro %}
呼叫:
{{ 巨集名稱([引數...]) }}
製作一個表單巨集
{% macro form(con='',type='text',name='',value='') %}
<p>{{ con }} <input type="{{ type }}" name='{{ name }}' value="{{ value }}"></p>
{% endmacro %}
<form action="">
{{ form('使用者名稱:',name='username') }}
{{ form('密碼:','text','userpass') }}
{{ form(type='submit',value='submit') }}
</form>
匯入:
(1) from … import …
{% from 'common/testmacro.html' import form %}
{{ form('密碼:','text','userpass') }}
(2) from … import … as …
{% from 'common/testmacro.html' import form as form%}
{{ form('密碼:','text','userpass') }}
(3) import … as …
{% import 'common/testmacro.html' as testmacro %}
{{ testmacro.form('使用者名稱:',name='username') }}
注意:
- 巨集的呼叫只能在下方呼叫
- 如果函式有形參則沒有實參 則不傳第不報錯
- 定義巨集的引數時候 形參預設值遵循預設值的規則 幽預設值的放後面
- 關鍵字引數的使用和 python的函式一樣 如果第一個引數使用關鍵字 後面都要使用關鍵字 如果第一個沒有使用關鍵字 後面關鍵字可有可無
二、過濾器
概述
就是python中的函式 在值輸出之前 對其進行過濾在輸出
-
abs 絕對值
-
default 預設值 預設情況下 當變數不存在則執行預設值
{{ var|default(‘預設值’) }}
{{ var|default(‘預設值’,boolean=True) }} 變數不存在和bool的假都執行預設值
-
first 第一個值
-
last 最後一個值
-
format
{{ “我叫%s 我今年%d歲了 我的存款是%.2f元 我的格言是%s”|format(‘學委’,28,2222,‘放蕩不雞愛學習’) }}
-
length 長度
-
join 拼湊成字串
-
safe 安全的 不轉義html程式碼
-
int 整形
-
float 浮點形
-
string 字串
-
list 列表
-
lower 小寫
-
upper 大寫
-
replace 替換
-
striptags 去除html標籤
自定義過濾器
需求:
我的文章內容在首頁展示的時候 一旦超出了某個長度以後 顯示為 …
例項
方法一
@app.template_filter()
def showEllipsis(Str,length=20):
if len(Str) > length:
Str = Str[:length]+'...'
return Str
方法二
def showEllipsis(Str,length=20):
if len(Str) > length:
Str = Str[:length]+'...'
return Str
#新增過濾器
app.add_template_filter(showEllipsis)
在模板中使用
<li>{{ Str|showEllipsis(30) }}</li>
三、檢視函式傳遞多個引數
(1) 普通傳參
@app.route('/')
def index():
return render_template('index.html',title='首頁'...)
(2) 使用字典
@app.route('/')
def index():
return render_template('index.html',con={'title':'首頁'...})
return render_template('index.html',**{'title':'首頁'...})
(3) 使用locals函式
@app.route('/test_filter/')
def test_filter():
title = '標題'
con = '內容'
# print(locals())
return render_template('testfilter.html',**locals())
(4) 使用全域性變數g
from flask import g
@app.route('/test_filter/')
def test_filter():
g.title = '標題'
g.con = '內容'
return render_template('testfilter.html')
使用
g.title
g.con
四、靜態資源載入
什麼是靜態資源:
css、js、images
目錄結構
project/
templates/
static/
img/
css/
js/
upload/
manage.py
變數
{{ url_for(‘static’,filename=‘路徑/檔名.字尾’,_external=True) }}
例項:
<img src="{{ url_for('static',filename='img/timg.jpeg',_external=True) }}" alt="">
Flask表單
一、原生表單
(1) 檢視函式
#允許post提交
@form.route('/do_form/',methods=['GET','POST'])
def do_form():
if request.method == 'POST':
print(request.form)
print(request.form.get('username'))
print(request.form.get('userpass'))
return '資料提交過來了'
return render_template('form.html')
(2) html程式碼
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h2>表單</h2>
<form action="{{ url_for('form.do_form') }}" method="post">
<p>使用者名稱: <input type="text" name="username"></p>
<p>密碼: <input type="password" name="userpass"></p>
<p><input type="submit" value="submit"></p>
</form>
</body>
</html>
二、Flask-wtf擴充套件庫
概述:
是一個用於處理表單的擴充套件庫 提供了表單校驗 csrf等功能
安裝:
pip3 install flask-wtf
常見欄位型別
欄位型別 | 說明 |
---|---|
StringField | 普通文字欄位 |
SubmitField | 提交按鈕 |
PasswordField | 密碼框 |
HiddenField | 隱藏域 |
TextAreaField | 多行文字域 |
DateField | 日期 |
DateTimeField | 日期和時間 |
IntegerField | 整形 |
FloatField | 浮點形 |
BooleanFIeld | 布林形 |
RadioField | 單選 |
SelectField | 下拉 |
FileField | 檔案上傳 |
常見表單驗證器
驗證器 | 說明 |
---|---|
DateRequired | 必填 |
驗證郵箱 | |
URL | 驗證url地址 |
IPAddress | 驗證IP地址 |
Length | 長度限制 min 和max |
NumberRange | 值的範圍 min 和 max |
EqualTo | 驗證倆個欄位的值是否相同 |
Regexp | 正則匹配 |
註冊類
from flask import Flask,render_template,request
from flask_script import Manager
from flask_bootstrap import Bootstrap
from flask_wtf import FlaskForm #匯入表單基類
from wtforms import StringField,PasswordField,SubmitField #匯入欄位
from wtforms.validators import DataRequired,Email,Length,EqualTo #匯入驗證器
app = Flask(__name__)
app.config['SECRET_KEY'] = 'asd271basx.a2'
bootstrap = Bootstrap(app)
manager = Manager(app)
# 自定義表單類
class Register(FlaskForm):
#name名 = 文字型別 text 引數1:為label 驗證器:部位空 值的長度範圍限制
username = StringField('使用者名稱',validators=[DataRequired('使用者名稱不能為空!'),Length(min=6,max=12,message='使用者名稱為6~12位之間')])
userpass = PasswordField('密碼',validators=[DataRequired('密碼不能為空!'),Length(min=6,max=12,message='密碼在6~12位之間')])
confirm = PasswordField('確認密碼',validators=[DataRequired('確認密碼不能為空!'),Length(min=6,max=12,message='確認密碼在6~12位之間'),EqualTo('userpass',message='密碼和確認密碼不一致!')])
email = StringField('郵箱',validators=[DataRequired('郵箱不能為空!'),Email(message='請輸入正確的郵箱地址')])
submit = SubmitField('註冊')
@app.route('/register/',methods=['GET','POST'])
def register():
form = Register() #例項化表單類
#csrf和表單驗證器都通過了則為真
if form.validate_on_submit():
print(form.username.data)
print(form.userpass.data)
print(request.form)
return '資料提交'
return render_template('register.html',form=form)
register.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h2>註冊類</h2>
<form action="" method="post">
{{ form.csrf_token }}
{# 取出label標籤 也就是你的使用者名稱 #}
{{ form.username.label() }}
{# 取出文字標籤 #}
{{ form.username() }}
{# 迴圈顯示錯誤資訊 #}
{% for err in form.username.errors %}
<span style="color: red;">{{ err }}</span>
{% endfor %}
<br>
{{ form.userpass.label() }}
{{ form.userpass() }}
{# 迴圈顯示錯誤資訊 #}
{% for err in form.userpass.errors %}
<span style="color: red;">{{ err }}</span>
{% endfor %}
<br>
{{ form.confirm.label() }}
{{ form.confirm() }}
{# 迴圈顯示錯誤資訊 #}
{% for err in form.confirm.errors %}
<span style="color: red;">{{ err }}</span>
{% endfor %}
<br>
{{ form.email.label() }}
{{ form.email() }}
{# 迴圈顯示錯誤資訊 #}
{% for err in form.email.errors %}
<span style="color: red;">{{ err }}</span>
{% endfor %}
<br>
{{ form.submit() }}
</form>
</body>
</html>
用封裝巨集來渲染
{% macro formMacro(formfield) %}
<tr>
<td>{{ formfield.label() }}</td>
<td>{{ formfield() }}</td>
<td>
{% for err in formfield.errors %}
<span>{{ err }}</span>
{% endfor %}
</td>
</tr>
{% endmacro %}
<table>
<form action="" method="post">
{{ form.csrf_token }}
{{ formMacro(form.username) }}
{{ formMacro(form.userpass) }}
{{ formMacro(form.confirm) }}
{{ formMacro(form.email) }}
<tr>
<td>{{ form.submit() }}</td>
</tr>
</form>
</table>
自定義表單驗證器
# 自定義表單驗證器 驗證username欄位的值
def validate_username(self,field):
# print(field.data)
# print(self.username.data)
if field.data == 'zhangsan':
raise ValidationError('該使用者已存在 請重新輸入')
取出表單傳遞過來的值
- request.form
- form.屬性名.data
使用bootstrap快速渲染表單
{% extends 'common/base.html' %}
{% block pagecontent %}
{% from 'bootstrap/wtf.html' import quick_form %}
<div class="row">
<div class="col-md-8">.col-md-8</div>
<div class="col-md-4">{{ quick_form(form) }}</div>
</div>
{% endblock %}
注意:
想要給欄位新增額外的屬性和值 render_kw
#name名 = 文字型別 text 引數1:為label 驗證器:部位空 值的長度範圍限制
username = StringField('使用者名稱',validators=[DataRequired('使用者名稱不能為空!'),Length(min=6,max=12,message='使用者名稱為6~12位之間')],render_kw={'placeholder':'請輸入使用者名稱','minlength':6,'maxlength':12,'style':'color:red;'})