中午睡了一觉,感觉精力恢复了一下,下午就学完这第八章吧
学习了蓝本之后,书中又引入了一个概念,叫做工厂函数
使用蓝本还有一个好处,就是可以使用工厂函数来创建程序实例
Q :什么是工厂函数?
Flask中的工厂函数是一种用于创建应用程序实例的设计模式,它允许你根据需要配置和返回多个应用实例。这种方式特别适合需要不同配置或环境的情况。按照惯例,被命名为create_app()或者make_app()
工厂函数接收配置名作为参数,返回创建好的程序实例。
这允许我们在程序的不同位置传入不同的配置来创建程序实例。
比如使用工厂函数后,我们可以在测试脚本中使用测试配置来调用工厂函数,创建一个单独用于测试的程序实例
工厂函数一般在程序包的构造文件中创建
初始化扩展
把扩展类实例化放到extensions.py中
当需要在程序中使用的时候在工厂函数中调用
current_app
使用工厂函数创建实例,当我们想要获取配置值时,会使用current_app.config
这块目前理解还是比较模糊,不过还是先记录下来,之后的内容就是一些数据表和博客内容相关
之后的重点我想应该是flask-login
下载了包以后,现在extensions模块中实例化扩展提供的LoginManager类,创建一个login_manager对象
然后在程序包的工厂函数中对logn对象进行初始化扩展
login_manager.init_app(app)
之后让用户类继承Flask-Login提供的UserMixinl类
登出和登出用户时使用login_user()或者logout_user()函数
在这两个函数背后,Flask-Login将用户的id值存储到浏览器的cookie中(名为user_id)
获取当前用户
使用current_user对象,调用时会返回与当前用户对应的用户模型类对象
因为session中只会存储登录用户的id,所以为了让他返回对应的用户对象,我们需要设置一个用户加载函数
这个函数需要使用login_manager.user_loader装饰器,它接收用户id为参数,返回对应的用户对象
@login_manager.user_loader
def load_user(user_id):
from bluelog.models import Admin
user=Admin.query.get(int(user_id))
return user
登入用户
先使用if current_user.is_authenticated:
来判断是否是登录状态
非登录状态接收信息后再用
admin=Admin.query.first()
login_user(admin,remember)
登出用户直接logout_user()
视图保护
有些视图需要用户登录才能访问,可以使用login_required
@admin_bp.route('..')
@login_required
当为视图函数添加多个装饰器时,route()装饰器应该放在最外层
还需要在extends中为login_view属性设置登录视图的端点值,方便未登录时重定向