用 Flask 来写个轻博客 (34) — 使用 Flask-RESTful 来构建 RESTful API 之三
Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog
目录
- 目录
- 前文列表
- 应用请求中的参数实现 API 分页
- 测试
前文列表
用 Flask 来写个轻博客 (1) — 创建项目
用 Flask 来写个轻博客 (2) — Hello World!
用 Flask 来写个轻博客 (3) — (M)VC_连接 MySQL 和 SQLAlchemy
用 Flask 来写个轻博客 (4) — (M)VC_创建数据模型和表
用 Flask 来写个轻博客 (5) — (M)VC_SQLAlchemy 的 CRUD 详解
用 Flask 来写个轻博客 (6) — (M)VC_models 的关系(one to many)
用 Flask 来写个轻博客 (7) — (M)VC_models 的关系(many to many)
用 Flask 来写个轻博客 (8) — (M)VC_Alembic 管理数据库结构的升级和降级
用 Flask 来写个轻博客 (9) — M(V)C_Jinja 语法基础快速概览
用 Flask 来写个轻博客 (10) — M(V)C_Jinja 常用过滤器与 Flask 特殊变量及方法
用 Flask 来写个轻博客 (11) — M(V)C_创建视图函数
用 Flask 来写个轻博客 (12) — M(V)C_编写和继承 Jinja 模板
用 Flask 来写个轻博客 (13) — M(V)C_WTForms 服务端表单检验
用 Flask 来写个轻博客 (14) — M(V)C_实现项目首页的模板
用 Flask 来写个轻博客 (15) — M(V)C_实现博文页面评论表单
用 Flask 来写个轻博客 (16) — MV(C)_Flask Blueprint 蓝图
用 Flask 来写个轻博客 (17) — MV(C)_应用蓝图来重构项目
用 Flask 来写个轻博客 (18) — 使用工厂模式来生成应用对象
用 Flask 来写个轻博客 (19) — 以 Bcrypt 密文存储账户信息与实现用户登陆表单
用 Flask 来写个轻博客 (20) — 实现注册表单与应用 reCAPTCHA 来实现验证码
用 Flask 来写个轻博客 (21) — 结合 reCAPTCHA 验证码实现用户注册与登录
用 Flask 来写个轻博客 (22) — 实现博客文章的添加和编辑页面
用 Flask 来写个轻博客 (23) — 应用 OAuth 来实现 Facebook 第三方登录
用 Flask 来写个轻博客 (24) — 使用 Flask-Login 来保护应用安全
用 Flask 来写个轻博客 (25) — 使用 Flask-Principal 实现角色权限功能
用 Flask 来写个轻博客 (26) — 使用 Flask-Celery-Helper 实现异步任务
用 Flask 来写个轻博客 (27) — 使用 Flask-Cache 实现网页缓存加速
用 Flask 来写个轻博客 (29) — 使用 Flask-Admin 实现后台管理 SQLAlchemy
用 Flask 来写个轻博客 (30) — 使用 Flask-Admin 增强文章管理功能
用 Flask 来写个轻博客 (31) — 使用 Flask-Admin 实现 FileSystem 管理
用 Flask 来写个轻博客 (32) — 使用 Flask-RESTful 来构建 RESTful API 之一
用 Flask 来写个轻博客 (33) — 使用 Flask-RESTful 来构建 RESTful API 之二
应用请求中的参数实现 API 分页
API 也需要实现分页功能, 以此降低 API 对数据库的压力.
Flask-RESTful 提供了一种叫做解析器的功能, 用于查找和解析请求中所携带的参数. 而且还可以规定必备的参数和类型.
- 实现解析器模块
vim jmilkfansblog/controllers/flask_restful/parsers.py
from flask.ext.restful import reqparsepost_get_parser = reqparse.RequestParser()post_get_parser.add_argument('page',type=int,location=['json', 'args', 'headers'],required=False)post_get_parser.add_argument('user',type=str,location=['json', 'args', 'headers'])
NOTE 1: 命名规则为 resourceName_functionName_parser
NOTE 2: add_argument() 函数的参数列表:
(1). page
定义参数名称
(2). type=int
定义参数类型
(3). location=['json', 'args', 'headers']
搜索参数的位置列表
(4). required=False
是否为必须的参数
除此之外, 还能够定义非常多的关键字参数, 具体请参照官方文档.
NOTE 3: 可以定义多个参数
- 应用自定义的解析器
直接应用到资源类的实例方法中
vim jmilkfansblog/controllers/flask_restful/posts.py
from jmilkfansblog.models import db, User, Post, Tag
from jmilkfansblog.controllers.flask_restful import parsers
from flask import abort...class PostApi(Resource):"""Restful API of posts resource."""@marshal_with(post_fields)def get(self, post_id=None):"""Can be execute when receive HTTP Method `GET`.Will be return the Dict object as post_fields."""if post_id:post = Post.query.filter_by(id=post_id).first()if not post:abort(404)return postelse:args = parsers.post_get_parser.parse_args()page = args['page'] or 1# Return the posts with user.if args['user']:user = User.query.filter_by(username=args['user']).first()if not user:abort(404)posts = user.posts.order_by(Post.publish_date.desc()).paginate(page, 30)# Return the posts.else:posts = Post.query.order_by(Post.publish_date.desc()).paginate(page, 30)return posts.items
分页的原理在之前的博文中已经介绍过了, 这里不在重复.
NOTE 1: 这里实现了解析器 reqparse 从 URL 参数或者 HTTP Header 中找到 user/page 参数, 并返回对应的 Model 分页对象.
测试
使用 curl 工具进行测试, 根据个人环境可能需要安装.
- 获取所有 posts
(env) jmilkfan@JmilkFan-Devstack:/opt/JmilkFan-s-Blog$ curl http://localhost:8089/api/posts
[{"author": "jmilkfan", "id": "29bab6a0-6a0f-48f1-a088-6c271cebe906", "publish_date": "2016-12-27T22:35:00", "tags": [{"id": "720ae67d-87ed-4b6e-8207-d8f1d7b6509e", "name": "Flask"}], "text": "222222\r\n", "title": "222222"}, {"author": "jmilkfan", "id": "1af8f334-c9ac-4eba-bdca-4dda597aba70", "publish_date": "2016-12-17T22:39:16", "tags": [{"id": "6e1e1f94-8076-430f-9597-097a68754ca8", "name": "Python"}], "text": "22222\r\n", "title": "333333333"}
]
- 获取单一 post
(env) jmilkfan@JmilkFan-Devstack:/opt/JmilkFan-s-Blog$ curl http://localhost:8089/api/posts/1af8f334-c9ac-4eba-bdca-4dda597aba70
{"author": "jmilkfan", "id": "1af8f334-c9ac-4eba-bdca-4dda597aba70", "publish_date": "2016-12-17T22:39:16", "tags": [{"id": "6e1e1f94-8076-430f-9597-097a68754ca8", "name": "Python"}], "text": "22222\r\n", "title": "333333333"
}
- 传入正确的参数
(env) jmilkfan@JmilkFan-Devstack:/opt/JmilkFan-s-Blog$ curl http://localhost:8089/api/posts?page=1
[{"author": "jmilkfan", "id": "29bab6a0-6a0f-48f1-a088-6c271cebe906", "publish_date": "2016-12-27T22:35:00", "tags": [{"id": "720ae67d-87ed-4b6e-8207-d8f1d7b6509e", "name": "Flask"}], "text": "222222\r\n", "title": "222222"}, {"author": "jmilkfan", "id": "1af8f334-c9ac-4eba-bdca-4dda597aba70", "publish_date": "2016-12-17T22:39:16", "tags": [{"id": "6e1e1f94-8076-430f-9597-097a68754ca8", "name": "Python"}], "text": "22222\r\n", "title": "333333333"}
]
- 传入错误的参数
(env) jmilkfan@JmilkFan-Devstack:/opt/JmilkFan-s-Blog$ curl http://localhost:8089/api/posts?user='aasdasdasd'
{"message": "The requested URL was not found on the server. If you entered the URL manually please check your spelling and try again. You have requested this URI [/api/posts] but did you mean /api/posts or /api/posts/<string:post_id> or /admin/post/ ?"
}
用 Flask 来写个轻博客 (34) — 使用 Flask-RESTful 来构建 RESTful API 之三相关推荐
- 用 Flask 来写个轻博客 (37) — 在 Github 上为第一阶段的版本打 Tag
Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 第一阶段结语 打 Tag 前文列表 用 Flask 来写个轻博客 (1 ...
- 用 Flask 来写个轻博客 (36) — 使用 Flask-RESTful 来构建 RESTful API 之五
Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 PUT 请求 DELETE 请求 测试 对一条已经存在的 posts ...
- 用 Flask 来写个轻博客 (35) — 使用 Flask-RESTful 来构建 RESTful API 之四
Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 POST 请求 身份认证 测试 前文列表 用 Flask 来写个轻博客 ...
- 用 Flask 来写个轻博客
用 Flask 来写个轻博客 用 Flask 来写个轻博客 (1) - 创建项目 用 Flask 来写个轻博客 (2) - Hello World! 用 Flask 来写个轻博客 (3) - (M ...
- 用 Flask 来写个轻博客 (33) — 使用 Flask-RESTful 来构建 RESTful API 之二
Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 扩展阅读 构建 RESTful Flask API 定义资源路由 格式 ...
- 用 Flask 来写个轻博客 (32) — 使用 Flask-RESTful 来构建 RESTful API 之一
Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 扩展阅读 RESTful API REST 原则 无状态原则 面向资源 ...
- 用 Flask 来写个轻博客 (31) — 使用 Flask-Admin 实现 FileSystem 管理
Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 扩展阅读 编写 FileSystem Admin 页面 Flask-A ...
- 用 Flask 来写个轻博客 (30) — 使用 Flask-Admin 增强文章管理功能
Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 扩展阅读 实现文章管理功能 实现效果 前文列表 用 Flask 来写个 ...
- 用 Flask 来写个轻博客 (29) — 使用 Flask-Admin 实现后台管理 SQLAlchemy
Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 扩展阅读 Flask-Admin BaseView 基础管理页面 Mo ...
最新文章
- 【财务思维课】固定资产是应该买呢还是租或是借呢?
- 干货下载 | 高效金融客户分析体系如何搭建?
- 前端面试题整理【转】
- 如何在 IDEA 启动多个 Spring Boot 工程实例
- 更简洁的方式修改Chrome的User Agent,轻松体验移动版网络
- 帆软报表插件开发之fine-decision中的AccessProvider扩展
- java.util.zip.ZipException:invalid distance distance too far back
- 核心银行系统 之一 历史与发展
- 【并联机构工作空间分析系列2】圆弧相交法 论文解读及matlab程序
- Could not resolve com.huawei.agconnect:agcp
- 关于每次请求都要执行两个,即经过重写FilterInvocationSecurityMetadataSource的getAttributes()方法
- 【英语:基础进阶_原著扩展阅读】J1.英文原著的选择和有效阅读方法
- 黄山自助旅行之注意事项
- ldb文件matlab,MongoDB v4.2.2 安装与配置及常规操作
- linux系统显示无法挂载,linux系统无法挂载U盘
- 条码打印机无法正常打印该如何解决
- python数据可视化之Matplotlib
- android 设置音效EQ
- ethz-asl Hand-Eye-Calibration 实验之hand_eye_calibration_batch_estimation模块
- 【C/C++】从API学习STL algorithm 001(for_each、find、find_if、find_end、find_first_of 快到碗里来(◕ᴗ◕✿)
热门文章
- 两台服务器安装redis集群_Redis Cluster搭建高可用Redis服务器集群
- c语言斐波那契数列_斐波那契数列之美
- win32api.keybd_event 怎么输入中文_6个输入法高效使用技巧,你知道几个?
- 查看TensorFlow的版本和路径
- linux下搭建python 机器学习环境
- 利用机器学习算法对实验室小鼠的睡眠阶段自动分类
- 英特尔挖走AMD首席独显架构师,曾是现任CEO基辛格老部下
- 马斯克要复活恐龙?乌龙还差不多
- 增强现实、语音合成、深度学习……这款有15年历史的产品,竟然藏了这么多技术...
- Node HTTP/2 Server Push 从了解到放弃