本篇所有操作均在基于 Ubuntu 16.04 LTS 的虚拟机下完成,且使用 Vagrant 来操作虚拟机系统,虚拟机系统 VirtualBox Version: 7.0
Hello World
环境准备:
Python 2.7.11+
pip==9.0.3
flask==0.11.1
werkzeug==0.11.10
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
❯ python --version
Python 2.7.11+
~/web_develop master* ⇣ ubuntu@WEB
❯ pip --version
pip 9.0.3 from /usr/local/lib/python2.7/dist-packages (python 2.7)
~/web_develop master* ⇣ ubuntu@WEB
❯ pip show Flask
Name: Flask
Version: 0.11.1
Summary: A microframework based on Werkzeug, Jinja2 and good intentions
Home-page: http://github.com/pallets/flask/
Author: Armin Ronacher
Author-email: armin.ronacher@active-4.com
License: BSD
Location: d:\python27\lib\site-packages
Requires: itsdangerous, click, Werkzeug, Jinja2
1、Flask 入门代码
1
2
3
4
5
6
7
8
9
10
11
12
13
# coding=utf-8
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello World!'
if __name__ == '__main__':
app.run(host='0.0.0.0', port=9000)
启动:
1
2
❯ python hello.py
* Running on http://0.0.0.0:9000/ (Press CTRL+C to quit)
启动后打开浏览器访问 http://127.0.0.1:9000 就可以看到熟悉的 Hello World!
了,按 Ctrl + c
可以停止服务。
2、代码解析
(1)
1
# coding=utf-8
声明 python 源文件编码的语法。该编码信息后续会被 python 解析器解析源文件。如果没有特殊原因都应统一使用 utf-8,而不要使用 gb18030、gb2312 等类型。
(2)
1
from flask import Flask
引入 Flask 类,Flask 类实现了一个 WSGI 应用。
(3)
1
app = Flask(__name__)
app 是 Flask 的实例,它接收包或者模块的名字作为参数,但一般都是传递 __name__
。是为了让 flask.helpers.get_root_path 函数通过传入这个名字确定程序的根目录,以便获得静态文件和模板文件的目录。
(4)
1
2
3
@app.route('/')
def hello_world():
return 'Hello World!'
使用 app.route 装饰器会将 URL 和执行的视图函数的关系保存到 app.url_map 属性上。而处理 URL 和视图函数的关系的程序就是路由,这里的视图函数就是 hello_world。
(5)
1
if __name__ == '__main__':
使用这个判断可以保证其他文件引用这个文件的时候(例如 from hello import app)不会执行这个判断内的代码,也就是不会执行 app.run 函数。
(6)
1
app.run(host='0.0.0.0', port=9000)
执行 app.run 就可以启动服务了。默认 Flask 只监听虚拟机的本地 127.0.0.1 这个地址,端口为 5000。而这里对虚拟机做的端口转发是 9000,所以需要指定 host 和 port 参数。 0.0.0.0 表示监听所有地址,这样就可以在本机进行访问了。
服务器启动后,会调用 werkzeug.serving.run_simple 进入轮询,默认使用单进程单线程的 werkzeug.serving.BaseWSGIServer 处理请求,实际上还是使用标准库 BaseHTTPServer.HTTPServer,通过 select.select 做 0.5 秒的 while True
的时间轮询。
当我们访问 http://127.0.0.1:9000 ,通过 app.url_map 找到注册的 /
这个 URL 模式,就找到了对应的 hello_world 函数并执行,返回 Hello World!
,状态码为 200。如果访问一个不存在的路径,如 http://127.0.0.1:9000/a ,此时 Flask 找不到对应的模式,就会向浏览器返回 Not Found
,状态码是 404。
3、app.run
默认的 app.run 的启动方式只合适调试,不要在生产环境中使用,生产环境应该使用 Gunicorn 或者uWSGI。