Flask 框架 视图装饰器 & 蓝图

在这里插入图片描述

视图函数增添装饰器

from flask import Flask, views, render_template, request
# 各模板的作用 Flask 用于创建对象, views 充当父类, render_template 用于连接 html 文件, request 用于获取 url 信息

web = Flask(__name__)  # 创建实例化对象


# 登录之后才能访问的装饰器
def login_required(func):
    def wrapper(*args, **kwargs):
        # 通过网址上的 url 获取到参数 username
        username = request.args.get('username')
        if username:
            # 如果检测到 username 的存在, 那么返回原函数
            return func(*args, **kwargs)
        else:
            # 如果监测不到 username 的存在, 那么渲染文本
            return '请先登录'
    return wrapper


@web.route('/profile/')
@login_required  # 此处装饰器的作用是将 profile 函数当作 func 函数传入装饰器中
def profile():
    # 通过网址上的 url 获取到参数 username, 并且赋值给 name
    name = request.args.get('username')
    # 在浏览器上渲染文本
    return name + '的个人中心'


if __name__ == '__main__':
    # 运行时指定 debug 模式
    web.run(debug=True)

获取的 url 中含有参数 username 的情况,返回原函数

在这里插入图片描述
获取的 url 中不含有参数 username 的情况,直接在装饰器内渲染文本

在这里插入图片描述

视图类增添装饰器

from flask import Flask, views, render_template, request
# 各模板的作用 Flask 用于创建对象, views 充当父类, render_template 用于连接 html 文件, request 用于获取 url 信息

web = Flask(__name__)  # 创建实例化对象


# 登录之后才能访问的装饰器
def login_required(func):
    def wrapper(*args, **kwargs):
        # 通过网址上的 url 获取到参数 username
        username = request.args.get('username')
        if username:
            # 如果检测到 username 的存在, 那么返回原函数
            return func(*args, **kwargs)
        else:
            # 如果监测不到 username 的存在, 那么渲染文本
            return '请先登录'
    return wrapper


class ProfileView(views.View):  # 继承于 views.View 类, 需要重写 dispatch_request 方法
    # 语法:decorators = [装饰器的名字]
    decorators = [login_required]

    def __init__(self):
        self.name = request.args.get('username')

    def dispatch_request(self):
        return self.name + '的个人中心类'


# 给视图类增添 url 属性
web.add_url_rule('/setting/', view_func=ProfileView.as_view('setting'))


if __name__ == '__main__':
    # 运行时指定 debug 模式
    web.run(debug=True)

获取的 url 中含有参数 username 的情况,返回原函数

在这里插入图片描述
获取的 url 中不含有参数 username 的情况,直接在装饰器内渲染文本

在这里插入图片描述

视图类 Get 方法和 Post 方法

Python 文件

from flask import Flask, views, render_template, request
# 各模板的作用 Flask 用于创建对象, views 充当父类, render_template 用于连接 html 文件, request 用于获取 url 信息

web = Flask(__name__)  # 创建实例化对象


# get 和 post 方法
class LoginView(views.MethodView):  # 继承于类 views.MethodView 不需要重写 dispatch_request 方法

    def get(self, error=None):
        return render_template('login.html', error=error)

    def post(self):
        # post 方法获取 url 中参数的方法 request.form.get
        name = request.form.get('name')
        password = request.form.get('password')
        if name == 'XiaoSu' and password == '521':
            return 'Welcome XiaoSu'
        else:
            # return render_template('login.html', error='账号密码错误,请重新输入')
            return self.get('账号或密码错误, 请重新输入')


# 给视图类增添 url 属性
web.add_url_rule('/login/', view_func=LoginView.as_view('login'))


if __name__ == '__main__':
    # 运行时指定 debug 模式
    web.run(debug=True)

Html 文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>这是登录页面</h1>
    {%if error%}
    <p style='color:red'>{{err}}</p>
    {%endif%}
</body>
</html>

网址 url 为 /login/ 时访问到了 login.html 文件中的 h1 标签

在这里插入图片描述

网址 url 为 /login/?name=xiaosu&password=521 时渲染文本

在这里插入图片描述

网址 url 为 /login/?name=xiaosu&password=520 时访问到了 login.html 文件中的 h1 标签和用 css 修饰的 p 标签

在这里插入图片描述

一种专门书写视图函数的模块(蓝图)

实现的具体功能是,在 python 副文件内部书写了视图函数,在主文件内部只需要通过某种关联即可以调用副文件内部的视图函数,将视图函数和主文件分开,使代码更加可视化

Python 主文件

from flask import Flask, url_for
# 从 flask 框架中导入 Flask 模块和 url_for 模块
from blueprints.book import book_bp
# 从 blueprints.book 中导入实例化蓝图对象 book_bp


web = Flask(__name__)  # 实例化 Flask 对象
web.register_blueprint(book_bp)  # 绑定蓝图对象


@web.route('/')  # 关联视图函数
def index():  # 视图函数
    print(url_for('book.book_detail', aid=1))  # 输出 book.py 下的 book_detail 函数的 url
    return '首页'


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

Python 蓝图文件

# 视图函数模板部分
from flask import Blueprint, render_template
# 模块:Blueprint  实例化蓝图对象, render_template 连接 html 文件

book_bp = Blueprint('book', __name__, url_prefix='', template_folder='logic')
# 实例化对象 book_bp, 参数 book 为蓝图文件名字, 参数 template_folder 修改 html 原始目录


@book_bp.route('/book/')  # 蓝图绑定视图函数
def book():  # 视图函数
    return '图书首页'


@book_bp.route('/detail/<aid>')  # 蓝图绑定视图函数
def book_detail(aid):  # 视图函数
    return render_template('book.html')

Html 文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>蓝图图书首页</h1>
</body>
</html>

当 url 为 / 时,调用的是主文件内部书写的视图函数

在这里插入图片描述
当 url 为 /book/ 或 /detail/2 时,调用的是副文件内部书写的视图函数

在这里插入图片描述
在这里插入图片描述
参数的介绍以及 CSS 文件的引入

pycharm 文件层级关系

在这里插入图片描述

蓝图实例化对象时,参数 url_prefix 传递代表给蓝图中的所有视图函数添加 url 前缀,我们给其增添前缀 /a/

book_bp = Blueprint('book', __name__, url_prefix='/a/', template_folder='logic')

可以发现,原来可以打开的文件打不开了,原因也就很显然了,就是 url 指定不对,我们添加 url 前缀 /a/

在这里插入图片描述
添加前缀后,我们刷新浏览器

在这里插入图片描述
我们此处说的 CSS 文件的引入指的是在 html 文件内部引入 CSS 文件,与前端不同的是,我们使用参数 url_for 来引入

Html 文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="{{url_for('static', filename='book.css')}}">
</head>
<body>
    <h1>蓝图图书首页</h1>
</body>
</html>

CSS 文件

body{
    background:pink;
}

渲染效果

在这里插入图片描述

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

是我来晚了!

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

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

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

打赏作者

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

抵扣说明:

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

余额充值