flask不使用flask-login插件

由于flask版本升级问题,flask-manager里面的Command命令高版本不支持,低版本的兼容flask-sqlalchemy启动也会报错,第三方插件有很多问题,所以痛定思痛决定放弃使用这个,使用flask自带语法自己写一个

类似于django继承django.contrib.auth.User一样

request.user全局一样,可以获取到用户信息

python 复制代码
#钩子函数(hook),意思是在正常执行过程中插入一个东西进来,然后先执行我这个东西,再执行其他的
#钩子函数的装饰器 before_request
@app.before_request#before_request一个装饰器
def my_before_request():
    user_id = session.get("user_id")
    if user_id:
        user = UserModel.query.get(user_id)#登录之后才会得到这个user_id,否则为none
        setattr(g, "user", user)#把user绑定到一个全局对象g上去,全局变量g设置一个属性"user"值为user
    else:#如果没有这个user,也设置一下,防报错
        setattr(g, "user", None)

@app.context_processor#上下文处理器,在每个页面都能显示当前用户
def my_context_processor():
    return {"user": g.user}#返回的数据在所有的模板当中都可以使用

dectorators.py

python 复制代码
from functools import wraps
from flask import g, redirect, url_for

def login_required(func):
    @wraps(func) # 保留func的信息
    def inner(*args, **kwargs):#函数func可能会传入参数,所以给inner添加(*args, **kwargs),代表可能要传入的参数的所有可能,
        if g.user:#如果有值(登录了,有user)就正常执行相应的路由函数
            return func(*args, **kwargs)
        else:#如果没有值就跳转到当前页面
            return redirect(url_for("auth.login"))
    return inner

使用全局变量和上线文方式读读取用户信息

python 复制代码
 context_processor(上下文处理器钩子函数)
上下文处理器应该返回一个字典,字典中的key会被模板中当成变量来渲染
被这个装饰器修饰的钩子函数,必须要返回一个字典,即使为空也要返回。
  
@app.context_processor  
def my_context_processor():  
    return {'username':'laowang'}  
源代码

@setupmethod
  def context_processor(
      self, f: TemplateContextProcessorCallable
  ) -> TemplateContextProcessorCallable:
      """Registers a template context processor function."""
      self.template_context_processors[None].append(f)
      return f
释义:
装饰器把方法my_context_processor添加到self.template_context_processors = {None: [_default_template_ctx_processor]}

这些方法会在每次渲染模板(render_template)时执行,最终效果就是可以在模板中可以访问它所定义变量
如果局部变量应用方法只蓝图使用或全局使用
蓝图也有类似方法

bp.context_processor # 仅对当前蓝图的模板渲染生效
bp.app_context_processor # 对所有的模板生效,等效于@app.context_processor
@bp.app_context_processor  
def global_datas():  
    return dict()  
相关推荐
鹿衔`19 小时前
Flask入门
后端·python·flask
有趣的野鸭19 小时前
JAVA课程十一次实验课程主要知识点示例
java·前端·数据库
兰若姐姐20 小时前
cisp-pte之SQL注入题之vulnerabilities/fu1.php?id=1
数据库·sql
一晌小贪欢1 天前
【Python数据分析】数据分析与可视化
开发语言·python·数据分析·数据可视化·数据清洗
数据皮皮侠1 天前
区县政府税务数据分析能力建设DID(2007-2025)
大数据·数据库·人工智能·信息可视化·微信开放平台
请叫我阿杰1 天前
Ubuntu系统安装.NET SDK 7.0
数据库·ubuntu·.net
q***82911 天前
如何使用C#与SQL Server数据库进行交互
数据库·c#·交互
dreams_dream1 天前
Flask
后端·python·flask
盖世英雄酱581361 天前
commit 成功为什么数据只更新了部分?
java·数据库·后端
mywpython1 天前
用Python和Websockets库构建一个高性能、低延迟的实时消息推送服务
python·websocket