3.1 后端开发与Flask框架
本节主题:3.1 后端开发与Flask框架
课程讲师:Charlie
观看地址:点我进入
1 本节要点
- 了解后端开发的概念、作用及应用场景
- 重点掌握基于Flask框架的使用方式
2 课前准备
2.1 安装Flask框架
在cmd(Windows)或终端(Mac)输入:
pip install flask
#或
pip3 install flask
#或
pip3.8 install flask
3 课程内容
3.1 后端开发
3.1.1 后端开发概念
以简道云网页为例
前端:网页上的文字、图片、图标、点击后的交互效果、弹框等,所有这些东西都属于前端;
后端:服务器的运维管理、数据库的管理,以及用于连接前后端的接口(私有接口)。
- 私有接口:例如简道云 前后端协同开发所用的接口,仅在产品内部使用;
- 公共接口:把一些服务封装好供开发者使用,例如简道云的数据API、通讯录API。
3.1.2 简道云相关功能
API(公共接口),开发文档地址:https://hc.jiandaoyun.com/open/10992 后端 + API,开发者在后端发送请求(携带数据)触发简道云的服务
Webhook,开发文档地址:https://hc.jiandaoyun.com/open/11500 钩子,简道云事件触发推送数据到管理员指定的接口
前端事件,开发文档地址:https://hc.jiandaoyun.com/doc/11825 前端+API,用户在表单填报界面,通过事件触发调用管理员配置的接口来获取数据或触发事件
3.1.3 场景
通过前3节的学习,我们已经掌握了接口调用能力:
- 如何通过POSTMAN去调用接口
- 如何通过Python处理数据
- 如何通过Python封装函数调用接口
通过后端开发,我们可以自己开发接口,编写服务,更加自由地去使用数据!
- 如何在本地编写接口
- 如何将接口部署至云服务器(ECS)
- 如何将数据备份至数据库以及从数据库取数
实现下面的场景:
- 简道云数据推送 - 数据处理(ECS)- 短信(第三方接口)
- 讲解:例如我们通过第3课的学习,学会了封装接口函数,那么我们封装一个发送短信的接口,当我们接收到数据推送后,即调用函数去发送短信!
- 简道云数据推送 - 数据处理(ECS)- 调用简道云API(相当于高级的智能助手)
- 简道云数据推送 - 数据处理(ECS)- OCR(第三方接口)- 数据处理(ECS)- 调用简道云API
- 简道云数据推送 - 数据处理(ECS)- Mysql(数据库)
- ASP定时框架(ECS) - 调用简道云API - 数据处理(ECS)- 钉钉群推送
- ASP定时框架(ECS) - 调用简道云API - 数据处理(ECS)- Mysql(数据库)
- 简道云前端事件 - 数据处理(ECS)- 分析数据(OCR)
- 简道云前端事件 - 数据处理(ECS)- 数据校验(身份证、姓名一致性校验)
- 简道云前端事件 - 数据处理(ECS)- 获取数据
- 简道云前端事件 - 数据处理(ECS)- Mysql取数 - 数据处理(ECS)- 获取数据 其他
API+Webhook应用实例(demo):
电话语音通知_Demo:点击查看
短信通知_Demo:点击查看
钉钉推送_Demo:点击查看
快递查询_Demo:点击查看
企业微信推送_Demo:点击查看
前端事件应用实例(demo)
增值税发票OCR识别_Demo:点击查看
身份证OCR识别_Demo:点击查看
数据库取数_Demo:点击查看
最新物流信息查询_Demo:点击查看
身份证姓名一致性校验_Demo:点击查看
3.2 Flask框架
Flask是由python实现的一个web微框架,让我们可以使用Python语言快速实现一个网站或Web服务。
3.2.1 一个最小化的Flask应用
注意:直接在IDLE运行Flask文件会出现 io.UnsupportedOperation: fileno 错误,双击.py文件运行即可解决这个问题!
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world(): #注意接收函数名不要重复
return 'Hello, World!'
if __name__ == '__main__':
app.run(host='0.0.0.0',port=3100)
我们一步步拆解来看:
- 首先我们导入了 Flask 包;
from flask import Flask
- 接着我们创建一个该类的实例。第一个参数是应用模块或者包的名称。如果你使用 一个单一模块(就像本例),那么应当使用__name__,因为名称会根据这个模块是按应用方式使用还是作为一个模块导入而发生变化(可能是__main__, 也可能是实际导入的名称)。这个参数是必需的,这样Flask才能知道在哪里可以找到模板和静态文件等东西;
app = Flask(__name__)
- 然后我们使用 route() 装饰器来告诉 Flask 触发函数的 URL ;
@app.route('/')
- 函数名称被用于生成相关联的 URL 。函数最后返回需要在用户浏览器中显示的信息;
def hello_world():
return 'Hello, World!'
- 缺省设置是运行服务器后,只有你自己的电脑可以使用服务,只监听 127.0.0.1。 所以要加上 --host=0.0.0.0 ,这行代码告诉你的操作系统监听所有公开的 IP,本节课我们只写本地接口,不加也是可以的 :
if __name__ == '__main__':
app.run(host='0.0.0.0',port=3100)
3.2.2 URL构成
域名(Host,这里我们在本地运行,使用本地机ip:127.0.0.1) + 端口 + 路径
端口:
if __name__ == '__main__':
app.run(host='0.0.0.0',port=3100)
路径:
@app.route('/route')
你也可以在一个端口下,定义多个路径(注意接收函数名不要重复):
from flask import Flask
app = Flask(__name__)
@app.route('/a')
def hello_world1(): #注意接收函数名不要重复
return 'Hello, World!'
@app.route('/b/')
def hello_world2(): #注意接收函数名不要重复
return 'Thank you'
if __name__ == '__main__':
app.run(host='0.0.0.0',port=3100)
3.2.3 接收数据
定义接口类型
@app.route('/',methods=['GET'])
@app.route('/',methods=['GET', 'POST'])
@app.route('/',methods=['POST'])
接收不同的数据
先要记得引入request模块
from flask import Flask,request
import json
- 接收URL params
request.args
request.args.get("canshu1")
- 接收Headers
request.headers
request.headers.get("xxx")
- 接收 multipart/form-data 或 application/x-www-from-urlencoded 格式的数据
request.form
request.form.get("xxx")
- 接收 application/json 格式的数据
request.data
json.loads(request.data)
from flask import Flask,request
import json
app = Flask(__name__)
@app.route('/',methods=['GET', 'POST'])
def hello_world():
print(request.args)
print(request.headers)
print(request.form)
print(request.data)
print(json.loads(request.data))
return 'success',200
if __name__ == '__main__':
app.run(host='0.0.0.0',port=3100)
3.2.4 返回数据
JSON 格式的响应是常见的,用 Flask 写这样的 API 是很容易上手的。
import json
import urllib.parse
# 返回文本
return 'Hello, World!'
# 返回Json格式的数据
a = json.dumps({"aaa":123})
return a
# 返回x-www-from-urlencoded格式的数据
return urllib.parse.urlencode({"aaa":123})
# 不需要返回数据,只需要返回状态码
return 'success',200
HTTP状态码点击查看
捕捉异常可以使用try/except语句。
try/except语句用来检测try语句块中的错误,从而让except语句捕获异常信息并处理。
如果你不想在异常发生时结束你的程序,只需在try里捕获它。
以下为简单的try…except…else的语法:
try:
<语句> #运行别的代码
except <名字>:
<语句> #如果在try部份引发了'name'异常
except <名字>,<数据>:
<语句> #如果引发了'name'异常,获得附加的数据
else:
<语句> #如果没有异常发生
在接口开发过程中,可以配合异常处理返回不同的状态码!
- 400 参数错误
Key | Value |
name | 姓名 |
age | 年龄 |
import json
request_data = {"name":"ziv"}
def response():
try:
name = request_data['name']
age = request_data['age']
except KeyError as e:
return '参数错误',400
else:
return 'success',200
- 401 Unauthorized 鉴权失败
if request.headers['x-jdy-signature'] != get_signature(nonce, payload, 'test-secret', timestamp):
return 'fail', 401
简道云webhook推送错误说明
接收到推送后需要返回给简道云2xx表示推送接收成功。其他的返回结果则为返回信息错误,用户可以根据HTTP状态码自行定义推送错误的情况给简道云的返回码,简道云接受后,可在推送日志中显示出。