Flask依赖两个外部库:Werkzeug和Jinja2。Werkzeug是一个WSGI(在Web应用和多种服务器之间的标准Python接口)工具集;Jinja2负责渲染模板。所以在安装Flask之前,需要安装这两个外部库。
安装虚拟环境
1、安装Virtualenv
最好在命令行中安装
virtualenv --version 可以查看版本
2、创建虚拟环境
接下来使用virtualenv命令在当前文件夹中创建Python虚拟环境。这个命令只有一个必需的参数,即虚拟环境的名字。创建虚拟环境后,当前文件夹中会出现一个子文件夹,与虚拟环境相关的文件都保存在这个子文件夹中。一般,虚拟环境会被命名为venv
运行完成后,在运行的目录下,会新增一个venv文件夹,它保存全新的虚拟环境,其中有一个私有的Python解释器。
3、激活虚拟环境
venvScriptsactivate
安装Flask
pip install flask
安装成功后,可通过 pip list --format columns 查看所有安装包
第一个Flask程序
from flask import Flask #导入flask app=Flask(__name__) #创建Flask对象 @app.route('/') def hell_world(): return 'hello world!' if __name__ == '__main__': app.run()
输入上面的网址,发现hello world显示出来了
那么,这段代码做了什么?
首先,我们导入了Flask类。这个类的实例将会是我们的WSGI应用程序
接下来,我们创建一个该类的实例,第一个参数是应用模块或包的名称。如果你使用单一的模块,应该使用__name__,因为模块的名称将会因其作为单独应用启动还是作为模块导入而有不同(也就是__main__或实际的导入名)。这是必须的,这样Flask才知道到哪去找模块、静态文件等等。详见Flask文档
然后,我们使用route()装饰器告诉Flask什么样的URL能触发我们的函数。
这个函数的名字也在生成URL时被特定的函数采用,这个函数返回我们想要显示在用户浏览器中的信息。
最后我们用run()函数来让应用运行在本地服务器上。main保证该脚本被Python解释器直接执行的时候才会运行,而不是作为模块导入的时候。
开启调试模式
虽然run()方法适用于启动本地的开发服务器,但是每次修改代码后都要手动重启它。这样并不够优雅。有两种途径来启动调试模式:
一种是直接在应用对象上设置:
app.debug=True
app.run()
另一种是作为run方法的一个参数传入:
app.run(debug=True)
路由
客户端(如Web浏览器)把请求发送给Web服务器,Web服务器再把请求发送给Flask程序实例。程序实例需要知道对每个URL请求运行了哪些代码,所以保存了一个URL到Python函数的映射关系。处理URL和函数之间关系的程序为路由。
在Flask程序中定义路由的最简便方式,是使用程序实例提供的app.route修饰器,把修饰的函数注册为路由。
修饰器是python语言的标准特性,可以使用不同的方式修改函数的行为。通常用法是使用修饰器把函数注册为事件的处理程序。
你也可以构造含动态部分的URL,也可以在一个函数上附着多个规则
1、变量规则
要给URL添加变量部分,你可以把这些特殊字段标记为<variable_name>,这个部分将会作为命名参数传递到你的函数。规则可以用<converter:variable_name>指定一个可选的转换器。
示例
from flask import Flask #导入flask app=Flask(__name__) #创建Flask对象 @app.route('/') def hell_world(): return 'hello world!' @app.route('/user/<username>') def show_user_profile(username): #显示该用户名的用户信息 return 'User %s'%username @app.route('/post/<int:post_id>') def show_post(post_id): #根据id显示文章,id是整型数据 return 'Post %d'%post_id if __name__ == '__main__': app.run(debug=True)
上述代码中使用了转换器。它有下面几种:
int 接受整数
float 接受浮点数
path 默认。但也接受斜线
运行文件,在浏览器中将地址修改为“http://127.0.0.1:5000/user/张三”,查看展示效果
输入“http://127.0.0.1:5000/post/2”
2、构造URL
如果Flask能匹配URL,那么Flask能生成它们吗?你可以用url_for()来给指定的函数构造URL。它接受函数名作为第一个参数,也接受对应URL规则的变量部分的命名参数。未知变量部分会添加到URL末尾作为查询参数。
from flask import Flask,url_for app=Flask(__name__) @app.route('/url/') def get_url(): #根据id显示文章,id是整型数据 return url_for('show_post',post_id=2) if __name__ == '__main__': app.run(debug=True)
3、HTTP方法
HTTP(与web应用会话的协议)有许多不同的访问URL方法。默认情况下,路由只回应GET请求,但是通过route()装饰器传递methods参数可以改变这个行为。
静态文件
动态Web应用也会需要静态文件,通常是CSS和JavaScript文件。理想状况下,你已经配置好Web服务器来提供静态文件,但在开发中,Flask也可以做到。只要在你的包中或是模板所在目录中创建一个名为static的文件夹,在应用中使用“/static”即可访问
给静态文件生成URL,使用特殊的“static”端点名
url_for('static',filename='hello.html')
模板
模板是一个包含响应文本的文件,其中包含用占位变量表示的动态部分,其具体值只在请求的上下文中才能知道。使用真实值替换变量,再返回最终得到的响应字符串,这一过程称为渲染。为了渲染模板,Flask使用了Jinja2的强大模板引擎。
1、渲染模板
默认情况下,Flask在程序文件夹中的templates子文件夹中寻找模板。
Flask提供的render_template()函数把Jinja2模板引擎集成到了程序中。第一个参数是模板的文件名。随后的参数都是键值对,表示模板中变量对应的真实值。在这段代码中,第二个模板收到一个名为name的变量。