通用技术 测试开发——Flask 入门教程系列:01-Hello Flask

弗多 · 2018年02月28日 · 最后由 MitnickEX 回复于 2019年11月21日 · 1825 次阅读

传送门:系列教程前言及整理贴 测试开发——Flask 入门教程系列 (整理及前言)

Hello Flask

安装

Python 版本

2.x >= 2.6

需要 Python 2.6 或更高的版本

3.x >= 3.3

需要 Python3.3 或更高的版本(本教程使用 Python 3.6.0 版本)

依赖库

Flask 依赖两个外部库:WerkzeugJinja2 。 Werkzeug 是一个 WSGI(在 Web 应用和多种服务器之间的标准 Python 接口) 工具集。Jinja2 负责渲染模板。

若是 Python 3.x 版本,你需要使用最新且最大版本的 itsdangerous 、 Jinja2 和 Werkzeug 。

pip 安装

首先,强烈建议使用虚拟环境: virtualenvpyenv (具体使用这边就不介绍了,请 google 或百度相关教程)

然后,pip 安装 Flask

pip install Flask

最后,除 Flask 外,会安装一些相关的插件,后续章节会介绍,请自行 pip 安装

Hello World

Simple Output

#!/usr/bin/env python3

from flask import Flask

app = Flask(__name__)

@app.route('/')
def index():
    return "Hello World!"

app.run()

保存为 xxx.py 文件后,python 运行该 xxx.py 文件,浏览器访问 http://127.0.0.1:5000/ ,你会看见 Hello World

简析

  1. 从 Flask 库导入了 Flask 类;这个类的实例将会是我们的 WSGI 应用程序
  2. app = Flask(__name__);创建一个该类的实例,第一个参数是应用模块或者包的名称。 如果你使用单一的模块(如本例),你应该使用 __name__
  3. @app.route('/') 使用 route() 装饰器定义 URL 路由;你可以试下更改该参数,如 @app.route('/hello') ,此时浏览器访问地址就该是 http://127.0.0.1:5000/hello
  4. 每个路由装饰器都会包含一个函数(示例中为 index() 函数),该函数返回我们想要显示在用户浏览器中的信息。
  5. run() 函数来让应用运行在本地服务器上

Advance

上述示例仅返回了字符串 “Hello World!”,返回体为 Content-Type:text/html;但在实际应用中,简单 REST 服务需要满足以下三点:

  • 返回 json 结构的数据
  • 动态路由,即给 URL 添加变量部分
  • 增删改查的使用,如 PUT、DELETE、POST 和 GET 等

我们下面就来看下如何解决以上三点需求。

jsonify

若要返回 json 数据,可使用 Flask 的 jsonify 函数,详见以下示例:

#!/usr/bin/env python3

from flask import Flask, jsonify

app = Flask(__name__)

@app.route('/')
def index():
    return jsonify({'msg': 'Hello World!'})

app.run()

运行后,浏览器访问 http://127.0.0.1:5000/ ,可见返回体为 json{"msg": "Hello World!"},响应头变为 application/json

动态路由

要给 URL 添加变量部分,你可以把这些特殊的字段标记为 <variable_name> , 这个部分将会作为命名参数传递到你的函数。此外,规则可以用 <converter:variable_name> 指定一个可选的转换器。

#!/usr/bin/env python3

from flask import Flask, jsonify

app = Flask(__name__)

tasks = [
    {
        'id': 1,
        'title': 'Learn Python',
        'description': 'Need to find a good Python tutorial on the web', 
        'done': False
    },
    {
        'id': 2,
        'title': 'Learn Flask',
        'description': 'Simple Demo', 
        'done': False
    }
]

@app.route('/<int:task_id>', methods=['GET'])
def index(task_id):         
    return jsonify({'task': tasks[task_id-1]})

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

注意:以上仅为示例代码,生产代码要做异常返回的处理;app.run(debug=True) 表示开启 debug 模式

另,转换器有下面几种:

converter 描述
int 接受整数
float 同 int ,但是接受浮点数
path 和默认的相似,但也接受斜线

增删改查

在之前的实例中我们可见 @app.route('/') 装饰器定义了 URL 路由(默认方式为查 GET),同样的,其余的各种请求方式也由该装饰器完成。具体使用方式为通过一个叫做 methods 的参数指定,如下分别对应增删改的方式(POST、DELETE、PUT)进行了路由绑定:

@app.route('/', methods=['POST'])
@app.route('/', methods=['DELETE'])
@app.route('/', methods=['PUT'])

有关 HTTP 方法,如不了解可参考下方,建议学习 Flask 前就已经熟悉 HTTP 协议相关内容。

数据库操作超出本章讨论范围,所以这边简单地以内存进行数据存储操作,示例如下:

#!/usr/bin/env python3

from flask import Flask, jsonify, request


app = Flask(__name__)

tasks = ["Hello World"]

@app.route('/task', methods=['GET'])
def getTask():
    return jsonify({'tasks': tasks})

@app.route('/task', methods=['POST'])
def postTask():
    if not request.json or not 'task' in request.json:
        return jsonify({'err': 'miss task'})
    tasks.append(request.json['task'])
    return jsonify({'tasks': tasks})

@app.route('/task', methods=['PUT'])
def resetTask():
    if not request.json or not 'task' in request.json:
        return jsonify({'err': 'miss task'})
    tasks[:] = []
    tasks.append(request.json['task'])
    return jsonify({'tasks': tasks})

@app.route('/task', methods=['DELETE'])
def deleteTask():
    tasks[:] = []
    return jsonify({'tasks': tasks})

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

以上示例运行后,需要模拟不同请求方式,建议使用 Postman 等工具。

P.S 有关请求参数:在 Flask 中有一个 request 变量,这是一个请求上下文的变量,里面包含多个属性是可以用来获取请求参数的,例如上例中的request.json ,在此仅提下,有关 request 的更多使用方式请待后续示例。

本节的目标是让大家初步了解 Flask 是如何对 GET、POST、PUT 等不同的请求方式做处理的。

外部可访问的服务器 & 调试模式

最后,简单说下外部访问服务器配置以及调试模式。

如果你禁用了 debug 或信任你所在网络的用户,你可以简单修改调用 run() 的方法使你的服务器公开可用,如下:

app.run(host='0.0.0.0')

这会让操作系统监听所有公网 IP。

有两种途径来启用调试模式。一种是直接在应用对象上设置:

app.debug = True
app.run()

另一种是作为 run 方法的一个参数传入:

app.run(debug=True)

两种方法的效果完全相同。

注意:尽管交互式调试器在允许 fork 的环境中无法正常使用(也即在生产服务器上正常使用几乎是不可能的),但它依然允许执行任意代码。这使它成为一个巨大的安全隐患,因此它 绝对不能用于生产环境

示例演示

个人原因,IDE 用 VSCode(由于需要写 vue,故前后端开发统一用 VSCode);调试用的是 Postman

以下为动图示例,由于是开篇章节,会比较小白些,后续章节将不再演示。

01_HelloWorld.py

1.确认环境;2.本地运行;3.测试请求;

flask_study_01

02_Rest_Jsonify.py

更改返回体为 Json 格式;

flask_study_02

03_Rest_Router.py

动态路由的使用;Debug 模式下的报错信息显示;

flask_study_03

04_Rest_Methods.py

多种请求方式的使用;代码运行后测试演示;

flask_study_04

共收到 1 条回复 时间 点赞

图都挂了……

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册