flask学习笔记

Flask

安装

flask依赖两个外部库,一个是Werkzeug,一个提供WSGI支持,还有一个是Jinja2负责解析模版。

virtualenv

它提供了分离运行环境的功能。

1
2
3
makdir my project
cd myproject
virtualenv venv
1
. venv/bin/activate

最简单的应用

1
2
3
4
5
6
7
from flask import Flask 
app = Flask(__name__)
@app.route( / )
def hello_world():
return Hello World!
if __name__ == __main__ :
app.run()

这个默认情况下是在debug模式下运行的,它只监听来自127.0.0.1的请求。想要关闭debug消息的话需要修改为下面的代码。

1
2
3
4
5
6
7
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')

flask还提供了debug模式,就是不需要每次改完代码再重启服务。只要代码有修改那么只需要把代码改为

1
2
3
4
5
6
7
from flask import Flask 
app = Flask(__name__)
@app.route( / )
def hello_world():
return Hello World!
if __name__ == __main__ :
app.run(debug=True)

或者

1
2
3
4
5
6
7
8
from flask import Flask 
app = Flask(__name__)
@app.route( / )
def hello_world():
return Hello World!
if __name__ == __main__ :
app.debug=True
app.run()

在多进程的环境下似乎会有问题。

路由

在函数前加一个修饰,可以指定URL到这个函数中

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

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

规则变量

类似C++中的重载,但在python中是根据变量的名字来找到对应的函数。

1
2
3
4
5
6
7
@app.route('/user/<username>')
def a(username):
return 'hello'

@app.route('/user/<int:post_id>')
def a(post_id):
return 'wolrd'

可以使用的用来分流的东西有intfloatpath

如果一个路径规则有一个/的话,当一个URL没有/的话,程序也会自动补上,但是反过来则无法匹配了。

URL生成

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
>>>from flask import Flask, url_for >>> app = Flask(__name__)
>>> @app.route( / )
... def index(): pass
...
>>> @app.route( /login )
... def login(): pass
...
>>> @app.route( /user/<username> )
... def profile(username): pass
...
>>> with app.test_request_context():
... print url_for( index )
... print url_for( login )
... print url_for( login , next= / )
... print url_for( profile , username= John Doe ) ...
/
/login
/login?next=/
/user/John%20Doe

4.3.3 HTTP方法

默认情况下,flask app只对GET方法有回应,如果要接受POST方法的话

1
2
3
4
5
6
@app.route( /login , methods=[ GET ,  POST ]) 
def login():
if request.method == POST :
do_the_login()
else:
show_the_login_form()

4.5 套用模版

回复的时候为了可以套入模版,可以使用render_template方法。

需要将模版放在文件夹/templates/中。

case 1:a module:

1
2
3
/application.py
/templates
/hello.html

case 2:a package

1
2
3
4
/application
/__init__.py
/templates
/hello.html

4.6 读取请求数据

flask中使用的是全局的request object,但它本身是线程安全的。

4.6.1 Context Locals

此处暂时没懂。

4.7 错误

可以使用模版来自定义错误界面。

8.4 其它模块的日志

当有其它模块的时候,为了让它的log也能写进来,可以使用下面的代码。

1
2
3
4
5
from logging import getLogger
loggers=[app.logger,getlogger('sqlalchemy'),getLogger('otherlibrary')]
for logger in loggers:
logger.addhandler(mail_handler)
logger.addHandler(file_handler)
分享到