- Flask简介
Flask
框架是一个基于python
的微型的web框架.微,并不是说Flask
功能比较弱,微框架的意思是Flask
代码简洁,且易于扩展.它不会并不包含数据库抽象层,表单验证或者任何其它现有的库Django
能够处理的。相反,Flask 支持扩展,这些扩展能够添加功能到你的应用,像是 Flask 本身实现的一样。众多的扩展提供了数据库集成,表单验证,上传处理,多种开放的认证技术等功能.Flask
的核心代码基于两个库Werkzeug
和Jinja2
,一个负责对请求进行处理,一个负责模板渲染.Flask
本身只是Werkzeug
和Jinja2
之间的桥梁,前者实现一个适合WSGI的应用,后者处理模板
- 一个最小的应用
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello World!'
if __name__ == '__main__':
app.run()
将这段代码保存了
hello.py
,然后运行,就可以在 http://127.0.0.1:5000/ 里访问就可以看到Hello World
的字样
- 解释代码
- 首先我们导入了类
Flask
。这个类的实例化将会是我们的 WSGI 应用。第一个参数是应用模块的名称。 如果你使用的是单一的模块(就如本例),第一个参数应该使用__name__
。因为取决于如果它以单独应用启动或作为模块导入, 名称将会不同 ('__main__'
对应于实际导入的名称)。- 接着,我们创建一个该类的实例,我们传递给它模块或包名,这样
Flask
才会知道去哪里寻找模板、静态文件等等。- 我们使用装饰器
route()
告诉 Flask 哪个 URL 才能触发我们的函数。- 定义一个函数,该函数名也是用来给特定函数生成 URLs,并且返回我们想要显示在用户浏览器上的信息。
- 最后我们用函数
run()
启动本地服务器来运行我们的应用。if __name__ =='__main__':
确保服务器只会在该脚本被 Python 解释器直接执行的时候才会运行,而不是作为模块导入的时候。
-
调试模式
run()
方法是十分适用于启动一个本地开发服务器,但是你需要在修改代码后手动重启服务器. 这样做并不好,Flask 能做得更好。如果启用了调试支持,在代码修改的时候服务器能够自动加载, 并且如果发生错误,它会提供一个有用的调试器。
有两种方式开启调式模式。一种是在应用对象上设置标志位:
app.debug = True
app.run()
或者作为run的一个参数传入
app.run(debug=True)
- 路由
@app.route('/')
def index():
return 'Index Page'
@app.route('/hello')
def hello():
return 'Hello World'
route()
装饰器是用于把一个函数绑定到URL上,也可以在同一个函数上配置多个装饰器,制定多个规则.
变量规则
为了给 URL 增加变量的部分,你需要把一些特定的字段标记成 <variable_name>。这些特定的字段将作为参数传入到你的函数中。当然也可以指定一个可选的转换器通过规则 <converter:variable_name>。 这里有一些不错的例子:
@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
注意:
默认没有指定类型的时候都是string类型的,可以指定特定的类型,使用如下的转化器
int | 接收整数 |
---|---|
float | 同int一样,但是接收浮点数 |
path | 和默认的string相似,但是接收斜线 |
唯一的URLs/重定向行为
Flask
的 URL 规则是基于 Werkzeug
的 routing 模块。 该模块背后的想法是基于 Apache 和早期的 HTTP 服务器定下先例确保优雅和唯一
的 URL。
后面带斜杠的路由
@app.route('/projects/')
def projects():
return 'The project page'
规范的 URL 指向 projects 尾端有一个斜线。 这种感觉很像在文件系统中的文件夹。访问一个结尾不带斜线的 URL 会被 Flask 重定向到带斜线的规范URL去。当我们在页面上访问时如果忘记了后面的斜线,它会重定向到带有斜线的路由上面去.这样可以做到当用户访问页面时忘记结尾斜线时,这个行为允许关联的 URL 继续工作, 并且与 Apache 和其它的服务器的行为一致。另外,URL 会保持唯一,有助于避免搜索引擎索引同一个页面两次.但是这样做也有一个弊端,网站路由url加斜杠,用户访问的url无论加不加斜杠均可访问正常,但是不加斜杠的访问链接会做重定向,影响访问速度。
后面不带斜杠的路由
@app.route('/about')
def about():
return 'The about page'
这种URL后面不带斜杠,类似于linux下文件的路径,这个时候如果在网址上访问带斜杠的URL的时候,就不会发生重定向的行为,会产生一个
404 notfound
的错误.
构建URL
如果它可以匹配 URL,那么 Flask 能够生成它们吗?当然 Flask 能够做到。你可以使用函数
url_for()
来针对一个特定的函数构建一个 URL。它能够接受函数名作为第一参数,以及一些关键字参数, 每一个关键字参数对应于 URL 规则的变量部分。未知变量部分被插入到 URL 中作为查询参数。这里有些例子:
运行结果:
- HTTP方法
HTTP协议
有不同的方法来访问URLs.默认情况下,路由只会响应GET请求,当时通过给route()
装饰器设置参数methods
来改变,常用的是设置访问方法为methods=['GET','POST']
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
do_the_login()
else:
show_the_login_form()
- 静态文件
Flask用来存放静态文件(javascript,css,image)默认是在static文件夹下,你只要在你的包中或者模块旁边新建一个
static
文件夹,就可以在你的应用中通过/static来访问.
注意:你可以通过构建Flask实例对象的时候指定静态文件的默认存放目录
- 渲染模板
你可以通过
render_template()
来渲染模板.