目录

前文列表

用 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 来写个轻博客 (34) — 使用 Flask-RESTful 来构建 RESTful API 之三的更多相关文章

  1. 用 Flask 来写个轻博客

    用 Flask 来写个轻博客 用 Flask 来写个轻博客 (1) — 创建项目 用 Flask 来写个轻博客 (2) — Hello World! 用 Flask 来写个轻博客 (3) — (M)V ...

  2. 用 Flask 来写个轻博客 (37) — 在 Github 上为第一阶段的版本打 Tag

    Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 第一阶段结语 打 Tag 前文列表 用 Flask 来写个轻博客 (1 ...

  3. 用 Flask 来写个轻博客 (36) — 使用 Flask-RESTful 来构建 RESTful API 之五

    目录 目录 前文列表 PUT 请求 DELETE 请求 测试 对一条已经存在的 posts 记录进行 update 操作 删除一条记录 前文列表 用 Flask 来写个轻博客 (1) - 创建项目 用 ...

  4. 用 Flask 来写个轻博客 (35) — 使用 Flask-RESTful 来构建 RESTful API 之四

    Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 POST 请求 身份认证 测试 前文列表 用 Flask 来写个轻博客 ...

  5. 用 Flask 来写个轻博客 (33) — 使用 Flask-RESTful 来构建 RESTful API 之二

    Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 扩展阅读 构建 RESTful Flask API 定义资源路由 格式 ...

  6. 用 Flask 来写个轻博客 (32) — 使用 Flask-RESTful 来构建 RESTful API 之一

    目录 目录 前文列表 扩展阅读 RESTful API REST 原则 无状态原则 面向资源 RESTful API 的优势 REST 约束 前文列表 用 Flask 来写个轻博客 (1) - 创建项 ...

  7. 用 Flask 来写个轻博客 (31) — 使用 Flask-Admin 实现 FileSystem 管理

    Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 扩展阅读 编写 FileSystem Admin 页面 Flask-A ...

  8. 用 Flask 来写个轻博客 (30) — 使用 Flask-Admin 增强文章管理功能

    Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 扩展阅读 实现文章管理功能 实现效果 前文列表 用 Flask 来写个 ...

  9. 用 Flask 来写个轻博客 (29) — 使用 Flask-Admin 实现后台管理 SQLAlchemy

    目录 目录 前文列表 扩展阅读 Flask-Admin BaseView 基础管理页面 ModelView 实现效果 前文列表 用 Flask 来写个轻博客 (1) - 创建项目 用 Flask 来写 ...

随机推荐

  1. nodejs基础-nvm和npm

    nvm npm 更新 npm install npm@latest -g 本地安装 npm install 包名称 require(”包名“) 全局安装 npm install 包名 -g 可以直接作 ...

  2. JAVA中JavaBean对象之间属性拷贝的方法

    JAVA中JavaBean对象之间的拷贝通常是用get/set方法,但如果你有两个属性相同的JavaBean或有大部分属性相同的JavaBean,对于这种情况,可以采用以下几个简便方法处理. 下面对这 ...

  3. spring-第十四篇之资源访问Resource接口

    1.Resource接口提供的主要方法 1>getInputStream():定位并打开资源,返回资源对应的输入流.每次调用都返回新的输入流.调用者必须负责关闭输入流. 2>isOpen( ...

  4. python之从文件中按行读取数据

    #!/usr/bin/env python3 # -*- coding: utf-8 -*- __author__ = 'jiangwenwen' # 从文件中按行读取数据 file = open(& ...

  5. Struts2之下载

    下载页面 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEnco ...

  6. Android关于Activity生命周期详解

    子曰:溫故而知新,可以為師矣.<論語> 学习技术也一样,对于技术文档或者经典的技术书籍来说,指望看一遍就完全掌握,那基本不大可能,所以我们需要经常回过头再仔细研读几遍,以领悟到作者的思想精 ...

  7. Mac下安装nodejs,然后安装Vue-devtools工具

    一.安装nodejs 1.这一步简单,只要上官网下载下来,直接按照提示安装就可以,mac版本的安装方法很简单. 下载nodejs的官方网址是:  nodejs.org    ,浏览器输入就可以跳转到了 ...

  8. day65--mysql数据库--索引、慢日志、分页

    ---恢复内容开始--- 一.索引 (一)介绍: 数据库中专门用于帮助用户快速查找数据的一种数据结构.类似于字典中的目录,查找字典内容时可以根据目录查找到数据的存放位置吗,然后直接获取. (二)作用: ...

  9. smbspool - 将一个打印文件发送到一台SMB打印机

    总览 SYNOPSIS smbspool {job} {user} {title} {copies} {options} [filename] 描述 DESCRIPTION 此程序是Samba(7)套 ...

  10. vue,一路走来(15)--简单投票系统

    今天记录一下简单的投票系统,主要实现选中至少五张作品,并提交投票. 思路:选中作品,将作品id存入到数组里. 取消投票,则从数组中移除该作品id. 如图效果: <li v-for="( ...