重定向操作两种方式
return redirect(“new addr”)
return redirect(url_for(endpoint_name)) 根据端点名进行反向解析
通过端点名进行反向解析跳转,这种方法更加灵活,因为url随时会变更,但是端点名一般不会发生变化
重定向的参数传递
当进行页面跳转,如果需要将参数传入到跳转的目标页面
#url_for(‘addr’,key=”value”)  这样跳转到addr目标地址后会携带key对应参数
# 为路径?key= 的方式,是get请求的传参模式
return redirect(url_for("addr",key=value))
生成静态文件
# 生成静态文件url_for("static",filename=“stytle.css”)# static参数指代的是初始参数中的static_forlder 指代静态文件的本地存放路径url_for()
错误响应
一般来说,视图中出现逻辑错误,页面访问的时候会返回500错误,不够友好。
由此引出全局错误处理机制
@app.errorhandler(401)def server_error(error): # 形参为errorhandler函数中参数传入的值# return "哎呀。报错了"return render_template("errror_html.html")# 其中401是flask中已经内置好的异常类型
自定义错误响应
# 当需要一些定制化的异常响应的时候,进行自定义错误响应,具体步骤# 自定义一个异常类继承异常基类class UserError(Exception):pass# 然后进行异常处理注册,最后直接在需要的地方抛出异常即可@app.errorhandler(UserError) # 装饰器方式def user_error(error): # 形参为errorhandler函数中参数传入的值 在这里则为usererror类# return "哎呀。报错了"return render_template("errror_html.html",error=error),401# 返回值即是需要返回到前端页面的信息,是一个response对象# 集中注册方式app.register_error_handler(500,server_error)# 更优雅的控制方式abort(错误代码 或者 response对象) 使用这个方法会直接弹出flask官方预处理的错误页面
内置过滤器
可以访问的类似全局变量与函数
session ,显示用户名requestg 类似于全局的一个变量 每次请求内通用,不同请求之间不通用configurl_for()上面这几个变量和函数可以直接用于模板渲染
管道命令过滤器
字符串
{{ name | default('name',true) }} True 判断name传过来是否为空,不加true,只要name没有定义,都会按照默认值显示,加true会去检查是否为空空为None{{"hello" | capittalize}} 单词首字母大写{{"hello" | lower}} 单词全部小写{{ 'hello' | reverse}} 字符串反转 返回 olleh{{ ' hello' | trim}} 去除字符串前后的空白字符{{ '%s is % d' | formate("Number",2) }} 格式格式化输出{{ [1,2,3,4,5] | sum}} 列表求和{{ [1,2,3,4,5] | sort }} 列表排序,默认升序关闭html的自动转移{{ html代码片段 | safe}} 效果为直接输出html代码的字符串{% autoescape false %}{{ html代码片段 | escape}} 效果为及时autoescape关了也可以转移,可以缩写为 e{% endautoescape %}
数字
{1.22334 | round}} 四舍五入取整{{ 12.888 | round(2,"floor")}} 向下截取到小数点后两位,返回12.88{{ -12 | abs }} 绝对值
列表
{{ list | first}} 取第一个元素{{ list | last}} 取最后一个元素{{list | length}} 长度,写可写为count{{ list | sum }} 求和{{ list | sort }} 默认升序{{ [1,2,3,4,5] | join('|') }} 合并为字符串 返回为 "1 | 2 | 3 | 4 | 5 "{{ ['aa','bb','cc','dd','ee'] | upper }} 列表所有元素大写
tojson
{{ 吧字典类型的字符串转换成json | tojson | safe }}
自定义过滤器
# 注册一个过滤器@app.template_filter('formatter') # 参数为过滤器名字,如果没有命名,则使用过滤器方法名作为命名def formatter(timestamp):return datetime.fromtimestamp(timestamp)# 集中注册方式app.add_template_filter(p1,p2) param1 过滤器函数名,param2 过滤器名字(str)# 测试 name is defined 测试数据是否被定义# 主要是用来调试判断
测试
除了过滤器,所谓的测试 也是可用的,测试可以用于对照普通表达式测试一个变量要测试一个变量或表达式,要在变量后加上一个 is 以及测试的名称,
例如,要得出一个值是否定义过, 可以用 name is defined 这会根据 name是否定义返回true或者false测试也可以接受参数,如果测试只接受一个参数,可以省去括号来分组它们
例子{% if loop.index is divisibleby 3 %}{% if loop.index is divisibleby (3) %}
内置测试器
检查变量是否被定义
{% if name is defined %}<p> name is {{name }}</p>{% endif %}
检查是否所有字符都是大写
{% if name is upper %}{{name are all upper case}}{% endif %}}
检查是否所有字符都是空
{% if name is none %}{{name }}{% endif %}}
检查是否为字符串,也可使用number检查是否为数值
{% if name is string %}{{name }}{% endif %}}
检查数值是否为偶数,也可用odd检查是否为奇数
{% if name is even %}{{name }}{% endif %}}
检查变量是否可迭代,也可以使用sequence检查是否为序列
{% if list is iterable %}{{name }}{% endif %}}
检查变量是否为字典,
{% if list is mapping %}{{name }}{% endif %}}
自定义测试
def has_number(str):return re.match(r'.*\d+',str)# app.add_template_test(has_number,'contain_number') 集中注册方式# 前端页面使用{% if name is contain_number %}{{name }} contains number{% endif %}# 判断是否为json@app.template_test() # 注解模式def is_json(data):try:json.loads(data)except TypeError:return False
带参数的测试器
# 实例@app.template_test('end_with')def end_with(str,suffix):return str.lower().endswith(suffix.lower())# # 带参数的测试器{% if name is end_with('测试文本') %}{{name}} ends with ''{% endif %}
