《Flask Web开发:基于Python的Web应用开发实战》笔记一

一、安装

简介:

  • 在大多数标准汇总,Flask都算是小型框架,甚至可以成为“微框架”。同时具备高扩展的能力,具有一个包含基本服务的强健核心,其他功能可通过扩展实现。
  • 两个主要依赖:路由、调试和Web服务器网关接口子系统有Werkzeug提供;模板系统由Jinja2提供。

1.1、使用虚拟环境

先将实验文件从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

1.2、使用pip命令安装Python包

进入flasky文件,激活虚拟环境,使用pip命令安装Flask:

$ cd flasky
$ source venv/bin/activate
$ pip install flask

二、程序的基本结构

2.1、初始化

所有Flask程序都必须创建一个程序实例。Web服务器使用一种WSGI的协议,把接收自客户端的所有请求都交由这个对象处理。程序实例是Flask类的对象。

from flask import Flask
app = Flask(__name__)

2.2、路由和视图函数

客户端把请求发送给Web服务器,Web服务器将请求发送给Flask程序实例。程序实例需要只要知道每个URL请求运行那些代码,即URL到Python函数的映射关系。
处理URL和Python函数之间的关系的程序成为路由
视图函数返回的响应可以包括HTML的简单字符串,也可以是复杂的表单。

2.3、启动服务器

程序实例用run方法启动Flask集成的开发Web服务器:

if __name__ == “__main__”:
app.run(debug=True)

2.4、一个完整的程序

将前几节介绍的Flask Web程序的不同组成部分合并到一个hello.py文件

 from flask import Flask
app = Flask(__name__)

@app.route('/')
def index():
    return '<h1>Hello World!</h1>'

if __name__ == "__main__":
    app.run(debug=True)

切换到虚拟环境,执行hello.py文件,启动Flask程序:

《Flask Web开发:基于Python的Web应用开发实战》笔记一

  • 访问Flask程序:
$: curl 127.0.0.1:5000

优化成包含动态路由的Flask程序

from flask import Flask
app = Flask(__name__)

@app.route('/')
def index():
    return '<h1>Hello World!</h1>'

if __name__ == "__main__":
    app.run(debug=True)

测试效果

《Flask Web开发:基于Python的Web应用开发实战》笔记一

2.5、请求-响应循环

2.5.1、程序和请求上下文

Flask从客户端接收到的请求,要让视图函数访问请求对象,一种显而易见的方式就是将其作为参数传入视图函数,不过导致程序中的每个视图函数都会增加一个参数。
为了避免大量可有可无的参数把视图函数弄的一团糟,Flask使用了上下文临时把某些对象变为全局可访问。

在Flask中有两种上下文:程序上下文和请求上下文

  • 变量名 上下文 说明
  • current_app 程序上下文 当前激活程序的实例
  • g 程序上下文 处理请求时用作临时存储的对象,每次请求都会重设这个变量
  • request 请求上下文 请求对象,封装了客户端发出的HTTP请求中的内容
  • session 请求上下文 用户会话,用于存储请求之间需要“记住”的值的词典。

2.5.2、请求调度

程序收到客户端发送的请求,要找到处理该请求的视图函数。
Flask会在程序的URL映射中查找请求的URL。URL映射是URL和视图函数之间的对应关系。
Flask使用app.route修饰器或者非修饰器形式的app.add_url_rule()生成映射。

  • 查看Flask程序中的URL映射:(激活虚拟环境)
>> >> 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是请求方法,由路由进行处理。

2.5.3、请求钩子

有时候在处理请求之前或之后执行代码会很有用。请求钩子使用修饰器实现,Flask支持以下4种钩子:

  • before_firest_request: 注册一个函数,在处理第一个请求之前运行
  • before_request: 注册一个函数,在每次请求执勤啊运行
  • after_request: 注册一个函数,如果没有未处理的异常抛出,在每次请求之后运行。
  • teardown_request: 注册一个函数,即使有未处理的异常抛出,也在每次请求之后运行。

2.5.4 响应

在大多数情况下,响应就是一个简单的字符串,作为HTML页面传回客户端。但HTTP协议需要的不仅是作为请求响应的字符串。
其中HTTP响应中一个很重要的部分是状态码,Flask默认为200.
make_response()函数可接受1个、2个或3个参数,并返回一个Response对象。

from flask import make_response
@app_route(‘/’)
def index():
response = make_response(‘<h1>This document carries a cookie!</h1>’)
response.set_cookie(‘answer’,’42’)
return response
  • 重定向使用redirect()辅助函数
from flask import redirect 
@app.route(‘/’)
def index():
return redirect(“http://www.example.com”)

还有一种特殊的响应有abort函数生成,用于处理错误。

2.6、Flask扩展

使用Flask-Script支持命令行选项
Flask-Script是一个Flask扩展,为Flask程序添加一个命令行解析器。Flask-Script自带了一组常用选项,而且还支持自定义命令。

  • Flask-Script扩展使用pip安装:
pip install flask-script
  • 示例把命令解析行功能添加到hello.py程序中需要修改的地方
 from flask import Flask
from flask_script import Manager
app = Flask( __name__ )
manager = Manager( app )

@app.route(‘/’)
def index():
    return ‘<h1>hello,world</h1>’

@app.route(‘/user/<name>’)
def user(name):
    return ‘<h1>hello,%s!</h1>’ % name

if __name__ == “__main__”:
    manager.run()

如果已经从git上克隆了该仓库,可以直接切换到2c分支上。
这样修改之后,程序可以使用一组基本命令行选项,现在运行hello.py

《Flask Web开发:基于Python的Web应用开发实战》笔记一

  • --host参数告诉Web服务器在哪个网络接口上监听来自客户端的连接。
  • --port参数告诉Web服务器在哪个网络端口。
python hello.py runserver --host 0.0.0.0 --port 9999

《Flask Web开发:基于Python的Web应用开发实战》笔记一

猜你喜欢

转载自blog.51cto.com/mbb97/2350893