Flask 框架 jinja2 过滤器 & 类视图

在这里插入图片描述

jinja2 模板过滤器

在此前 Flask 与 Html 代码结合中,数据的渲染过程就是简单的传参,jinja2 过滤器的作用是将参数的传递不一般化,也就是说将数据渲染之前先做某些处理

Html 文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>jinja2 过滤器</h1>
<!--    直接渲染 name 数据  -->
    <p>{{name}}</p>
<!--    将 name 数据的字符串 su 替换为 ke  -->
    <p>{{name|replace('su', 'ke') }}</p>
<!--    将 age 数据取绝对值 并显示出来 -->
    <p>{{age|abs}}</p>
<!--    如果 home 取不到数据 那么默认显示为 这家伙很懒,什么都没有留下  -->
    <p>{{home|default('这家伙很懒,什么都没有留下')}}</p>
<!--    分析数据 home 并分出由几个词组成 并显示出来-->
    <p>{{home|wordcount}}</p>
<!--    将 html 标签以原意显示出来  -->
    <p>{{p|safe}}</p>
<!--    将数据列表 book 第一项显示出来-->
    <p>{{book|first}}</p>
<!--    将数据列表 book 最后一项显示出来-->
    <p>{{book|last}}</p>
<!--    将数据 book 的长度显示出来-->
    <p>{{book|length}}</p>
</body>
</html>

Python 文件

from flask import Flask, render_template
# Flask 模块的作用是创建实例 render_template 的作用是引入外部 Html 文件

web = Flask(__name__)  # 创建 Flask 实例


@web.route('/')  # 关联视图函数
def index():  # 视图函数
    context = {  # 字典文本
        'name': 'xiao su',  # 字符串
        'age': -19,  # 整型
        'home': '湖北 荆州',  # 字符串
        'p': "<p>我是 p 标签</p>",  # 字符串
        'book': ['python', 'java', 'php'],  # 列表
    }
    return render_template('day_3.html', **context)  # 连接 Html 文件


if __name__ == '__main__':
    web.run(debug=True)

渲染效果

在这里插入图片描述

自定义过滤器

Html 文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <p>{{name|my_filter}}</p>
</body>
</html>

Python 文件

from flask import Flask, render_template
# Flask 模块的作用是创建实例 render_template 的作用是引入外部 Html 文件

web = Flask(__name__)  # 创建 Flask 实例


@web.route("/")
def hello_flask():
    return render_template('day_3.html', name="hello su")


# 自定义过滤器
@web.template_filter('my_filter')
def my_filter(value):
    return value.replace('su', 'ke')


if __name__ == '__main__':
    web.run(debug=True)

关联视图函数的方法

语法:对象.add_url_rule('url', view_func=视图函数名, endpoint='别名')

from flask import Flask, url_for


web = Flask(__name__)


# 注意此处并没有关联视图函数
# @web.route('/web/')
def hello_flask():
    print(url_for('hello'))
    return 'hello su'


web.add_url_rule('/web/', view_func=hello_flask, endpoint='hello')


if __name__ == '__main__':
    web.run(debug=True)

执行的结果是,浏览器中显示 hello su,Pycharm 中显示 /web/

标准视图类

from flask import Flask, url_for, views, jsonify


web = Flask(__name__)


# 视图类继承于类 views.View
class ListView(views.View):
    # 此方法需要重写 不然就会报错
    def dispatch_request(self):
        return '类视图'


class JsonView(views.View):

    def get_response(self):
        raise NotImplementedError()

    def dispatch_request(self):
        response = self.get_response()
        return jsonify(response)


class ListJsonView(JsonView):

    def get_response(self):
        return {'name': 'cheney'}


# 给视图类增添 url 属性
web.add_url_rule('/list/', view_func=ListView.as_view('list'))
web.add_url_rule('/json/', view_func=JsonView.as_view('json'))
web.add_url_rule('/jsonlist/', view_func=ListJsonView.as_view('jsonlist'))


if __name__ == '__main__':
    web.run(debug=True, port=8000)

渲染效果

在这里插入图片描述

标准视图类的使用

Python 文件

from flask import Flask, views, render_template


web = Flask(__name__)


class BaseView(views.View):  # 基类 继承于 views.View
    def __init__(self):  # 定义一个字典文本 username su
        self.context = {
            'username': 'su'
        }


class FirstView(BaseView):  # 创建一个类 使之继承于基类

    def dispatch_request(self):

        return render_template('first.html', **self.context)


class SecondView(BaseView):  # 创建一个类 使之继承于基类

    def dispatch_request(self):

        return render_template('second.html', **self.context)


# 给视图类增添 url 属性
web.add_url_rule('/first/', view_func=FirstView.as_view('first'))
web.add_url_rule('/second/', view_func=SecondView.as_view('second'))


if __name__ == '__main__':
    web.run(debug=True, port=8000)

Html 文件 first.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>登录页面</h1>
    <p>{{username}}</p>
</body>
</html>

Html 文件 second.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>注册页面</h1>
    <p>{{username}}</p>
</body>
</html>

渲染效果 由类视图 FirstView 渲染

在这里插入图片描述
渲染效果 由类视图 SecondView 渲染

在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是我来晚了!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值