一、错误页面定制
@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中的函数 在值输出之前对值进行改变 过滤器使用管道符 | 进行分割 值|过滤器名称
-
abs 绝对值
-
default 默认值
默认是只有变量不存在执行默认值
{{ bool|default('默认值') }}
更改参数boolean为True bool的False也执行默认值
{{ bool|default('默认值',boolean=True) }}
-
first 取出第一个值
-
last取出最后一个值
-
format 格式化
{{ '我叫%s 我今年%d岁了 我的存款为%.2f'|format('张三',20,2000) }}
-
length 长度
-
join 拼接成字符串
{{ ['a','b','c']|join('-') }}
-
safe 对html代码不进行转义
-
int 转换成整形
-
string 转换为字符串
-
float 浮点形
-
list 列表
-
upper 大写
-
lower 小写
-
replace 替换
-
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 | 必填 |
邮箱 | |
URL | url地址 |
IPAddress | IP地址 |
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 %}
获取表单值的俩种方法
- request.form
- 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('该用户已存在')