溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

怎么使用Flask構(gòu)建簡單的RESTful服務(wù)

發(fā)布時間:2021-10-29 09:20:11 來源:億速云 閱讀:228 作者:柒染 欄目:軟件技術(shù)

本篇文章給大家分享的是有關(guān)怎么使用Flask構(gòu)建簡單的RESTful服務(wù),小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

    我們現(xiàn)在的一個項目是使用Django來構(gòu)建,說來也是基于技術(shù)擴展的考慮,我對于Django里面大而全的一些組件還是持有保守態(tài)度,所以雖然項目用了Django,但是對于很多組件的使用都是盡可能少用或者不用,這樣一來雖然前期清苦些,但是從現(xiàn)在來看,由于依賴很低,我可以匹配很多種其他的方案。

    當然對我來說我格外喜歡Django的ORM方案,這個我對比了下Flask方向的ORM方案SQLAlchemy,Django的感覺要更好一些。

    而在RESTful的方向上,Django自身的第三方實現(xiàn)rest_framework也不錯,現(xiàn)在看起來很簡單的概念和實現(xiàn),用了很長一段時間才徹底理解。

    而反過來看下Flask的RESTful方案,其實也有一定的借鑒意義。

    Flask比Django要簡練的多,我們來看一個最簡單的Flask例子,比如開啟一個web服務(wù),打印出hello world

    代碼如下:

    from flask import Flask

    app = Flask(__name__)

    @app.route('/')

    def hello_world():

      return 'Hello World!'

    if __name__ == '__main__':

      app.run('192.168.56.102')

最后的IP是我的服務(wù)器IP,可以根據(jù)需要替換。

使用如下的方式來運行,服務(wù)即可開啟。

[root@dev01 flask]# python hello.py 

 * Running on http://192.168.56.102:5000/ (Press CTRL+C to quit)

192.168.56.1 - - [19/May/2018 22:29:22] "GET / HTTP/1.1" 200 -

192.168.56.1 - - [19/May/2018 22:29:22] "GET /favicon.ico HTTP/1.1" 404 -

192.168.56.1 - - [19/May/2018 22:29:22] "GET /favicon.ico HTTP/1.1" 404 -

得到的結(jié)果如下:

請輸入描述

到了這里,如果是做過Python Web開發(fā)的同學很可能說,這不是忽悠我呢,Python自身的技術(shù)也可以實現(xiàn),本身Python就實現(xiàn)了一個SimpleHttpServer,可以參見之前的一篇文章:?如果理解Python web開發(fā)技術(shù)?

里面的代碼看起來更簡潔:

#!/usr/bin/env python
#coding:utf-8

from wsgiref.simple_server import make_server
def RunServer(environ, start_response):
    start_response('200 OK', [('Content-Type', 'text/html')])
    return '<h2>Hello, wsgi!</h2>'

if __name__ == '__main__':
    httpd = make_server('', 8000, RunServer)
    print "Serving HTTP on port 8000..."
    httpd.serve_forever()

我們來看看一個相對完整的Flask代碼示例,內(nèi)容參考了: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__)

# 測試數(shù)據(jù)暫時存放

tasks = []

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

def add_task():

 #需要自己來維護這個列表結(jié)構(gòu)

  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設(shè)置為192.168.56.102,則外網(wǎng)用戶也可以訪問到這個服務(wù)

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

這個程序的一個難點就是如何在瀏覽器中模擬這個POST請求,當然可以使用postman來做,windows端可以參考這個鏈接下載:

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

第二個難點就是對于JSON的處理,里面還是有很多的參考之處。總體感覺雖然可以實現(xiàn),但是所有的細節(jié)都需要自己來控制,比如輸入結(jié)構(gòu),輸出結(jié)構(gòu),信息查找的匹配,還有url和方法的映射。總是感覺有些拖泥帶水,拖累太重,you can you up的感覺。

使用RESTful的方式,在Flask里面就是引入這個模塊即可,相對來說比較簡潔和輕量。

要安裝flask_restful的話,一個命令即可。

pip install flask_restful

比如我有個需求,做一個基本的任務(wù)管理需求,可以分為兩類功能,對任務(wù)理和任務(wù)列表管理,任務(wù)管理包括查看任務(wù),增加,刪除任務(wù),都是對應(yīng)單一的任務(wù)。任務(wù)列表就是對多個任務(wù)信息的查詢和添加。

這種需求,其實基本的處理單元是任務(wù),每一層級都可以不斷的細化。盡可能對于應(yīng)用層面來說更加透明,比如我就開放一個url: todos完成任務(wù)列表的管理,可以查看任務(wù)列表,添加任務(wù)信息。

todos/todo1 完成對單一任務(wù)的管理,比如添加修改,刪除。

這個例子可能聽起來不是很清晰,我舉一個生活中的例子,比如你去一個游樂園,只有一個服務(wù)臺,充值,退卡,辦卡的需求都是在這一個柜臺辦理。這個時候需求可能是這幾類:

比如你給他100塊錢,那就意味著你要辦卡,并且充值相應(yīng)的金額(可能還要扣除工本費)

比如你給他100塊錢,并且?guī)Эǎ蔷鸵馕吨阋渲?/p>

比如你給他一張卡,那就意味著你要退錢。

所以上述的需求,輸入可能很簡單,但是對應(yīng)的業(yè)務(wù)場景可能截然不同。所以上述的代碼要實現(xiàn)這個需求,邏輯還是比較復雜,而且不夠清晰。

RESTful里面的一個優(yōu)勢就是可以基于class來構(gòu)建不同的需求接口,可能對外開放的url是一個統(tǒng)一入口,但是可以在這個基礎(chǔ)上進行細化。比如url: /todos和/todos/todo1

寫一個程序腳本來實現(xiàn):

#!/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)

調(diào)用情況如下:

怎么使用Flask構(gòu)建簡單的RESTful服務(wù)

請輸入描述

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

怎么使用Flask構(gòu)建簡單的RESTful服務(wù)

請輸入描述

看一下代碼其實會發(fā)現(xiàn),這里注冊了兩個API,這里和上面程序的不同就在于里面使用了Resource做了封裝,如果我要添加一個邏輯,其實也是很方便的。不需要堆砌一大堆的if-else

以上就是怎么使用Flask構(gòu)建簡單的RESTful服務(wù),小編相信有部分知識點可能是我們?nèi)粘9ぷ鲿姷交蛴玫降摹OM隳芡ㄟ^這篇文章學到更多知識。更多詳情敬請關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI