一个最简单的应用

我们在第 1 章已经看到了一个简单的 Hello World 的例子,相信你已经成功地把它跑起来了,下面我们对这个程序进行讲解。回顾一下这个程序:

  1. $ cat hello.py
  2. from flask import Flask
  3. app = Flask(__name__)
  4. @app.route("/")
  5. def hello():
  6. return "Hello World!"
  7. if __name__ == "__main__":
  8. app.run()
  • 先看程序的第 1 句:
  1. from flask import Flask

该句从 flask 包导入了一个 Flask 类,这也是后面构建 Flask Web 程序的基础。

  • 接着看程序的第 2 句:
  1. app = Flask(__name__)

上面这一句通过将 __name__ 参数传给 Flask 类的构造函数,创建了一个程序实例 app,也就创建了一个 Flask 集成的开发 Web 服务器。Flask 用 __name__ 这个参数决定程序的根目录,以便程序能够找到相对于程序根目录的资源文件位置,比如静态文件等。

  • 接着看程序的第 3,4,5 句:
  1. @app.route("/")
  2. def hello():
  3. return "Hello World!"

可能读者会对这三句感到很困惑:它们的作用是什么呢?我们知道,Web 浏览器把请求发送给 Web 服务器,Web 服务器再把请求发送给 Flask 程序实例,那么程序实例就需要知道对每个 URL 请求应该运行哪些代码。

上面这三句代码的意思就是:如果浏览器要访问服务器程序的根地址(”/“),那么 Flask 程序实例就会执行函数 hello() ,返回『Hello World!』。

比如,假设我们部署程序的服务器域名为 www.hello.com,当我们在浏览器访问 http://
www.hello.com(也就是根地址)时,会触发 Flask 程序执行 hello() 这个函数,返回『Hello World!』,这个函数的返回值称为响应,是客户端接收到的内容。

但是,如果我们在浏览器访问 http://www.hello.com/peter 时,程序会返回 404 错误,因为我们的 Flask 程序并没有对这个 URL 指定处理函数,所以会返回错误代码。

  • 接着看程序的最后两句:
  1. if __name__ == "__main__":
  2. app.run()

上面两句的意思,当我们运行该脚本的时候(第 1 句),启动 Flask 集成的开发 Web 服务器(第 2 句)。默认情况下,改服务器会监听本地的 5000 端口,如果你想改变端口的话,可以传入 “port=端口号”,另外,如果你想支持远程,需要传入 “host=0.0.0.0”,你还可以设置调试模式,如下:

  1. app.run(host='0.0.0.0', port=8234, debug=True)

服务器启动后,程序会进入轮询,等待并处理请求。轮询会一直运行,直到程序被终止。需要注意的是,Flask 提供的 Web 服务器不适合在生产环境中使用,后面我们会介绍生产环境中的 Web 服务器。

OK,到此为止,我们基本明白一个简单的 Flask 程序是怎么运作的了,后面我们就一起慢慢揭开 Flask 的神秘面纱吧~~