【问题标题】:python / flask: How to run a function whenever another is calledpython / flask:如何在调用另一个函数时运行一个函数
【发布时间】:2021-03-25 01:15:26
【问题描述】:

我有一个名为when_login()的函数

每当调用Flask-Login 模块中的login_user() 函数时,我都需要运行它

  • 序列:
    1. 用户提供凭据
    2. 凭据通过身份验证步骤

    身份验证是通过大量方法进行的 3.一旦用户被认证调用login_user() 4. [需要步骤]:无论何时调用login_user(),然后在重定向前登录的用户上调用一个名为when_login()的函数

我无法编辑/重写 login_user() 以调用 when_login() 和程序功能

重写函数也可能导致应用变慢

一般来说:有没有一种方法可以在 python 中绑定函数而无需编辑将要调用的第一个函数?

这是一个烧瓶应用程序,但我对 python 范围内的答案很满意。

【问题讨论】:

  • 明确一点,当您总是调用 login_user 时,您总是希望 when_login 先运行?
  • login_user() 先运行,然后自动 when_login() 运行

标签: python python-3.x function flask binding


【解决方案1】:

我不确定这是否是你想要的,也许有一个 Flask 特定的方法可以做到这一点,但这是我尝试过的

from flask_login import login_user as login_user__

def run_first(fun):
    def inner(*args):
        fun(*args)
        when_login() # add arguments you want for making this call
    return inner

def when_login(*args):
    print('processing something with args in when_login')

@run_first
def login_user(*args):
    print('login_user is running first')
    return login_user__(*args)

login_user() # call this however you normally use

输出:

login_user is running first
processing something with args in when_login

调用login_user 使其首先运行,然后是when_login,您可以在打印语句中注意到这一点。

这不需要您更改代码,在开始烧瓶过程之前将其添加到顶层。

【讨论】:

  • @Abd-ElazizSharaf 如果您没有找到更好的解决方案,您可以将其标记为已接受
  • 这真的很有帮助,只是我在等待,看看是否有其他想法有时您会找到更多无法解决的问题的答案
  • 是的,我应该提到,“以后有更好的解决方案”,请接受最适合你的方法
  • 这个案例的装饰器是我认为最快的选择!但是如果您需要对烧瓶登录进行更多控制,您可以覆盖它,但这意味着您需要做更多的工作。我建议改用装饰器!
猜你喜欢
  • 2020-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多