首页 文章 精选 留言 我的

精选列表

搜索[个人博客],共10000篇文章
优秀的个人博客,低调大师

[雪峰磁针石博客]使用python3和flask构建RESTful API(接口测试服务)

引言 构建RESTful API貌似是开发的工作,和测试有和关系? 其实测试开发需要构建RESTful API的场景很多。比如测试Android应用,一般的接口测试只考虑了服务器端,至于客户端在网络异常或者服务端异常时如何反应,多数天朝的测试人员是没有考虑到的。客户端在对这些异常处理不够充分的时候,会出现崩溃等各种莫名其妙的问题。 为此一些走在前沿的测试人员会自己写一些RESTful API, 把服务端的域名劫持到自己的API,故意返回各种异常,看客户端的稳定性。 另外测试开发的测试工具需要和其他系统对接等场景也经常需要API。 参考资料 本文源码地址 本文相关书籍下载 讨论 钉钉免费群21745728 qq群144081101 567351477 本文涉及的python测试开发库 谢谢点赞! How to Build RESTful APIs with Python and Flask 术语 REST: REpresentational State Transfer 目标 GET - /api/Category - Retrieve all categories POST - /api/Category - Add a new category PUT - /api/Category - Update a category DELETE - /api/Category - Delete a category GET - /api/Comment - Retrieve all the stored comments POST - /api/Comment - Add new comment 要求 python3.* PostgreSQL 工程目录 #!python project/ ├── app.py ├── config.py ├── migrate.py ├── Model.py ├── requirements.txt ├── resources │ └── Hello.py │ └── Comment.py │ └── Category.py └── run.py requirements.txt的内容如下: #!python flask flask_restful flask_script flask_migrate marshmallow flask_sqlalchemy flask_marshmallow marshmallow-sqlalchemy psycopg2 flask - Python的微框架 flask_restful - 这是Flask的扩展,可快速构建REST API。 flask_script - 提供了在Flask中编写外部脚本的支持。 flask_migrate - 使用Alembic的Flask应用进行SQLAlchemy数据库迁移。 marshmallow - ORM/ODM/框架无关的库,用于复杂数据类型(如对象)和Python数据类型转换。 flask_sqlalchemy - Flask扩展,增加了对SQLAlchemy的支持。 flask_marshmallow - 这是Flask和marshmallow的中间层。 marshmallow-sqlalchemy - 这是sqlalchemy和marshmallow的中间层。 psycopg - Python的PostgreSQL API。 安装依赖 #!python # pip3 install -r requirements.txt 安装配置PostgreSQL 这里以 Ubuntu 16.04为例: #!python # sudo apt-get update && sudo apt-get upgrade # apt-get install postgresql postgresql-contrib # su - postgres $ createdb api $ createuser andrew --pwprompt #创建用户 $ psql -d api -c "ALTER USER andrew WITH PASSWORD 'api';" 参考资料: How to Install PostgreSQL on Ubuntu 16.04 How To Install and Use PostgreSQL on Ubuntu 14.04 配置 #!python # -*- coding: utf-8 -*- # Author: xurongzhong#126.com wechat:pythontesting qq:37391319 # CreateDate: 2018-1-10 from flask import Blueprint from flask_restful import Api from resources.Hello import Hello from resources.Category import CategoryResource from resources.Comment import CommentResource api_bp = Blueprint('api', __name__) api = Api(api_bp) # Routes api.add_resource(Hello, '/Hello') api.add_resource(CategoryResource, '/Category') api.add_resource(CommentResource, '/Comment') 快速入门 app.py #!python from flask import Blueprint from flask_restful import Api from resources.Hello import Hello api_bp = Blueprint('api', __name__) api = Api(api_bp) # Route api.add_resource(Hello, '/Hello') resource/Hello.py #!python #!/usr/bin/python # -*- coding: utf-8 -*- # Author: xurongzhong#126.com wechat:pythontesting qq:37391319 # CreateDate: 2018-1-10 from flask_restful import Resource class Hello(Resource): def get(self): return {"message": "Hello, World!"} def post(self): return {"message": "Hello, World!"} run.py #!python from flask import Flask def create_app(config_filename): app = Flask(__name__) app.config.from_object(config_filename) from app import api_bp app.register_blueprint(api_bp, url_prefix='/api') return app if __name__ == "__main__": app = create_app("config") app.run(debug=True) 启动服务 #!python $ python3 run.py * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit) * Restarting with stat * Debugger is active! * Debugger PIN: 136-695-873 用浏览器访问: http://127.0.0.1:5000/api/Hello #!python { "hello": "world" } 接入数据库 #!python from flask import Flask from marshmallow import Schema, fields, pre_load, validate from flask_marshmallow import Marshmallow from flask_sqlalchemy import SQLAlchemy ma = Marshmallow() db = SQLAlchemy() class Comment(db.Model): __tablename__ = 'comments' id = db.Column(db.Integer, primary_key=True) comment = db.Column(db.String(250), nullable=False) creation_date = db.Column(db.TIMESTAMP, server_default=db.func.current_timestamp(), nullable=False) category_id = db.Column(db.Integer, db.ForeignKey('categories.id', ondelete='CASCADE'), nullable=False) category = db.relationship('Category', backref=db.backref('comments', lazy='dynamic' )) def __init__(self, comment, category_id): self.comment = comment self.category_id = category_id class Category(db.Model): __tablename__ = 'categories' id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(150), unique=True, nullable=False) def __init__(self, name): self.name = name class CategorySchema(ma.Schema): id = fields.Integer() name = fields.String(required=True) class CommentSchema(ma.Schema): id = fields.Integer(dump_only=True) category_id = fields.Integer(required=True) comment = fields.String(required=True, validate=validate.Length(1)) creation_date = fields.DateTime() migrate.py #!python from flask_script import Manager from flask_migrate import Migrate, MigrateCommand from Model import db from run import create_app app = create_app('config') migrate = Migrate(app, db) manager = Manager(app) manager.add_command('db', MigrateCommand) if __name__ == '__main__': manager.run() 数据迁移 #!python $ python3 migrate.py db init $ python3 migrate.py db migrate $ python migrate.py db upgrade 修改Category.py 和Comment.py, 完整代码 测试 可以使用curl,比如: #!python curl http://127.0.0.1:5000/api/Category --data '{"name":"test5","id":5}' -H "Content-Type: application/json" 也可以在chrome中使用postman: how_to_build_restful_apis_using_flask_creating_categories.png how_to_build_restful_apis_using_flask_listing_categories.png how_to_build_restful_apis_using_flask_creating_comment.png how_to_build_restful_apis_in_flask_listing_comments.png

优秀的个人博客,低调大师

个人反思:当初第一站的选择是对是错

突然想起一件事想展开探讨一番——当初第一站去华为是对是错 华为给每一个招聘的人都会进行一个性格测试 具有一票否决权 如果过不了肯定不会招进去 他的性格测试还是有一定道理的 他知道那些人适合进去 那些人进去后会两败俱伤:取得不了高绩效,自己也很痛苦 华为看清楚适合自己的人都是有一些共同特点的 或者至少他知道那些人不适合自己 所以他加了这么一个机制 事实证明这个还是有道理的 且有未卜先知的意思 我自己的性格一般来讲是过不去的 但我还是进去了 最终离职的时候确诊焦虑症 > 我想问的是,这个决定对我来讲是对是错呢? 如果对,那我那些惊恐发作激化怎么说 他们肯定不是愉悦的体验 如果错,那我当时还能怎么选? 我当时手上只有之江实验室、高校博士后、华为 博士后算了,想想就知道下场会更惨:钱赚不到,惊恐发作更频繁 之江实验室 从现在看也坑了,大批在裁员,当然可能会很舒服待着 毕竟考核压力小 但基本上是一些务虚的东西 收入也就那 只能说看机缘 如果在里面能够遇到后来爆发的集成电路还好 否则就难料了 所以似乎没有对和错 似乎都是错的 为什么难以评判对错呢 因为对错看起来只有一个维度 实际上是一个复合问题 什么是对呢? 能够快乐的赚钱? 如果能够快乐,又能够赚钱,应该是对的工作吧 附带讲,为什么我会执着于讨论清楚对错了 因为这种模式最轻松,没有记忆负担 每当我做一个决定 我最自然的就是问是对是错 然后去评判 如果我能判断出来 这件事情就没有耗费我很多精力 所以我觉得看对错不是一件需要摒弃的习惯 还是继续沿着这条路看看怎么能够走通 条条大路通罗马嘛 回到主题。 我们讨论到 对=能够快乐的赚钱 我们意识到对和错没法直接衡量 于是我把它拆了 对=快乐+赚钱 这看起来可执行性就高了 就看两方面 能不能赚钱? 能才是好的工作 不能就是坏的 能不能保持快乐? 不快乐很难是好的工作 但这里其实还有个问题 快乐似乎也不是一个元问题 似乎没法直接衡量 比如你想想 什么样的工作是快乐的呢 钱很少会快乐吗? 事情多会快乐吗? 狼性文化会快乐吗? 没有成长性干了几年没法提升简历导致越来越难拿到后面的工作快乐吗? 所以你看快乐他是一个复合的标准 很难直接评判 怎么办呢 那就一个一个列出来吧 首先做的事情我感兴趣,或者至少不讨厌:我们叫兴趣 其次难度不能太大,但是又不能太容易:能力匹配 然后报酬要有吸引力:我们叫报酬 最后如果可以,要有前景,不能35岁就被退休了,不能让我有中年危机:暂且叫能力增值 OKOK,现在我们来盘点一下,这个所谓的“对”到底要包含哪些因素 能赚钱 感兴趣 能力匹配 能力增值 > 他们似乎是缺一不可的,不信我们一个一个排除 感兴趣、能力匹配、能力增值+报酬很低,你喜欢吗? 感觉像是学生 能赚钱、能力匹配、能力增值+不感兴趣,你喜欢吗? 这就是打工 感兴趣、能赚钱、能力增值+特别难,你喜欢吗? 很痛苦 能赚钱、感兴趣、能力匹配+难以持久,你喜欢吗? 很短暂 所以你看,求职本质上是一个多目标问题 所谓对的工作,底层需要满足四个必选项才可以 回到开头,那几个选项是多还是错呢 我会说让我打分吧 华为: 能赚钱 8.5 感兴趣 6.5 能力匹配 7 持久性 7.5 平均7.4 似乎跟我的感觉不太符合 不行,还得加一个标准:氛围舒服 氛围:5 平均:7 结果还是出乎我的预料的,没想到高达7,不行,不应该是这个: 我不管:4,不能再多了 之江呢: 能赚钱:6.5 感兴趣:7.5 能力匹配:8.5 吃就行:6 氛围:7 平均:7.1 高校呢 能赚钱:5 感兴趣:5 能力匹配:4 持久性:8 氛围:7 平均:5.8 所以你看: 华为4分 之江7分 高校5.8分 符合我当时的判断,因为我当时内心最想去的是之江 但迫于生活压力,买房嘛,选了华为 因为生计去了一个4分的地方,注定不会快乐 可能谋生本来就是难以快乐的吧 刚出校园,总是要先立足,快乐在这个阶段也许本身优先级就要往后排

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册