怎么使用Flask构建简单的RESTful服务

技术怎么使用Flask构建简单的RESTful服务本篇文章给大家分享的是有关怎么使用Flask构建简单的RESTful服务,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一

这篇文章是关于如何使用Flask来构建一个简单的RESTful服务。边肖觉得很实用,所以想分享给大家学习。希望大家看完这篇文章能有所收获。话不多说,让我们和边肖一起看看。

我们目前的项目是与Django一起建造的,这也是基于技术扩展的考虑。对于Django的一些大而全的组件,我还是持保守的态度。因此,尽管项目中使用了Django,但许多组件的使用还是尽可能少。这样,虽然前期有点苦,但从现在开始,因为依赖性低,我可以匹配很多其他方案。

当然,我特别喜欢Django的ORM方案。相比SQLAlchemy,Django ORM方案在Flask方向,Django感觉更好。

另一方面,在RESTful的方向上,Django自己对rest_framework的第三方实现也不错。现在,需要很长时间才能完全理解看似非常简单的概念和实现。

另一方面,看Flask的RESTful方案,其实也有一定的借鉴意义。

Flask比Django简洁多了。让我们举一个Flask的简单例子,比如打开一个web服务并打印hello world。

代码如下:

从烧瓶进口烧瓶

app=Flask(__name__)

@app.route('/')

def hello_world():

回归《你好世界》!

if __name__=='__main__':

app.run('192.168.56.102 ')

最后一个IP是我的服务器IP,可以根据需要更换。

按照以下方式运行,即可启动服务。

[root @ dev 01 flask]# python hello . py

*运行于http://192.168.56.102:5000/(按CTRL C退出)

192 . 168 . 56 . 1--[2018年5月19日/22:29:22]' GET/HTTP/1.1 ' 200-

192 . 168 . 56 . 1--[2018年5月19日/22:29:22]' GET/fav icon . ico HTTP/1.1 ' 404-

192 . 168 . 56 . 1--[2018年5月19日/22:29:22]' GET/fav icon . ico HTTP/1.1 ' 404-

结果如下:

请输入描述。

在这一点上,做过Python Web开发的同学很可能会说这不是在忽悠我。Python自己的技术也可以实现,Python本身也实现了一个SimpleHttpServer。请参考前一篇文章:了解Python web开发技术?

里面的代码看起来更简单:

#!/usr/bin/envpython

#coding:utf-8

from wsgiref . simple _ server importmake _ server

defRunServer(environ,start_response):

start_response('200OK ',[('内容类型','文本/html')])

返回' h2Hello,wsgi!/h2 '

if__name__=='__main__':

超文本传送协议(Hyper Text Transport Protocol的缩写)

d = make_server('', 8000, RunServer)
    print "Serving HTTP on port 8000..."
    httpd.serve_forever()

我们来看看一个相对完整的Flask代码示例,内容参考了:https://www.jianshu.com/p/6ac1cab17929

代码如下:

#!/usr/bin/env python

# -*- coding: utf-8 -*-

# by vellhe 2017/7/9

from flask import Flask, abort, request, jsonify

app = Flask(__name__)

# 测试数据暂时存放

tasks = []

@app.route('/add_task/', methods=['POST'])

def add_task():

 #需要自己来维护这个列表结构

  if not request.json or 'id' not in request.json or 'info' not in request.json:

    abort(400)

  task = {

    'id': request.json['id'],

    'info': request.json['info']

  }

  tasks.append(task)

  return jsonify({'result': 'success'})

@app.route('/get_task/', methods=['GET'])

def get_task():

  if not request.args or 'id' not in request.args:

    # 没有指定id则返回全部

    return jsonify(tasks)

  else:

    task_id = request.args['id']

    task = filter(lambda t: t['id'] == int(task_id), tasks)

    return jsonify(task) if task else jsonify({'result': 'not found'})

if __name__ == "__main__":

  # 将host设置为192.168.56.102,则外网用户也可以访问到这个服务

  app.run(host="192.168.56.102", port=8383, debug=True)

这个程序的一个难点就是如何在浏览器中模拟这个POST请求,当然可以使用postman来做,windows端可以参考这个链接下载:

https://app.getpostman.com/app/download/win64

第二个难点就是对于JSON的处理,里面还是有很多的参考之处。总体感觉虽然可以实现,但是所有的细节都需要自己来控制,比如输入结构,输出结构,信息查找的匹配,还有url和方法的映射。总是感觉有些拖泥带水,拖累太重,you can you up的感觉。

使用RESTful的方式,在Flask里面就是引入这个模块即可,相对来说比较简洁和轻量。

要安装flask_restful的话,一个命令即可。

pip install flask_restful

比如我有个需求,做一个基本的任务管理需求,可以分为两类功能,对任务理和任务列表管理,任务管理包括查看任务,增加,删除任务,都是对应单一的任务。任务列表就是对多个任务信息的查询和添加。

这种需求,其实基本的处理单元是任务,每一层级都可以不断的细化。尽可能对于应用层面来说更加透明,比如我就开放一个url: todos完成任务列表的管理,可以查看任务列表,添加任务信息。

todos/todo1 完成对单一任务的管理,比如添加修改,删除。

这个例子可能听起来不是很清晰,我举一个生活中的例子,比如你去一个游乐园,只有一个服务台,充值,退卡,办卡的需求都是在这一个柜台办理。这个时候需求可能是这几类:

比如你给他100块钱,那就意味着你要办卡,并且充值相应的金额(可能还要扣除工本费)

比如你给他100块钱,并且带卡,那就意味着你要充值

比如你给他一张卡,那就意味着你要退钱。

所以上述的需求,输入可能很简单,但是对应的业务场景可能截然不同。所以上述的代码要实现这个需求,逻辑还是比较复杂,而且不够清晰。

RESTful里面的一个优势就是可以基于class来构建不同的需求接口,可能对外开放的url是一个统一入口,但是可以在这个基础上进行细化。比如url: /todos和/todos/todo1

写一个程序脚本来实现:

#!/usr/bin/env python

# -*- coding: utf-8 -*-

from flask import Flask

from flask_restful import reqparse, abort, Api, Resource

app = Flask(__name__)

api = Api(app)

TODOS = {

  'todo1': {'task': 'test1'},

  'todo2': {'task': 'test2'},

  'todo3': {'task': 'test3'},

}

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('192.168.56.102',debug=True)

调用情况如下:

怎么使用Flask构建简单的RESTful服务

请输入描述

如果是查看某一个task的信息,可以直接输入即可匹配。

怎么使用Flask构建简单的RESTful服务

请输入描述

看一下代码其实会发现,这里注册了两个API,这里和上面程序的不同就在于里面使用了Resource做了封装,如果我要添加一个逻辑,其实也是很方便的。不需要堆砌一大堆的if-else

以上就是怎么使用Flask构建简单的RESTful服务,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注行业资讯频道。

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/55817.html

(0)

相关推荐

  • 703. 数据流中的第 K 大元素

    技术703. 数据流中的第 K 大元素 703. 数据流中的第 K 大元素设计一个找到数据流中第 k 大元素的类(class)。注意是排序后的第 k 大元素,不是第 k 个不同的元素。
    请实现 KthL

    礼包 2021年12月20日
  • 杯弓蛇影的意思是,形容水中倒影的成语有哪些

    技术杯弓蛇影的意思是,形容水中倒影的成语有哪些水中倒影杯弓蛇影的意思是,并不是影子。影子是由于光的直线传播,当光线遇到不透明的物体时,在物体后面形成的黑暗区域。而水中倒影是光的反射现象,当物体射出的光线射到水面上时,被水

    生活 2021年10月27日
  • 为所当为,如何理解王维的《送别》

    技术为所当为,如何理解王维的《送别》唐代诗人为所当为、画家有“诗佛”之称的王维,字摩诘,号摩诘居士。河东蒲州人(山西运城),祖籍太原祁州人(太原祁县)历任官职甚多,后官至尚书右丞,故称王右丞。《送别》唐代: 王维下马饮君

    生活 2021年10月28日
  • 香港云服务器安全吗

    技术香港云服务器安全吗对于网站服务器的安全一直都是很多站长需要首先考虑的问题,即便是有高效冗余备份的香港云服务器也可能存在一些潜在的安全问题,那么租用香港云服务器究竟能否保证数据和网站的安全。其实在安全性上很多香港云服务

    礼包 2021年10月26日
  • 生绿豆芽,家庭自己生绿豆芽的妙招

    技术生绿豆芽,家庭自己生绿豆芽的妙招炎热的夏天生绿豆芽,绿豆是解暑最好的食物之一,除了绿豆汤之外,还可以吃绿豆芽哦,夏天温度高,绿豆好出芽,那么在这里分享一下自己制作绿豆芽的妙招。1、绿豆两小把,洗净,加清水泡一晚上。2

    生活 2021年10月24日
  • 酸菜素馅饺子都放啥,怎么做好酸菜馅的饺子呢

    技术酸菜素馅饺子都放啥,怎么做好酸菜馅的饺子呢说起酸菜饺子首先就想到东北酸菜素馅饺子都放啥,恰巧本人就是出生在东北的面点师,我相信还是有资格回答这个问题的,在分享酸菜馅配方之前,先说说个人对于酸菜的一些理解,东北人都知道

    生活 2021年11月1日