Flask-RESTful 快速入门

hello world

from flask import Flask
from flask_restful import Resource, Api app = Flask(__name__)
api = Api(app) class HelloWorld(Resource):
def get(self):
return {'hello': 'world'} api.add_resource(HelloWorld, '/') if __name__ == '__main__':
app.run(debug=True)

资源

资源 (Resource) 是 Flask-RESTful 中最主要的概念. 资源就是 Flask pluggable views 的子类, 因此可以很容易的定义 HTTP 方法. 一个简单的 CRUD 程序看起来如下:

from flask import Flask, request
from flask_restful import Resource, Api app = Flask(__name__)
api = Api(app) todos = {} class TodoSimple(Resource):
def get(self, todo_id):
return {todo_id: todos[todo_id]} def put(self, todo_id):
todos[todo_id] = request.form['data']
return {todo_id: todos[todo_id]} // 将 TodoSimple 挂载在 '/<string:todo_id>' 路由上
api.add_resource(TodoSimple, '/<string:todo_id>') if __name__ == '__main__':
app.run(debug=True)

Flask-RESTful 能够处理各种类型返回值, 将其转换成合适的响应.

class Todo1(Resource):
def get(self):
# 默认 HTTP Status Code 为 200
return {'task': 'Hello world'} class Todo2(Resource):
def get(self):
# 设置 HTTP Status Code 为 201
return {'task': 'Hello world'}, 201 class Todo3(Resource):
def get(self):
# 设置 HTTP Status Code 为 201 并返回自定义 headers
return {'task': 'Hello world'}, 201, {'Etag': 'some-opaque-string'}

Endpoints

一个资源可以挂载在多个路由上:

api.add_resource(HelloWorld,
'/',
'/hello')

可以将路由作为参数

api.add_resource(Todo,
'/todo/<int:todo_id>', endpoint='todo_ep')

参数解析

虽然 Flask 提供了简单的方法访问请求数据, 但是对于表单数据处理还是很痛苦. Flask-RESTful 提供了 reqparse 一种类似 argparse 参数解析机制以简化参数处理.

from flask_restful import reqparse

parser = reqparse.RequestParser()
parser.add_argument('rate', type=int, help='Rate to charge for this resource')
// strict 如果提供未定义的参数, 那么就抛出异常
args = parser.parse_args(strict=True)

数据格式化

Flask 能很好的处理 Python 内置的数据结构, Flask-RESTful 提供了处理自定义对象的 fields 模块和 marshal_with() 方法

from collections import OrderedDict
from flask_restful import fields, marshal_with resource_fields = {
'task': fields.String,
'uri': fields.Url('todo_ep')
} class TodoDao(object):
def __init__(self, todo_id, task):
self.todo_id = todo_id
self.task = task # This field will not be sent in the response
self.status = 'active' class Todo(Resource):
@marshal_with(resource_fields)
def get(self, **kwargs):
return TodoDao(todo_id='my_todo', task='Remember the milk')

上例中 get 返回一个 TodoDao 对象, 使用 marshal_with 装饰器根据 resource_fields 序列化这个对象. 这里只有一个字段被序列化, 就是 task.

总结

Flask-RESTful 的使用基本上就是用 reqparse 处理请求, 使用 fields 来处理返回值, 输出响应.

完整的例子

from flask import Flask
from flask_restful import reqparse, abort, Api, Resource app = Flask(__name__)
api = Api(app) TODOS = {
'todo1': {'task': 'build an API'},
'todo2': {'task': '?????'},
'todo3': {'task': 'profit!'},
} def abort_if_todo_doesnt_exist(todo_id):
if todo_id not in TODOS:
abort(404, message="Todo {} doesn't exist".format(todo_id)) parser = reqparse.RequestParser()
parser.add_argument('task') # Todo
# shows a single todo item and lets you delete a todo item
class Todo(Resource):
def get(self, todo_id):
abort_if_todo_doesnt_exist(todo_id)
return TODOS[todo_id] def delete(self, todo_id):
abort_if_todo_doesnt_exist(todo_id)
del TODOS[todo_id]
return '', 204 def put(self, todo_id):
args = parser.parse_args()
task = {'task': args['task']}
TODOS[todo_id] = task
return task, 201 # TodoList
# shows a list of all todos, and lets you POST to add new tasks
class TodoList(Resource):
def get(self):
return TODOS def post(self):
args = parser.parse_args()
todo_id = int(max(TODOS.keys()).lstrip('todo')) + 1
todo_id = 'todo%i' % todo_id
TODOS[todo_id] = {'task': args['task']}
return TODOS[todo_id], 201 ##
## Actually setup the Api resource routing here
##
api.add_resource(TodoList, '/todos')
api.add_resource(Todo, '/todos/<todo_id>') if __name__ == '__main__':
app.run(debug=True)

Flask-RESTful 快速入门的更多相关文章

  1. flask 框架快速入门

    flask 框架快速入门 搭建一个简易flask项目 首先使用 Pycharm创建flask项目 运行flask项目 1.使用Pycharm搭建flask项目 (如果Pycharm新建项目中未出现该图 ...

  2. Flask的快速入门详细笔记

    Flask的框架结构对应关系及理解 1.简介 简单介绍下Flask是一个轻量级的web前端框架,不像django那样本身具备一套完整的页面体系,轻量级说明了完全可以自定义,从功能逻辑到业务处理,都可以 ...

  3. Flask 安装 快速入门

    $ pip install flask Flask自带的Server在端口5000上监听: ython app.py flask通过request.form['name']来获取表单的内容. 外部可见 ...

  4. Yii2框架RESTful API教程(一) - 快速入门

    前不久做一个项目,是用Yii2框架写一套RESTful风格的API,就去查了下<Yii 2.0 权威指南 >,发现上面写得比较简略.所以就在这里写一篇教程贴,希望帮助刚接触Yii2框架RE ...

  5. 【转】Flask快速入门

    迫不及待要开始了吗?本页提供了一个很好的 Flask 介绍,并假定你已经安装好了 Flask.如果没有,请跳转到 安装 章节. 一个最小的应用 一个最小的 Flask 应用看起来会是这样: from ...

  6. Flask快速入门

    flask快速入门 1.1.三种框架比较 Django: 重武器,内部包含了非常多组件:ORM.Form.ModelForm.缓存.Session.中间件.信号等 Flask:短小精悍,内部没有太多组 ...

  7. 【先验知识归纳】Flask快速入门

    本文参考:快速入门 - Flask 0.10.1 文档 路由 Flask使用route修饰器来关联URL与程序函数: @app.route('/') def hello_world(): return ...

  8. Flask简介,安装,demo,快速入门

    1.Flask简介 Flask是一个相对于Django而言轻量级的Web框架. 和Django大包大揽不同,Flask建立于一系列的开源软件包之上,这其中 最主要的是WSGI应用开发库Werkzeug ...

  9. pthon web框架flask(二)--快速入门

    快速入门 迫切希望上手?本文提供了一个很好的 Flask 介绍.假设你已经安装 Flask, 如果还没有安装话,请浏览下 安装 . 一个最小的应用 一个最小的应用看起来像这样: from flask ...

  10. 三 Flask web开发快速入门

    1:会话: from flask import Flask, url_for, request, render_template, session from werkzeug.utils import ...

随机推荐

  1. AJAX 状态值(readyState)与状态码(status)详解

    总结:status体现的是服务器对请求的反馈,而readystate表明客户端与客户的交互状态过程. 1- AJAX状态值与状态码区别AJAX状态值是指,运行AJAX所经历过的几种状态,无论访问是否成 ...

  2. 将.war文件解压到指定目录

    jar命令无法将.jar解压到指定目录,因为-C参数只在创建或更新包的时候可用 要将.jar文件解压到指定目录可以用unzip命令 unzip命令在windows下自带就有,不用另外下载安装 下面是将 ...

  3. Golang里面使用protobuf(proto3)

    参考文章:https://developers.google.com/protocol-buffers/docs/gotutorial 1.执行指令: go envgo get github.com/ ...

  4. Java命名规范基础

    一.java命名规范 1.类和接口:由多个单词组成时,所有单词的首字母大写,如TestJava 2.变量名和方法(函数):由多个单词组成时,所有第一个单词的首字母小写,之后每一个单词的首字母大写,如: ...

  5. Jmeter基础之---jmeter基础概念

    Jmeter基础之---jmeter基础概念 JMeter 介绍: 一个非常优秀的开源的性能测试工具. 优点:你用着用着就会发现它的重多优点,当然不足点也会呈现出来. JMeter 介绍: 一个非常优 ...

  6. 在eclipse运行程序

    1.开始的时候由于另一个财务共享的项目,其中也应用了maven管理项目,因此就不用额外安装配置maven. 2.这里关键的一点就是需要通过maven和jetty配合运行lenmonOA. 3.jett ...

  7. ubuntu 更换系统语言,Change System Language

    1.打开设置,打开“Language Support”. 2.如果列表中没有你的语言,点击“Install/Remove Language”,下拉选择你的语言,点击“Apply Changes”. 3 ...

  8. MyBatis学习(二)、SQL语句映射文件(2)增删改查、参数、缓存

    二.SQL语句映射文件(2)增删改查.参数.缓存 2.2 select 一个select 元素非常简单.例如: <!-- 查询学生,根据id --> <select id=" ...

  9. Ubuntu开启22端口

    [http://blog.csdn.net/baple/article/details/39288817] 安装OpenSSH Ubuntu缺省没有安装SSH Server,使用以下命令安装: sud ...

  10. 让一个端口同时做两件事:http/https和ssh

    相信很多人都在YY:能不能让80端口分析连接协议,如果是http协议就让服务器交给http服务程序(如Apache.Nginx等)处理,如果是ssh协议就交给ssh服务程序(如OpenSSH Serv ...