Flask的web项目构建过程

主要内容:

  • Flask介绍与安装
  • Flask构建Hello world
  • Flask使用详解

    一、Flask介绍与安装

    What is Flask?
    Flask两个重要外部库:Jinja2模板引擎和Werkzeug WSGI套件。

1.1 pip安装

1
2
3
4
5
# pip安装
[five@nagios-server ~]$ sudo yum search python-pip

# pip升级至最新版8.1.1
[five@nagios-server ~]$ sudo pip install --upgrade pip

1.2 virtualevn安装

virtualevn是Python开发必备工具,可在不同项目目录生成全新的Python开发环境,指定不同版本的Python及模块。

1
2
# virtualenv安装
[five@nagios-server ~]$ sudo pip install virtualenv


创建项目独有的Pthon开发环境:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# 创建venv环境
[five@nagios-server hello_flask]$ virtualenv venv
New python executable in /home/five/hello_flask/venv/bin/python
Installing setuptools, pip, wheel...done.
[five@nagios-server hello_flask]$ ll
total 0
drwxrwxr-x. 5 five five 77 Apr 16 19:21 venv
[five@nagios-server hello_flask]$ ll venv/
total 8
drwxrwxr-x. 2 five five 4096 Apr 16 19:21 bin
drwxrwxr-x. 2 five five 22 Apr 16 19:20 include
drwxrwxr-x. 3 five five 22 Apr 16 19:20 lib
lrwxrwxrwx. 1 five five 3 Apr 16 19:20 lib64 -> lib
-rw-rw-r--. 1 five five 60 Apr 16 19:21 pip-selfcheck.json
[five@nagios-server hello_flask]$ ll venv/bin/
total 52
-rw-rw-r--. 1 five five 2086 Apr 16 19:21 activate
-rw-rw-r--. 1 five five 1028 Apr 16 19:21 activate.csh
-rw-rw-r--. 1 five five 2226 Apr 16 19:21 activate.fish
-rw-rw-r--. 1 five five 1137 Apr 16 19:21 activate_this.py
-rwxrwxr-x. 1 five five 255 Apr 16 19:20 easy_install
-rwxrwxr-x. 1 five five 255 Apr 16 19:20 easy_install-2.7
-rwxrwxr-x. 1 five five 227 Apr 16 19:20 pip
-rwxrwxr-x. 1 five five 227 Apr 16 19:20 pip2
-rwxrwxr-x. 1 five five 227 Apr 16 19:20 pip2.7
-rwxrwxr-x. 1 five five 7136 Apr 16 19:20 python
lrwxrwxrwx. 1 five five 6 Apr 16 19:20 python2 -> python
lrwxrwxrwx. 1 five five 6 Apr 16 19:20 python2.7 -> python
-rwxrwxr-x. 1 five five 2345 Apr 16 19:21 python-config
-rwxrwxr-x. 1 five five 234 Apr 16 19:20 wheel
# 激活venv环境, 通过which来确认以切换至venv环境
[five@nagios-server hello_flask]$ . venv/bin/activate 或 source venv/bin/activate
(venv) [five@nagios-server hello_flask]$ which python
~/hello_flask/venv/bin/python

后续操作以当前项目hello_flask为前提,所有操作在项目的venv环境下执行。
退出当前venv环境使用deactivate命令。
venv参考阅读:

1.3 Flask安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
(venv) [five@nagios-server hello_flask]$ pip install Flask
Collecting Flask
Successfully built Flask itsdangerous MarkupSafe
Installing collected packages: Werkzeug, MarkupSafe, Jinja2, itsdangerous, Flask
Successfully installed Flask-0.10.1 Jinja2-2.8 MarkupSafe-0.23 Werkzeug-0.11.8 itsdangerous-0.24
(venv) [five@nagios-server hello_flask]$ pip list
Flask (0.10.1)
itsdangerous (0.24)
Jinja2 (2.8)
MarkupSafe (0.23)
pip (8.1.1)
setuptools (20.9.0)
Werkzeug (0.11.8)
wheel (0.29.0)

二、Flash构建hello world

2.1 hello.py

1
2
3
4
5
6
7
8
9
from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
return 'Hello World!'

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

2.2 python hello.py

1
2
3
4
5
6
7
# 运行hello.py
(venv) [five@nagios-server hello_flask]$ python hello.py
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

# 本地访问 http://127.0.0.1:5000/
[five@nagios-server ~]$ curl http://127.0.0.1:5000/
Hello World!

注: 目前该web服务只能通过本地访问,无法对外服务。

2.3 代码解析

  1. 导入Flask类, 该类的实例将作为本例的WSGI应用。
  2. 新建Flask类实例,第一个参数应为模块或应用的名字,本例就是name(单一模块的情况下建议使用name;若是采用包的方式时,应采用包名或包名/文件名的方式。)
    __name__参数的作用:根据当前模块是作为应用还是作为模块导入而不同,可能值为__main__和模块名。该值被用于据文件系统查找合适的资源,提高调试信息完整性。

    About the First Parameter
    The idea of the first parameter is to give Flask an idea what belongs to your application. This name is used to find resources on the file system, can be used by extensions to improve debugging information and a lot more.

    So it’s important what you provide there. If you are using a single module, name is always the correct value. If you however are using a package, it’s usually recommended to hardcode the name of your package there.

  3. 使用@app.route()注入路由说明:URL为/时触发函数hello_world
  4. 函数名hello_world为特定的函数产生URLs,且返回内容至用户浏览器。
  5. 最终,调用run()为本应用运行服务器程序。__name__ == '__main__':确保只有本文件被python直接解析执行时运行服务器程序,而作为模块导入时不会运行服务器程序。

    Ctrl+C停止当前服务

三、开放外部访问的服务

上述例子中,运行服务器程序后只能本地访问http://127.0.0.1:5000/,而无法通过外部地址访问,也就是并未开放对外服务。
缺省模式下,处于安全考虑(调试模式下该应用的用户可执行任意本地的Python代码)默认设置就是禁止外部访问服务的。
如果关闭调试模式信任用户,可开放服务的外部访问。修改如下:

1
2
3
4
5
6
7
8
vim hello.py
app.run(host='0.0.0.0')

(venv) [five@nagios-server hello_flask]$ python hello.py
* Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
192.168.8.1 - - [17/Apr/2016 15:06:51] "GET / HTTP/1.1" 200 -
192.168.8.1 - - [17/Apr/2016 15:06:59] "GET /favicon.ico HTTP/1.1" 404 -
192.168.8.1 - - [17/Apr/2016 15:07:25] "GET / HTTP/1.1" 200 -

四、调试模式

run()方法很方便的运行本地开发版服务器,但每次代码修改后需要手动重启程序。
开启调试模式,可使得服务器程序在代码更改后自动重启, 而且会在程序异常时给出友好的提示信息。
开启调试模式的方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
app.debug = True
app.run()

app.run(debug=True)

# 开启调试模式后运行
(venv) [five@nagios-server hello_flask]$ python hello.py
* Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
* Restarting with stat
* Debugger is active!
* Debugger pin code: 209-179-100
192.168.8.1 - - [17/Apr/2016 17:29:48] "GET / HTTP/1.1" 200 -
192.168.8.1 - - [17/Apr/2016 17:29:54] "GET / HTTP/1.1" 200 -

注意:调试模式强烈不建议在生产环境下开启,存在安全隐患~

五、路由

现在web应用均采用优雅的URL来定义网页地址,这样有意义的URL可提高用户直接访问的可能,而不是完全无意义的一堆字母。
前文中利用route()将一个函数绑定到特定URL,类似的例子:

1
2
3
4
5
6
7
@app.route('/')
def index():
return 'Index Page'

@app.route('/hello')
def hello():
return 'Hello World'

5.1 动态URL之变量规则

在URL中加入变量的语法规则是<variable_name>, 如需类型转换可采用这种规则<converter:variable_name>

1
2
3
4
5
6
7
8
9
@app.route('/user/<username>')
def show_user_profile(username):
# show the user profile for that user
return 'User %s' % username

@app.route('/post/<int:post_id>')
def show_post(post_id):
# show the post with the given id, the id is an integer
return 'Post %d' % post_id

当前支持的converter转换器有:

int: 接受整型
float: 接受浮点数
path: 和默认情况相同,也接受斜线/

5.2 唯一URL和重定向

Flask的URL规则基于Werkzeug的路由模块

5.3 URL构建

5.4 HTTP方法

六、静态文件

七、渲染模板

八、操作请求数据

九、重定向和错误

十、关于响应

十一、会话Session

十二、消息闪现

十三、日志

十四、集成WSGI中间件

十五、部署至网络服务器

参考文献

  1. Flask readthedocs.org