开发者社区> 云物互联> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

用 Flask 来写个轻博客 (34) — 使用 Flask-RESTful 来构建 RESTful API 之三

简介: 目录 目录 前文列表 应用请求中的参数实现 API 分页 测试 前文列表 用 Flask 来写个轻博客 (1) — 创建项目 用 Flask 来写个轻博客 (2) — Hello World! 用 Flask 来写个轻博客 (3) — (M)VC_连接 M...
+关注继续查看

目录

前文列表

用 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 reqparse

post_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 post
        else:
            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 来写个轻博客 (36) — 使用 Flask-RESTful 来构建 RESTful API 之五
目录 目录 前文列表 PUT 请求 DELETE 请求 测试 对一条已经存在的 posts 记录进行 update 操作 删除一条记录 前文列表 用 Flask 来写个轻博客 (1) — 创建项目 用 Flask 来写个轻博客 (2) — Hel...
1107 0
用 Flask 来写个轻博客 (35) — 使用 Flask-RESTful 来构建 RESTful API 之四
目录 目录 前文列表 POST 请求 身份认证 测试 前文列表 用 Flask 来写个轻博客 (1) — 创建项目 用 Flask 来写个轻博客 (2) — Hello World! 用 Flask 来写个轻博客 (3) — (M)VC_连接 MySQ...
1737 0
用 Flask 来写个轻博客 (33) — 使用 Flask-RESTful 来构建 RESTful API 之二
目录 目录 前文列表 扩展阅读 构建 RESTful Flask API 定义资源路由 格式化输出 前文列表 用 Flask 来写个轻博客 (1) — 创建项目 用 Flask 来写个轻博客 (2) — Hello World! 用 Flask ...
1488 0
用 Flask 来写个轻博客 (32) — 使用 Flask-RESTful 来构建 RESTful API 之一
目录 目录 前文列表 扩展阅读 RESTful API REST 原则 无状态原则 面向资源 RESTful API 的优势 REST 约束 前文列表 用 Flask 来写个轻博客 (1) — 创建项目 用 Flask 来写个轻博客 (2) — He...
1323 0
Python web 框架 Flask 入门 macOS 下实践记录
Flask是一个使用 Python 编写的轻量级 Web 应用框架。其 WSGI 工具箱采用 Werkzeug ,模板引擎则使用 Jinja2 ,使用 BSD 授权。Flask也被称为 “microframework” ,因为它使用简单的核心,用 extension 增加其他功能。
644 0
+关注
云物互联
OpenStack Developer, Opensource Lover :- )
文章
问答
文章排行榜
最热
最新
相关电子书
更多
React Native项目实战优化之路
立即下载
API 平台的安全实践
立即下载
阿里云 API 精选手册(Alibaba Cloud API Playbook)
立即下载