在另一个文件中调用python函数

在另一个文件中调用python函数,python,python-2.7,python-3.x,Python,Python 2.7,Python 3.x,我想问: 下面代码中的@login\u required的目的是什么 (是,“@login_required”在另一个.py文件中定义) 这段代码实际上是如何工作的?这是否意味着每当使用classTaskCreateHandler时,就会调用所需的函数login\u 如果我们在def post(self)中写入@login\u required,该怎么办 谢谢 class TaskCreateHandler(BaseHandler): @login_required def post(self

我想问:


  • 下面代码中的
    @login\u required
    的目的是什么

    (是,“@login_required”在另一个.py文件中定义)

  • 这段代码实际上是如何工作的?这是否意味着每当使用class
    TaskCreateHandler
    时,就会调用所需的函数
    login\u


  • 如果我们在def post(self)中写入
    @login\u required
    ,该怎么办

  • 谢谢

    class TaskCreateHandler(BaseHandler):
    @login_required
    def post(self):
    

    我认为这是一个在调用方法之前验证用户是否登录的装饰程序。欲了解更多信息,请查看nice博客文章


    HTH

    我想您正在使用Flask(带Flask登录)或类似的东西

    1) @login_required的目的是确保只有具有有效会话的用户才能访问资源。如果您没有有效的会话,flask登录将返回401(需要授权),您无法访问资源。看

    2) 正如Mohamed所说,需要登录的是一个装饰师。它将封装您的函数(post),这意味着每当有人调用TaskCreateHandler.post时,首先调用所需的登录名,然后执行一些操作(如检查有效会话),然后可能调用您的函数。一旦函数返回,控件将被处理回@login required,这可能只是从post返回结果。看


    3) 不会起作用,因为没有什么可装饰的…

    您这里有一个装饰师。语法完全等同于:

    def post: #code
    post = login_required(post)
    
    Python装饰器只是一个常规函数。它接受另一个函数作为参数,并使用它。。。什么都可以。您可以定义:

    def add12(func):返回1+2

    并将其用作装饰。然后,如果您通过在post()上添加@add12来装饰post,那么对post()的任何调用都将返回3,无论您向它传递了什么。如果不清楚原因,请再次查看上面的等效语法片段


    如果你把它写在def里面,它在这里就没什么用处了。我不能百分之百确定它将如何治疗;我怀疑它会抛出一个语法错误。

    @login\u required
    只是一个“装饰器”,可能重复:谢谢。;-)若我在一个函数中写入@login_required,那个么这意味着该函数将在函数调用后检查用户是否登录。对吗?非常感谢你的详细回答,卡雷尔。你能详细说明一下“一旦你的函数返回,控件就被处理回@login required,这可能只是从post返回结果。”你是说在函数返回后,控件被处理回decorator吗?是的,这正是发生的事情。把decorator想象成一个包装器。基本上,它是一个函数,它的第一个参数是另一个函数(在您的示例中是被修饰的函数,post)。这取决于装饰师的工作。它可以运行一些代码,然后调用函数,在函数返回后,它可以以某种方式转换结果,然后返回它。或者它可能检查一些外部属性,并根据它们调用或不调用您的函数(如@login required)。或者它可能只是记录函数的开始和结束时间。。。