前言
最近接到一个接收前端请求的需求,需要使用python编写,之前没有写过python,很多技术没有用过,在这里做一个学习记录,如有错误,请不了赐教。
Flask Api文档管理
使用Falsk Api可以实现 文档是代码生成的,而不是靠人工维护,如果代码有任何改动,文档也能自动更新。这是一件非常优雅的事,但是对很多文档来说这并不现实,但是对于Api文档来说,实现成本并不高。
Falsk-RestPlus
对于Api来说,Flask-RestPlus是一个优秀的Api文档生成工具,这个包将会替换Flask路由层的编写方式,通过自己的语法来规定Api细节,并生成Api文档。
安装
pip install flask-restplus
这是一个demo
使用Flask-RestPlus时,需要按照这个库的方式编写Api层,包括request的参数解析,以及response的返回格式,一个hello world级的demo:
1 from flask import Flask 2 from flask_restplus import Resource,Api 3 4 5 app = Flask(__name__) 6 api = Api(app,prefix="/v1",title="Users",description="Users curd api.") 7 8 @api.route("/users") 9 class UserApi(Source): 10 def get(self): 11 return ("user":"1") 12 13 if __name__=="__main__": 14 app.run()
效果图
实践
这里完成一个小小项目来实践和介绍Flask-RestPlus这个库,我们实现一个简单的图书馆订单系统,实现用户、图书和订单的CURD
Model
model可以理解为java中的实体类,大概就是用来描述一个实体的,里面定义了关于这个实体的一些信息。
这里的model和SQLAlchemy的model是不同的概念,这里是一种
用户model,包括id和username。而SQLAlchemy中的model则是用来描述数据库结构的。
1 from flask import Flask, Blueprint 2 from flask_restplus import Api, Resource, Namespace, fields 3 import uuid 4 import time 5 6 7 8 class User(object): 9 user_id = None 10 username = None 11 12 def __init__(self, username): 13 self.user_id = str(uuid.uuid4()) 14 self.username = username 15 16 17 class Book(object): 18 book_id = None 19 book_name = None 20 price = None 21 22 def __init__(self, book_name, book_price): 23 self.book_id = str(uuid.uuid4()) 24 self.book_name = book_name 25 self.price = book_price 26 27 28 class Order(object): 29 order_id = None 30 user_id = None 31 book_id = None 32 created_at = None 33 34 def __init__(self, user_id, book_id): 35 self.order_id = str(uuid.uuid4()) 36 self.user_id = user_id 37 self.book_id = book_id 38 self.created_at = int(time.time()) 39 40 # 蓝图实例 41 api_blueprint = Blueprint("api", __name__,url_prefix="/pages") 42 #api实例 43 api = Api(api_blueprint, version="1.0", description="THe Open Api Service") 44 # namespace实例 45 ns = Namespace("users", description="Users CURD api") 46 47 ns2 = Namespace("Order",description="Order CURD api") 48 # 将api实例添加到名字名字空间中 49 api.add_namespace(ns) 50 api.add_namespace(ns2) 51 52 app = Flask(__name__) 53 54 # 一定是最后app再向蓝图注册,不然会404 55 app.register_blueprint(api_blueprint) 56 57 # 定义model 58 user_model = ns.model("UserModel", { 59 "user_id": fields.String(readOnly=True, description="The user unique identifier"), 60 "username": fields.String(required=True, description="The user nickname") 61 }) 62 user_list_model = ns.model("UserListModel", { 63 "users": fields.List(fields.Nested(user_model)), 64 "total": fields.Integer 65 }) 66 67 order_model = ns2.model("OrderModel", { 68 "order_id": fields.String(readOnly=True,description="The oder unique identifier") 69 }) 70 71 order_list_model = ns2.model("OrderListModel",{ 72 "order": fields.List(fields.Nested(order_model)), 73 "total": fields.Integer 74 }) 75 76 77 @ns.route("/") 78 class UserListApi(Resource): 79 users = [User("HanMeiMei"), User("LiLei")] 80 81 @ns.doc("get_user_list") 82 @ns.marshal_with(user_list_model) 83 def get(self): 84 return{ 85 "users": self.users 86 } 87 88 @ns2.route("/") 89 class OrderApi(Resource): 90 91 orders = [Order(1111,22222),Order(33333,4444)] 92 93 @ns2.doc("get_order_list") 94 @ns2.marshal_with(order_list_model) 95 def get(self): 96 return{ 97 "order":self.orders 98 } 99 100 if __name__ == "__main__": 101 app.run(debug=True)