【问题标题】:How do python flask app.route() sections execute?python flask app.route() 部分如何执行?
【发布时间】:2017-02-28 21:45:07
【问题描述】:

我是烧瓶和 python 的新手。例如,如果您有以下代码...

@app.route('/')
def index():
 return "Hello world!"

@app.route('/accounts')
def accounts():
    return some_data

@app.route('/login')
def login():
    return render_template(login.html)

if __name__ == "__main__":
    app.run()

这些将按什么顺序执行?据我了解,如果您在网站的 /accounts 页面上,该功能将运行。如果您在 /login 页面上,该功能将运行。路由方法的参数起什么作用?其次,最后两行代码将运行多少次(app.run() 会被调用一次还是每次调用 app.route() 时)?此外,应用程序应放在网站文件结构中的哪个文件夹中?

【问题讨论】:

    标签: python-3.x web flask


    【解决方案1】:

    您是对的,当您转到网站的特定页面时,这里的每个功能都会被触发。您肯定需要做一些进一步的研究才能更好地理解,但这里有一个简单的细分。

    在 Python 中,运行的“主”文件(即您使用 python 命令运行的文件:python etc.py)将在解释之前将其文件名内部替换为“__main__”。因此,基于这些知识,我们可以说,如果您将此代码作为主文件运行该文件,则该条件语句if __name__ == "__main__" 中的代码将被执行。因此,app.run() 被执行,并且只执行一次,因为这个 if 块不在任何类型的类、函数或控制结构中,并且文件只被解释一次。

    接下来,@app.route(....) 是一种叫做装饰器的东西。这是对装饰器是什么以及如何使用它们的一个很好的介绍:https://realpython.com/blog/python/primer-on-python-decorators/。那里的第一段真的很重要。

    根据定义,装饰器是一个函数,它接受另一个函数并扩展后一个函数的行为而不显式修改它。

    我也非常喜欢关于装饰器的中级 Python 章节,我建议您查看。 http://book.pythontips.com/en/latest/decorators.html

    基本上就是你定义的这些路由函数,比如:

    def index():
      return "Hello world!"
    

    就像你告诉@app.route()装饰器在某个时候调用的函数。 @app.route() 是一个装饰器,它被定义为在执行其内部命令期间的某个时间点调用你给它的函数。它采用的输入参数是所谓的 url 规则,它基本上就像一个模式,传入请求的 url 必须匹配才能触发您为路由定义的函数。这个装饰器接口实际上是一种方便,请参见[这里][1]。换句话说,要使用要处理的函数创建路由,您还可以使用 app.add_url_rule() 函数而不是装饰器。取自 Flask 的文档:

    add_url_rule(rule, endpoint=None, view_func=None, **)

    连接一个 URL 规则。与 route() 装饰器完全一样。如果提供了 view_func,它将被注册到端点。

    我只是在一个非常通用的级别上对其进行了概述,但是您需要深入了解 Flask 文档以了解您可以用它做些什么。

    编辑:刚刚意识到我没有回答你所有的问题。通常,Flask 会寻找一个 static/ 文件夹来提供静态资产,例如永远不会更改的 css 和 html 页面,以及一个 templates/ 文件夹,用于存放通常具有占位符的模板,这些占位符将由来自服务器的数据填充。因此,基于您的代码的单个文件 Flask 应用程序可能看起来像这样:

    - app.py
    static/
    templates/
        - login.html
    

    其中 login.html 是要填充数据并为 /login 页面呈现的模板

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-03
    • 2021-09-02
    • 2021-09-17
    • 2018-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多