1. 程式人生 > >flask===表單

flask===表單

一、巨集 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') }}

注意:

  1. 巨集的呼叫只能在下方呼叫
  2. 如果函式有形參則沒有實參 則不傳第不報錯
  3. 定義巨集的引數時候 形參預設值遵循預設值的規則 幽預設值的放後面
  4. 關鍵字引數的使用和 python的函式一樣 如果第一個引數使用關鍵字 後面都要使用關鍵字 如果第一個沒有使用關鍵字 後面關鍵字可有可無

二、過濾器

概述

就是python中的函式 在值輸出之前 對其進行過濾在輸出

  1. abs 絕對值

  2. default 預設值 預設情況下 當變數不存在則執行預設值

    {{ var|default(‘預設值’) }}

    {{ var|default(‘預設值’,boolean=True) }} 變數不存在和bool的假都執行預設值

  3. first 第一個值

  4. last 最後一個值

  5. format

    {{ “我叫%s 我今年%d歲了 我的存款是%.2f元 我的格言是%s”|format(‘學委’,28,2222,‘放蕩不雞愛學習’) }}

  6. length 長度

  7. join 拼湊成字串

  8. safe 安全的 不轉義html程式碼

  9. int 整形

  10. float 浮點形

  11. string 字串

  12. list 列表

  13. lower 小寫

  14. upper 大寫

  15. replace 替換

  16. 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 必填
Email 驗證郵箱
URL 驗證url地址
IPAddress 驗證IP地址
Length 長度限制 min 和max
NumberRange 值的範圍 min 和 max
EqualTo 驗證倆個欄位的值是否相同
Regexp 正則匹配

註冊類

manage.py

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('該使用者已存在 請重新輸入')

取出表單傳遞過來的值

  1. request.form
  2. 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;'})