Flask框架 之模版

1、過濾器html

safe:禁用轉義;前端

  <p>{{ '<em>hello</em>' | safe }}</p>flask

capitalize:把變量值的首字母轉成大寫,其他字母轉小寫;api

  <p>{{ 'hello' | capitalize }}</p>session

lower:把值轉成小寫;app

  <p>{{ 'HELLO' | lower }}</p>函數

upper:把值轉成大寫;post

  <p>{{ 'hello' | upper }}</p>ui

title:把值中的每一個單詞的首字母都轉成大寫;url

  <p>{{ 'hello' | title }}</p>

trim:把值的首尾空格去掉;

  <p>{{ ' hello world ' | trim }}</p>

reverse:字符串反轉;

  <p>{{ 'olleh' | reverse }}</p>

format:格式化輸出;

  <p>{{ '%s is %d' | format('name',17) }}</p>

striptags:渲染以前把值中全部的HTML標籤都刪掉;

  <p>{{ '<em>hello</em>' | striptags }}</p>

first:取第一個元素

  <p>{{ [1,2,3,4,5,6] | first }}</p>

last:取最後一個元素

  <p>{{ [1,2,3,4,5,6] | last }}</p>

length:獲取列表長度

  <p>{{ [1,2,3,4,5,6] | length }}</p>

sum:列表求和

  <p>{{ [1,2,3,4,5,6] | sum }}</p>

sort:列表排序

  <p>{{ [6,2,3,1,5,4] | sort }}</p>

 

2、自定義過濾器

  一、定義函數方式

@app.route("/")
def index():
    data = [1,2,3,4,5]
    return render_template("index.html", data=data)

# 一、定義過濾器
def list(li):
    # 1,3,5
    return li[::2]
# 二、註冊過濾器
# to_list是模板中使用的名字
app.add_template_filter(list, "to_list")

  二、使用裝飾器方式

@app.template_filter("to_list")
def list(li):
    # 1,3,5
    return li[::2]

使用:{{data | to_list}}

3、Flask-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 驗證輸入值不在可選列表中

 

pip install flask-wtf
from flask import Flask, redirect, request, url_for, render_template, session
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, SubmitField
from wtforms.validators import DataRequired, EqualTo

# 建立flask應用對象
# __name__ 表明當前模塊名稱
# flask以當前目錄爲總目錄,static目錄爲靜態目錄,templates爲模版目錄
app = Flask(__name__)

app.config["SECRET_KEY"] = "yang"

# 定義表單模型類
class RegisterForm(FlaskForm):
    # DataRequired 設置數據必填
    username = StringField(label=u"用戶名:", validators=[DataRequired(u"請輸入用戶名")])
    password = PasswordField(label=u"密碼", validators=[DataRequired("請輸入密碼")])
    password2 = PasswordField(label="確認密碼", validators=[DataRequired("請輸入祕密"), EqualTo("password", "兩次密碼不一致")])
    submit = SubmitField(label=u"註冊")

@app.route("/")
def index():
    user_info = session.get("user_info")
    return str(user_info)

@app.route("/register", methods=["POST", "GET"])
def register():
    # 若是是post,會把前端返回的數據放到form中
    form = RegisterForm()
    # 驗證表單數據是否合格
    if form.validate_on_submit():
        # 驗證合格, 提取數據
        username = form.username.data
        password = form.password.data
        print("username: %s, password=%s" % (username, password))
        session["user_info"] = {"username": username, "password": password}
        return redirect(url_for("index"))

    return render_template("register.html", form = form)


if __name__ == '__main__':
    # 啓動應用程序
    app.run(port=8083,debug=True)
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="" method="post">
    {{form.csrf_token}}
    {{form.username.label}}
    <p>{{form.username}}</p>
    {% for msg in form.username.errors %}
        <p>{{msg}}</p>
    {% endfor %}

    {{form.password.label}}
    <p>{{form.password}}</p>
    {% for msg in form.password.errors %}
        <p>{{msg}}</p>
    {% endfor %}

    {{form.password2.label}}
    <p>{{form.password2}}</p>
    {% for msg in form.password2.errors %}
        <p>{{msg}}</p>
    {% endfor %}

    {{form.submit}}

</form>
</body>
</html>

 4、宏

將重複的代碼定義成宏。

一、不帶參數定義宏

{% macro input() %}
  <input type="text"
         name="username"
         value=""
         size="30"/>
{% endmacro %}

{{ input() }}

二、定義帶參數的宏

{% macro input(name,value='',type='text',size=20) %}
    <input type="{{ type }}"
           name="{{ name }}"
           value="{{ value }}"
           size="{{ size }}"/>
{% endmacro %}

{{ input(value='name',type='password',size=40)}}

三、把宏單獨抽取出來,封裝成html文件,其它模板中導入使用

文件名能夠自定義macro.html

{% macro function() %}
    <input type="text" name="username" placeholde="Username">
    <input type="password" name="password" placeholde="Password">
    <input type="submit">
{% endmacro %}

在其它模板文件中先導入,再調用

{% import 'macro.html' as func %}
{% func.function() %}

5、模版的繼承與包含

extends 與 include

相關文章
相關標籤/搜索