简介:
- 在大多数标准汇总,Flask都算是小型框架,甚至可以成为“微框架”。同时具备高扩展的能力,具有一个包含基本服务的强健核心,其他功能可通过扩展实现。
- 两个主要依赖:路由、调试和Web服务器网关接口子系统有Werkzeug提供;模板系统由Jinja2提供。
先将实验文件从git的仓库中下载到本地,并且切换到1a分支:
$ git clone https://github.com/miguelgrinberg/flasky.git
$ cd flasky
$ git checkout 1a
查看是否安装了virtualenv(虚拟环境使用第三方实用工具):
virtualenv --version
结果显示错误,则表示没安装,安装命令:
pip install virtualenv
使用virtualenv命令在flasky文件夹中创建Python虚拟环境:
virtualenv venv
virtualenv命令中只要一个必须参数,venv即是虚拟环境的名字。并且会创建一个子文件夹,所有与虚拟环境相关的文件都会保存在这个文件夹中。
source vev/bin/activate
退出当前虚拟环境,回到全局Python解释器中:
deactivate
进入flasky文件,激活虚拟环境,使用pip命令安装Flask:
$ cd flasky
$ source venv/bin/activate
$ pip install flask
所有Flask程序都必须创建一个程序实例。Web服务器使用一种WSGI的协议,把接收自客户端的所有请求都交由这个对象处理。程序实例是Flask类的对象。
from flask import Flask
app = Flask(__name__)
客户端把请求发送给Web服务器,Web服务器将请求发送给Flask程序实例。程序实例需要只要知道每个URL请求运行那些代码,即URL到Python函数的映射关系。
处理URL和Python函数之间的关系的程序成为路由
视图函数返回的响应可以包括HTML的简单字符串,也可以是复杂的表单。
程序实例用run方法启动Flask集成的开发Web服务器:
if __name__ == “__main__”:
app.run(debug=True)
将前几节介绍的Flask Web程序的不同组成部分合并到一个hello.py文件
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
return '<h2>Hello World!</h2>'
if __name__ == "__main__":
app.run(debug=True)
切换到虚拟环境,执行hello.py文件,启动Flask程序:
$: curl 127.0.0.1:5000
优化成包含动态路由的Flask程序
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
return '<h2>Hello World!</h2>'
if __name__ == "__main__":
app.run(debug=True)
测试效果
Flask从客户端接收到的请求,要让视图函数访问请求对象,一种显而易见的方式就是将其作为参数传入视图函数,不过导致程序中的每个视图函数都会增加一个参数。
为了避免大量可有可无的参数把视图函数弄的一团糟,Flask使用了上下文临时把某些对象变为全局可访问。在Flask中有两种上下文:程序上下文和请求上下文
- 变量名 上下文 说明
- current_app 程序上下文 当前激活程序的实例
- g 程序上下文 处理请求时用作临时存储的对象,每次请求都会重设这个变量
- request 请求上下文 请求对象,封装了客户端发出的HTTP请求中的内容
- session 请求上下文 用户会话,用于存储请求之间需要“记住”的值的词典。
程序收到客户端发送的请求,要找到处理该请求的视图函数。
Flask会在程序的URL映射中查找请求的URL。URL映射是URL和视图函数之间的对应关系。
Flask使用app.route修饰器或者非修饰器形式的app.add_url_rule()生成映射。
>> >> from hello import app
>> app.url_map
Map([<Rule '/' (HEAD, OPTIONS, GET) -> index>,
<Rule '/static/<filename>' (HEAD, OPTIONS, GET) -> static>,
<Rule '/user/<name>' (HEAD, OPTIONS, GET) -> user>])
URL映射中的HEAD、Options、GET是请求方法,由路由进行处理。
有时候在处理请求之前或之后执行代码会很有用。请求钩子使用修饰器实现,Flask支持以下4种钩子:
- before_firest_request: 注册一个函数,在处理第一个请求之前运行
- before_request: 注册一个函数,在每次请求执勤啊运行
- after_request: 注册一个函数,如果没有未处理的异常抛出,在每次请求之后运行。
- teardown_request: 注册一个函数,即使有未处理的异常抛出,也在每次请求之后运行。
在大多数情况下,响应就是一个简单的字符串,作为HTML页面传回客户端。但HTTP协议需要的不仅是作为请求响应的字符串。
其中HTTP响应中一个很重要的部分是状态码,Flask默认为200.
make_response()函数可接受1个、2个或3个参数,并返回一个Response对象。
from flask import make_response
@app_route(‘/’)
def index():
response = make_response(‘<h2>This document carries a cookie!</h2>’)
response.set_cookie(‘answer’,’42’)
return response
from flask import redirect
@app.route(‘/’)
def index():
return redirect(“http://www.example.com”)
还有一种特殊的响应有abort函数生成,用于处理错误。
使用Flask-Script支持命令行选项
Flask-Script是一个Flask扩展,为Flask程序添加一个命令行解析器。Flask-Script自带了一组常用选项,而且还支持自定义命令。
pip install flask-script
from flask import Flask
from flask_script import Manager
app = Flask( __name__ )
manager = Manager( app )
@app.route(‘/’)
def index():
return ‘<h2>hello,world</h2>’
@app.route(‘/user/<name>’)
def user(name):
return ‘<h2>hello,%s!</h2>’ % name
if __name__ == “__main__”:
manager.run()
如果已经从git上克隆了该仓库,可以直接切换到2c分支上。
这样修改之后,程序可以使用一组基本命令行选项,现在运行hello.py
- --host参数告诉Web服务器在哪个网络接口上监听来自客户端的连接。
- --port参数告诉Web服务器在哪个网络端口。
python hello.py runserver --host 0.0.0.0 --port 9999
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。