Flask(三)

一、错误页面定制

manager.py

@app.errorhandler(404)
def page_not_found(err):
    return render_template('error.html',errorinfo=err,title='404 page_not_found',info='您访问的页面被外星人抓走了~')

@app.errorhandler(500)
def server_error(err):
    return render_template('error.html',errorinfo=err,title='500 server_error',info='您的访问太热情了 请稍后在访问~')

error.html

{% extends 'common/base.html' %}
{% block title %}
{{ title }}
{% endblock %}
{% block pagecontent %}
    <div class="alert alert-danger" role="alert">{{ info }}</div>
{% endblock %}

二、加载静态资源

静态资源 就是 css、js、img

目录结构

project/
	templates/
    	common/
    static/
    	css/
        js/
        img/
        upload/
     manage.py

实例:

{% block metas %}
    {{ super() }}
    <link rel="icon" href="{{ url_for('static',filename='img/1.jpeg',_external=True) }}">
{% endblock %}

格式

{{ url_for('static',filename='路径/文件名称.css/js/jpg') }}

三、视图传递多个参数

(1) 关键字参数
@app.route('/')
def index():
    return render_templates('index.html',title='首页',con='内容')
(2) 使用字典
@app.route('/')
def index():
    return render_templates('index.html',con={'title':'首页','con':'内容'})

模板中使用

{{ con.title }}
{{ con.con }}
(3) locals()
@app.route('/')
def index():
    title = '首页'
    con = '内容'
    print(locals())
    return render_template('index.html',**locals())

模板中使用

{{ title }}
{{ con }}
(4) 全局变量g

导入

from flask import g

@app.route('/')
def index():
    g.title = '首页'
    g.con = '内容'
    return render_template('index.html')

模板中使用

    {{ g.title }}
    {{ g.con }}

四、过滤器

过滤器就是python中的函数 在值输出之前对值进行改变 过滤器使用管道符 | 进行分割 值|过滤器名称

  1. abs 绝对值

  2. default 默认值

    默认是只有变量不存在执行默认值

    {{ bool|default('默认值') }}
    

    更改参数boolean为True bool的False也执行默认值

    {{ bool|default('默认值',boolean=True) }}
    
  3. first 取出第一个值

  4. last取出最后一个值

  5. format 格式化

    {{ '我叫%s 我今年%d岁了 我的存款为%.2f'|format('张三',20,2000) }}
    
  6. length 长度

  7. join 拼接成字符串

    {{ ['a','b','c']|join('-') }}
    
  8. safe 对html代码不进行转义

  9. int 转换成整形

  10. string 转换为字符串

  11. float 浮点形

  12. list 列表

  13. upper 大写

  14. lower 小写

  15. replace 替换

  16. striptags 去除标签

自定义模板过滤器

(1) 第一种方法
#内容超出10个字显示 ...
#超出长度范围显示...
def showpoint(val,myLength=10):
    length = len(val)
    if length>myLength:
        val = val[0:myLength]+'...'
    return val

app.add_template_filter(showpoint)
(2) 第二种方法
#内容超出10个字显示 ...
#超出长度范围显示...
@app.template_filter()
def showpoint(val,myLength=10):
    length = len(val)
    if length>myLength:
        val = val[0:myLength]+'...'
    return val

表单

一、原生表单

蓝本文件代码

#原生表单
@pform.route('/pform/',methods=['GET','POST'])
def pForm():
    if request.method == 'POST':
        print(request.form)
    return render_template('form.html')

form.html

{% extends 'common/base.html' %}
{% block pagecontent %}
<h2>form表单</h2>
<form action="" method="post">
    <p>用户名: <input type="text" name="username"></p>
    <p>密码: <input type="password" name="userpass"></p>
    <p><input type="submit" value="submit"></p>
</form>
{% endblock %}

二、flask-wtf扩展表

负责表单校验csrf验证等功能

安装:

pip3 install flask-wtf

注意:

如果想要使用则 需要存在secret_key的配置 否则报错

常见字段和验证器
(1) 字段类型
字段类型字段说明
StringField普通文本字段
SubmitField提交按钮
PasswordField密码字段
HiddenField隐藏域
TextAreaField多行文本域
DateField日期
DateTimeField日期和时间
IntegerField整数
FloatField浮点数
BooleanField复选框
RadioField单选
SelectField下拉
FileField文件上传
(2) 验证器
验证器说明
DataRequired必填
Email邮箱
URLurl地址
IPAddressIP地址
Length值的长度 有max和min俩个参数
NumberRange值得范围 有max和min俩个参数
EqualTo验证俩个输入框的值是否一致
Regexp正则匹配
(1) 注册表单类
from flask import Flask,render_template,request
from flask_bootstrap import Bootstrap
from flask_script import Manager

from flask_wtf import FlaskForm #导入表单基类
#导入字段
from wtforms import StringField,PasswordField,SubmitField
#导入验证器
from wtforms.validators import DataRequired,Length,EqualTo

app = Flask(__name__)
app.config['SECRET_KEY'] = 'a2h3jk9asd'
Bootstrap(app)
manager = Manager(app)

#注册表单类
class Register(FlaskForm):
    #username 为input的name属性的值 用户名为label标签的内容 validators里面添加多个验证器
    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=[EqualTo('userpass',message='俩次输入的密码的值不一致')])
    submit = SubmitField('注册')

#注册
@app.route('/register/',methods=['GET','POST'])
def register():
    form = Register() #实例化表单注册类
    # if request.method == 'POST':
    #如果表单数据验证通过并且有csrf验证通过 则为真
    if form.validate_on_submit():
        print(request.form)
        return '表单数据提交过来了'
    return render_template('register.html',form=form)

if __name__ == '__main__':
    manager.run()

register.html

{% extends 'common/base.html' %}
{% block pagecontent %}
<h2>flask_wtf_form表单</h2>
    <form action="" method="post">
        {{ form.username.label() }}
        {{ form.username() }}
{#        {{ form.username.errors }}#}
        {% for err in form.username.errors %}
            <span style="color: red;">{{ err }}</span>
        {% endfor %}
        <br>
        {{ form.userpass.label() }}
        {{ form.userpass() }}
{#        {{ form.userpass.errors }}#}
        {% 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.submit() }}
    </form>
{% endblock %}

获取表单值的俩种方法

  1. request.form
  2. form.属性.data
(2) 宏来实现
{% macro field(form) %}
    <tr>
        <td>{{ form.label() }}</td>
        <td>{{ form() }}</td>
        {% for err in form.errors %}
            <td><span style="color: red;">{{ err }}</span></td>
        {% endfor %}
    </tr>
{% endmacro %}
    
    <form action="" method="post">
        {{ form.csrf_token }}
        <table>
            {{ field(form.username) }}
            {{ field(form.userpass) }}
            {{ field(form.confirm) }}
            <tr>
                <td>{{ form.submit() }}</td>
            </tr>
        </table>
    </form>
(3) 使用bootstrap来快速渲染

模板页面

{% from 'bootstrap/wtf.html' import quick_form %}
{{ quick_form(form) }}
(4) 自定义表单验证器

导入:

from wtforms.validators import ValidationError
#自定义表单验证器
    #validate_ 固定格式拼接 验证的属性名  参数field为当前验证数据的标签
    def validate_username(self,field):
        # print(field)
        # print(field.data)
        # print(self.username.data)
        #用户名已存在
        if field.data == 'zhangsan':
            raise ValidationError('该用户已存在')
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值