模板
模板導入就是將另一個模板加載到當前模板中,直接渲染。模板繼承和類的繼承含義是一樣的,主要是為了提高代碼重用,減輕開發人員的工作量。 典型應用:網站的頭部、尾部信息。
模板導入
-
語法
{% include(‘模板名稱’) %} {% include(‘目錄/模板名稱’) %}
-
使用
忽略模板文件不存在時的錯誤 {% include 'footer.html' ignore missing %} #也可以組成模板列表,會按照順序依次加載 {% include ['footer.html','bottom.html','end.html'] ignore missing %}`
模板繼承
如果發現在多個模板中某些內容相同,那就應該把這段內容定義到父模板中。
標簽block:用於在父模板中預留區域,留給子模板填充差異性的內容,名字不能相同。 為了更好的可讀性,建議給endblock標簽寫上名字,這個名字與對應的block名字相同。父模板中也可以使用上下文中傳遞過來的數據。
-
父模板
{%block 名稱%} 預留區域,可以編寫默認內容,也可以沒有默認內容 {%endblock %}
-
子模板
標簽extends:繼承,寫在子模板文件的第一行。 {% extends "父模板路徑"%} 如果子模版沒有填充,則使用父模版定義的默認值。如果有就是用子模板的實際填充內容 {%block 名稱%} 實際填充內容 {%endblock %}
模板宏
在Flask的模板中有一個特性和Django內不同,這個特性就是宏。宏的功能和python中的函數類似。
-
聲明一個宏
{% macro 宏的名字(參數) %} 內容 {% endmacro %}
-
調用宏
{{ 宏的名字(參數) }}
在python函數可以實現代碼復用的作用,在模板中宏也有類似的作用
模板宏的使用和python中的函數的使用也類似,參數也是類似的。模板宏不常用,如果想看詳細內容 點這里(是csdn的一篇博客)
模板表單 Flask-WTF
當前端使用form表單進行參數傳遞時候,前端一般都會用js來校驗用戶輸入的參數是否合法。作為后端,不能依賴前端的校驗。要在前端校驗的基礎上在進行一遍校驗,防止程序出現異常。
當參數過多時,我們要對每個參數都進行校驗,顯得非常麻煩。在Flask中我們可以用Flask-WTF幫助我們快速校驗。Flask-WTF是集成WTForms,並帶有 csrf 令牌的安全表單和全局的 csrf 保護的功能。
安裝
pip install flsk-wtf
- WTForms支持的HTML標准字段
字段 | 說明 |
---|---|
StringField | 文本字段 |
TextAreaField | 多行文本字段 |
PasswordField | 密碼文本字段 |
HiddenField | 隱藏文本字段 |
DateField | 文本字段,值為datetime.date格式 |
DateTimeField | 文本字段,值為datetime.datetime格式 |
IntegerField | 文本字段,值為整數 |
DecimalField | 文本字段,值為decimal.Decimal |
FloatField | 文本字段,值為浮點數 |
BooleanField | 復選框,值為True和False |
RadioField | 一組單選框 |
SelectField | 下拉列表 |
SelectMultipleField | 下拉列表,可選擇多個值 |
FileField | 文本上傳字段 |
SubmitField | 表單提交按鈕 |
FormField | 把表單作為字段嵌入另一個表單 |
FieldList | 一組指定類型的字段 |
- WTForms常用驗證函數
函數 | 說明 |
---|---|
DataRequired | 確保字段中有數據 |
EqualTo | 比較兩個字段的值,常用於比較兩次密碼輸入 |
Length | 驗證輸入的字符串長度 |
NumberRange | 驗證輸入的值在數字范圍內 |
URL | 驗證URL |
AnyOf | 驗證輸入值在可選列表中 |
NoneOf | 驗證輸入值不在可選列表中 |
注意:
使用Flask-WTF需要配置參數SECRET_KEY。
SECRET_KEY用來生成加密令牌,當CSRF激活的時候,該設置會根據設置的密匙生成加密
具體實現:
from flask import Flask, render_template, redirect, url_for, session, request, flash
# 導入wtf擴展的表單類
from flask_wtf import FlaskForm
# 導入自定義表單需要的字段
from wtforms import SubmitField, StringField, PasswordField
# 導入wtf擴展提供的表單驗證器
from wtforms.validators import DataRequired, EqualTo
app = Flask(__name__)
# 一定要記得配置SECRET_KEY!!!!!!!!!!!!!!
app.config['SECRET_KEY'] = 'python is good'
# 自定義表單類,文本字段、密碼字段、提交按鈕
class Login(FlaskForm):
name = StringField(label='用戶:', validators=[DataRequired('用戶名不能為空')])
pwd = PasswordField(label='密碼', validators=[DataRequired('密碼不能為空'), EqualTo('pwd1', '密碼不一樣')])
pwd1 = PasswordField(label='確認密碼', validators=[DataRequired('密碼不能為空')])
submit = SubmitField('提交')
@app.route('/login')
def login():
return render_template('login.html')
# 定義根路由視圖函數,生成表單對象,獲取表單數據,進行表單數據驗證
@app.route('/', methods=['GET', 'POST'])
def index():
form = Login()
# 如果前端頁面的輸入的有錯誤,validate_on_submit是為flase
if form.validate_on_submit():
name = form.name.data
pwd = form.pwd.data
pwd1 = form.pwd1.data
print(name, pwd, pwd1)
return redirect(url_for('login'))
return render_template('index.html', form=form)
if __name__ == '__main__':
app.run(debug=True)
模板頁面:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form method="post">
// 這個也是很重要的
<!--設置csrf_token-->
{{ form.csrf_token() }}
{{ form.name.label }}
<p>{{ form.name }}</p>
{% for msg in form.name.errors %}
<p>{{ msg }}</p>
{% endfor %}
{{ form.pwd.label }}
<p>{{ form.pwd }}</p>
{% for msg in form.pwd.errors %}
<p>{{ msg }}</p>
{% endfor %}
{{ form.pwd1.label }}
<p>{{ form.pwd1 }}</p>
{% for msg in form.pwd1.errors %}
<p>{{ msg }}</p>
{% endfor %}
<p>{{ form.submit() }}</p>
{% for x in get_flashed_messages() %}
{{ x }}
{% endfor %}
</form>
</body>
</html>
如果有什么問題請大家在下方評論,我會改正的!—_—!