Flask
Flask是使用Python编写的Web微框架。Web框架可以让我们不用关心底层的请求响应处理,更方便高效地编写Web程序。因为Flask核心简单且易于扩展,所以被称作微框架(micro framework)。Flask有两个主要依赖,一个是WSGI(Web Server Gateway Interface,Web服务器网关接口)工具集——Werkzeug,另一个是Jinja2模板引擎。Flask只保留了Web开发的核心功能,其他的功能都由外部扩展来实现,比如数据库集成、表单认证、文件上传等。
名称 | 说明 | 资源 |
---|---|---|
Jinja2 | 模板渲染引擎 | 主页:http://jinja.pocoo.org 源码:https://github.com/palles/jinja |
MarkupSafe | Html字符转义工具 | 主页:https://github.com/pallets/markupsafe |
Werkzeug | WSGI工具集,处理请求与响应,内置WSGI开发服务器、调试器和重载器 | 主页:http://werkzeug.pocoo.org |
Click | 命令行工具 | 主页:https://github.com/pallets/click |
itsdangerous | 提供各种加密签名功能 | 主页:https://github.com/pallets/itsdangerous |
Hello Flask
应用实例
所有 Flask 应用都必须创建一个应用实例。Web 服务器使用一种名为 Web 服务器网关接口
(WSGI,Web server gateway interface,读作“wiz-ghee”)的协议,把接收自客户端的所有请求都
转交给这个对象处理。应用实例是 Flask 类的对象,通常由下述代码创建:
from flask import Flask
app = Flask(__name__)
传入Flask类构造方法的第一个参数是模块或包的名称,我们应该使用特殊变量__name__。Python会根据所处的模块来赋予__name__变量相应的值,对于 app.py,这个值为app。除此之外,这也会帮助Flask在相应的文件夹里找到需要的资源,比如模板和静态文件。
路由注册
在一个Web应用里,客户端和服务器上的Flask程序的交互可以简单概括为以下几步:
(1)用户在浏览器输入URL访问某个资源。
(2)Flask接收用户请求并分析请求的URL。
(3)为这个URL找到对应的处理函数。
(4)执行函数并生成响应,返回给浏览器。
(5)浏览器接收并解析响应,将信息显示在页面中。
在上面这些步骤中,大部分都由Flask完成,我们要做的只是建立处理请求的函数,并为其定义对应的URL规则。只需为函数附加app.route()装饰器,并传入URL规则作为参数,我们就可以让URL与函数建立关联。这个过程我们称为注册路由(route),路由负责管理URL和函数之间的映射,而这个函数则被称为视图函数(view function)。
app.route()装饰器把根地址/和index()函数绑定起来,当用户访问这个URL时就会触发index()函数。这个视图函数可以像其他普通函数一样执行任意操作,比如从数据库中获取信息,获取请求信息,对用户输入的数据进行计算和处理等。最后,视图函数返回的值将作为响应的主体,一般来说,响应的主体就是呈现在浏览器窗口的HTML页面。
路由中的动态部分默认使用字符串,不过也可以是其他类型。例如,路由 /user/< int:id >只会匹配动态片段 id 为整数的 URL,例如 /user/123。Flask 支持在路由中使用string、int、float和path类型。path类型是一种特殊的字符串,与 string 类型不同的是,它可以包含正斜线。
# 静态路由方法一
@app.route('/')
def index():
return '<h1>Hello, Flask!</h1>'
# 静态路由方法二
app.add_url_rule('/', 'index', index)
# 动态路由 设置默认值
@app.route('/greet', defaults={'name': 'Programmer'})
@app.route('/greet/<string:name>')
def user(name):
return '<h1>Hello, {}!</h1>'.format(name)
前例把 index() 函数注册为应用根地址的处理程序。使用 app.route装饰器注册视图函数是首选方法,但不是唯一的方法。Flask 还支持一种更传统的方式:使用app.add_url_rule()方法。这个方法最简单的形式接受 3 个参数:URL、端点名和视图函数。
Web开发服务器
Flask通过依赖包Click内置了一个CLI(Command Line Interface,命令行交互界面)系统。当我们安装Flask后,会自动添加一个flask命令脚本,我们可以通过flask命令执行内置命令、扩展提供的命令或是我们自己定义的命令。其中flask run命令用来启动内置的开发服务器。确保执行命令前激活了虚拟环境(pipenv shell),否则需要使用pipenv run flask run命令启动开发服务器。
一般来说,在执行flask run命令运行程序前,我们需要提供程序实例所在模块的位置,但有时候Flask会自动查找程序。
Flask自动探测存在下面这些规则:
- 从当前目录寻找app.py和wsgi.py模块,并从中寻找名为app或application的程序实例。
- 从环境变量FLASK_APP对应的值寻找名为app或application的程序实例。
#windows 下为 set
export FLASK_APP=name
export FLASK_DEBUG=1 # 打开调试模式
export FLASK_ENV=development # 开发环境
flask run
flask run命令运行的开发服务器默认会监听http://127.0.0.1:5000地址(按Crtl+C退出),并开启多线程支持。我们在上面启动的Web服务器默认是对外不可见的,可以在run命令后添加–host选项将主机地址设为0.0.0.0使其对外可见:
flask run --host=0.0.0.0
这会让服务器监听所有外部请求。个人计算机(主机)一般没有公网IP(公有地址),所以你的程序只能被局域网内的其他用户通过你的个人计算机的内网IP(私有地址)访问,