微信搜索【大奇测试开】,关注这个坚持分享测试开发干货的家伙。

本篇主要是对之前几次分享的阶阶段的总结,温故而知新,况且虽然看起来是一个小模块简单的增删改查操作,但其实涉及的内容点是非常的密集的,是非常基础的,也贯穿了整个流程,后续的模块开发操作在掌握这几篇基础上会很快速,如果你还没看过之前的内容,可以参照下边往期阅读进行学习,不过这不影响单纯你想看看如何用python Flask实现常用的Resufl API。

================    往期推荐      ==================

=============================================

Flask 一个python的web架构服务,实现前后端的开发,在本项目主要是使用它的 Resful API 实现能能力,虽说页面能力可以通过jinjia实现,但当今有更简单,好用的类似vue这样的开箱即用的开源框架,因此做到前后端分离,让它发挥好后端接口能力就好了,当然还有一些其他优秀的框架比如tornado、django、bootstrap等等,但基于接口和此项目flask更为合适。

现在就着分享项目来总结下Flask已经使用过的一些基础能力,以及再做一些扩展。

Flask程序入口

一个最小的 Flask 应用,也是程序代码的运行起点,文件名app.py

from flask import Flask

app = Flask(__name__)

@app.route("/api/sayHello/")
def hello_world():
return "Hello, TPM!" if __name__ == '__main__':
app.run()

这一小段代码最简单的实现了一个默认的GET请求接口 /api/sayHello,没有请求参数,返回的是一个“Hello,TPM”字符串。

  1. 首先是引入Flask类

  2. 然后创建了该类的一个实例,该实例将成为一个Web服务器网关接口( Python Web Server Gateway Interface,缩写为 WSGI )应用

  3. 使用 装饰器 route() 来告诉 Flask 触发函数 的 URL ,默认HTTP请求方法为GET类型

  4. 被修饰的方法实现返回一个字符串,默认返回 text/htm 类型

  5. Python程序的主方法,程序执行入口(次代码中省略也可以运行)

理解上边的代码后,开启一个终端,执行方法 $ flask run 启动应用,浏览器地址输入 http://127.0.0.1:5000/  即可看到返回的字符串 “Hello,TPM!”

app.run() 还涉及到几个参数,扩展介绍下,如果你使用类似PyCharmm开发工具,使用command + 鼠标左键 就可以点击跳转方法的实现,方法如下,如果英文好的可以直接官方解释。

def run(self, host=None, port=None, debug=None, load_dotenv=True, **options):

这里可以设置参数分别是host-指定IP,port-指定端口,debug-调试模式

  1. host设定

    默认的host为本地地址127.0.0.1 只能本地访问调试,如果局域网其他机器允许访问,就需要设置host=本机IP,或者host=0.0.0.0让其自行识别

  2. port设定

    默认port为5000端口,如果想用其他端口需要给定此参数如port=8082

  3. debug设定

    通过debug=True设定调试模式,这样每次有代码修改保存时程序会自动重新热加载,不需要每次重新启动。

一个简单的配置如下:

app.run(host="0.0.0.0", port=8082, debug=True)

这里需要特别注意的是,方法配置必须使用 python3 app.py 去启动程序,如果是用上述 flask run 命令或者PyCharm启动,方法里设置参数是无效的,需要通过指定参数 flask run --host=0.0.0.0 --port=8082 或者配置参数

Flask的路由和HTTP方法

路由顾名思义就是给定请求路径,在最小应用的例子中已经说过是通过route() 装饰器 设置URL,方法就是给定第一个字符串参数如“/api/project/select”,至于如何配置参数规则下边具体讲。

HTTP方法 在Flask框架实现【提测平台】接口项目中分别使用了GET、POST、Delete三种常用的请求方法,其实现在业界开发(不管什么语言)使用最频繁的时候GET/POST两种,基本解决所有操作。

定义接口的请求方法也很简单就是在路由内指定参数 methods=['方法']

@app.route("/api/product/search",methods=['GET'])
def product_search():
return "GET接口请求查询产品操作" @app.route("/api/product/create",methods=['POST'])
def product_create():
return "POST接口请求新增产品操作" @app.route("/api/product/delete", methods=['DELETE'])
def product_delete():
return "Delete接口请求新增产品操作"

这些代码加在最小程序app.py重新运行后(debug=True自动重新加载),用Postman分别用对应的方法请求,都会正常返回return中的给定的字符串内容,这里可以尝试下如果一个接口设定了POST类型,如果测试用其他类型,则会返回 405 Method Not Allowed 表示不被允许的请求方法。

我们注意到methods=[]是个数组,所以我们可以对一个api指定多种类型的,比如给定GET和POST这样客户端用对应哪种方法请求都会正常返回值。

@app.route("/api/product/list",methods=['GET','POST'])
def product_list():
return "我支持GET和POST两种"

Flask接口模块化

从上边的定义很多接口可以看到我们所有的定义都编写在主程序类里,这样对于稍微复杂的应用程序代码就会很臃肿,现在编程都都讲究各种模式或者分模块编程,那么教程项目中 blueprints (网络中文译为蓝图)就是这个作用,以上边的例子来优化,将所有/api/product/* 的接口全部抽出来放到一个product.py 文件中,并定义一个别名为app_product 蓝图。

from flask import Blueprint

app_product = Blueprint("app_product", __name__)

@app_product.route("/api/product/search",methods=['GET'])
def product_search():
return "GET接口请求查询产品操作" @app_product.route("/api/product/create",methods=['POST'])
def product_create():
return "POST接口请求新增产品操作" @app_product.route("/api/product/delete", methods=['DELETE'])
def product_delete():
return "Delete接口请求新增产品操作" @app_product.route("/api/product/list",methods=['GET','POST'])
def product_list():
return "我支持GET和POST两种"

接着就要在app.py 注册blueprint,保存自动运行

from flask import Flask
# 导入模块类
from apis.products import app_product app = Flask(__name__)
# 注册blueprint
app.register_blueprint(app_product) @app.route("/api/sayHello/")
def hello_world():
return "Hello, TPM!" if __name__ == '__main__':
app.run(host='0.0.0.0', port=8082, debug=True)

再次通过postman请求之前几个接口,一切正常,但看上去是不是清爽很多。

同样我们跳转blueprints.py源码查看 __init__ 方法还有不少参数,比如url_prefix="/api/product" 定义统一URL前缀,那么在 route 路径定义都可以去掉相同的前缀路径/api/product,这样更清爽了,至于其他参数后续涉及到再讲解,或者直接源代码。

Flask接口参数

本篇总结和扩展最后一个知识点,就是客户端传参和服务器获取参数的几种常见方式。

1)GET通过 request.args 获取params值,没有匹配的为None

from flask import request
@app_product.route("/api/product/search",methods=['GET'])
def product_search():
# 获取?后指定的title值,没有为None
title = request.args.get('title') return {'tilte':title}

运行请求测试如下:

2)POST通过 requext.form 获取form值,也可以用arg获取所有参数和指定参数,具体解释看代码注释

from flask import request

@app_product.route("/api/product/create",methods=['POST'])
def product_create():
# 获取?后指定title=的值,取不到默认为None
title = request.args.get('title')
# args 获取所有URL?后边的参数和值
args = request.args
print(args)
# 获取Post format格式的值(缺失会报错)
keyCode = request.form["keyCode"] return {'title': title, 'keyCode': keyCode}

运行请求测试如下:

3)POST通过 request.get_data() 获取json body参数,也通过request.json.get("key")获取body内指定关键词的值。

from flask import request
@app_product.route("/api/product/update",methods=['POST'])
def product_update():
# 获取body中某个值,取不到默认为None
keyCode = request.json.get('keyCodes')
print(keyCode) # 获取整个json字符串体
body = request.get_data()
print(type(body)) return body

运行请求测试如下:

这里在扩展一个可能用到了传参方式,路径的参数形式,并可以严格限制传递的类型,方式在route path 定义<类型:关键词>,然后通过方法同关键词参数获取。

@app.route('/api/project/remove/<int:project_id>',methods=['DELETE'])
def project_remove(project_id):
print(project_id)
return '我是从路径获取并且只接收int类型:{}'.format(project_id)

进行delete方法请求测试结果如下

跨域问题

项目是一个前后端分离的程序,由于 浏览器同源策略 会产生跨域问题,解决的办法是前端做路由转发,或者后端服务开启可跨域,之前在前后端互通的章节讲过,这里直接贴出代码。

flask_cors *

app = Flask(__name__)
CORS(app, supports_credentials=True)

至于什么是同源策略,可以参考给出的参考文档自行扩展阅读。

相信通过之前本篇总结,再加上之前几个实战分享,flask实现接口是不是如此简单啦,下一篇将对vue前端进行一个小结。

【参考&拓展】

Flask中文文档:https://dormousehole.readthedocs.io/en/latest/index.html

Flask英文API文档:https://flask.palletsprojects.com/en/2.0.x/api/

浏览器同源策略:https://developer.mozilla.org/zh-CN/docs/Web/Security/Same-origin_policy

原创不易,经过实践的总结分享更不易,如果你觉得有用,请点击推荐,也欢迎关注我博客园和微信公众号。

Python Flask API实现方法-测试开发【提测平台】阶段小结(一)的更多相关文章

  1. [Python] Flask从0到1开发轻量级网页

    概述 Flask采用MVT模型,即Model, Template, View Model:定义数据的存储格式,并且提供了数据库访问的API View:定义那些数据被显示,是业务逻辑处理模块 Templ ...

  2. python笔记带你走向测试开发之路-第一篇(数据类型之数字,序列)

    数字 数字的类型 数字是 Python中比较常用的数据类型,数字有可以分为: 整型 int如 1,2,3 浮点型 float如 2.1,3.5 长整型 long如 3L,需要注意的是 Python2. ...

  3. python flask API 返回状态码

    @app.route('/dailyupdate', methods = ['POST','GET'])def dailyUpdate(): try: db=MySQLdb.connect(" ...

  4. World Wind Java开发之九——阶段小结(转)

    http://blog.csdn.net/giser_whu/article/details/42785875 将近一个月没有更新了,一是因为项目的事情,二是期末考试复习,三是玩啦.上一篇博客搭建起了 ...

  5. Element Vue 开箱即用框架如何使用-测试开发【提测平台】阶段小结(二)

    微信搜索[大奇测试开],关注这个坚持分享测试开发干货的家伙. 上一篇总结了后端服务接口的开发,这篇我们主要来总结下前后端分离开发中的前端部分,主要是开箱即用的框架介绍和之前章节组件的梳理和部分的扩展内 ...

  6. 测试开发【提测平台】分享11-Python实现邮件发送的两种方法实践

    微信搜索[大奇测试开],关注这个坚持分享测试开发干货的家伙. 按照开发安排,本篇本应该是关于提测页面的搜索和显示实现,怕相似内容疲劳,这期改下内容顺序,将邮件服务的相关的提前,在之前的产品需求和原型中 ...

  7. 【python测试开发栈】—帮你总结Python os模块高频使用的方法

    Python中的os模块是主要和系统操作相关的模块,在平时的工作中会经常用到,花时间整理了os模块的高频使用方法,同时整理出使用时需要注意的点.归纳来讲,os模块的方法可以分为:目录操作.文件操作.路 ...

  8. 测试开发【提测平台】分享3-正式开发产品需求&项目初始化

    上两个分享主要是介绍和演示基本前后端所要使用的框架,接下来我们将正式进入到[提测平台的开发] 提要先给出依赖和内容点: 提测平台定义和产品原型需求说明 使用github创建代码仓库进行项目管理 Fla ...

  9. 测试开发【提测平台】分享10-Element UI抽屉和表单校验&增改接口合并实现应用管理

    微信搜索[大奇测试开],关注这个坚持分享测试开发干货的家伙. 开篇说个小讨论,一个群里聊天聊到关于更新篇章的长度,是小篇幅多次,还是每次按照一个小完整的功能,我个人的是按照后种来的,主要的思考就是希望 ...

随机推荐

  1. 13 shell while循环与until循环

    while 循环是 Shell 脚本中最简单的一种循环,当条件满足时,while 重复地执行一组语句,当条件不满足时,就退出 while 循环. unti 循环和 while 循环恰好相反,当判断条件 ...

  2. Redis 高级面试题

    Redis 持久化机制 Redis 是一个支持持久化的内存数据库,通过持久化机制把内存中的数据同步到硬盘文件来 保证数据持久化.当 Redis 重启后通过把硬盘文件重新加载到内存,就能达到恢复数据的目 ...

  3. Docker原理:Namespace

    目录 Namespace UTS Namespae PID Namespace Mount Namespace User Namespace Network Namespace 参考 Namespac ...

  4. Min25 筛与 Powerful Numbers

    Min25 筛与 Powerful Numbers Min25 筛 大喊一声 Min25 NB!!! 这是一个非常神奇的东西,用于求更加普遍的积性函数的前缀和. 比如我们要求 \(\sum_{i=1} ...

  5. 选择适合入门的自动化测试框架TestNG 基于Java语言的入门选择之一

    对于测试工程师新手来说,最痛苦的莫过于入门,其实只要入门3个月左右,对于自动化测试,所有的测试工程师除了喜爱,就是更爱.自动化测试工作,是从根本上解放人性,不用重复去完成鼠标的点点点,例如以下测试常常 ...

  6. python 得到变量名的结果为名的变量的值locals()

    >>> a="1">>> b="a">>> print(a,b)1 a>>> print ...

  7. c语言:scanf(" %c",&bla); scanf("%c",&bla); 语句差别

    %前有空格,%没有空格 scanf("%c",&c) 与 scanf(" %c",&c),后者只是在%前多了个空格,似乎没有什么区别,但使用起来 ...

  8. python 得到字典的所有键 和值

    a={} a={"a":1,"b":2,"c":3,"d":4} print(a) print(a.items()) p ...

  9. 【记录】如何造一个vite插件(1)

    在看文章前,先做个定位,这不是一篇纯粹的技术性文章,可以把它理解成一个叙述文章,记录我开发插件的过程. 开始前简单的吹个牛 vue2 也写了很多年了,多人合作始终避不开用到别人的组件.关键是有些组件没 ...

  10. JDK安装与环境搭建.

    卸载JDK 1.删除Java安装目录 2.删除Java Home 3.删除path下Java的目录 4.打开cmd命令输入java-version 出现''不是内部或外部命令,也不是可运行的程序 或批 ...