本篇文章給大家分享的是有關(guān)怎么使用Flask構(gòu)建簡(jiǎn)單的RESTful服務(wù),小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
我們現(xiàn)在的一個(gè)項(xiàng)目是使用Django來構(gòu)建,說來也是基于技術(shù)擴(kuò)展的考慮,我對(duì)于Django里面大而全的一些組件還是持有保守態(tài)度,所以雖然項(xiàng)目用了Django,但是對(duì)于很多組件的使用都是盡可能少用或者不用,這樣一來雖然前期清苦些,但是從現(xiàn)在來看,由于依賴很低,我可以匹配很多種其他的方案。
當(dāng)然對(duì)我來說我格外喜歡Django的ORM方案,這個(gè)我對(duì)比了下Flask方向的ORM方案SQLAlchemy,Django的感覺要更好一些。
而在RESTful的方向上,Django自身的第三方實(shí)現(xiàn)rest_framework也不錯(cuò),現(xiàn)在看起來很簡(jiǎn)單的概念和實(shí)現(xiàn),用了很長(zhǎng)一段時(shí)間才徹底理解。
而反過來看下Flask的RESTful方案,其實(shí)也有一定的借鑒意義。
Flask比Django要簡(jiǎn)練的多,我們來看一個(gè)最簡(jiǎn)單的Flask例子,比如開啟一個(gè)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ù)需要替換。
使用如下的方式來運(yùn)行,服務(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é)果如下:
請(qǐng)輸入描述
到了這里,如果是做過Python Web開發(fā)的同學(xué)很可能說,這不是忽悠我呢,Python自身的技術(shù)也可以實(shí)現(xiàn),本身Python就實(shí)現(xiàn)了一個(gè)SimpleHttpServer,可以參見之前的一篇文章:?如果理解Python web開發(fā)技術(shù)?
里面的代碼看起來更簡(jiǎn)潔:
#!/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()
我們來看看一個(gè)相對(duì)完整的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__)
# 測(cè)試數(shù)據(jù)暫時(shí)存放
tasks = []
@app.route('/add_task/', methods=['POST'])
def add_task():
#需要自己來維護(hù)這個(gè)列表結(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)用戶也可以訪問到這個(gè)服務(wù)
app.run(host="192.168.56.102", port=8383, debug=True)
這個(gè)程序的一個(gè)難點(diǎn)就是如何在瀏覽器中模擬這個(gè)POST請(qǐng)求,當(dāng)然可以使用postman來做,windows端可以參考這個(gè)鏈接下載:
https://app.getpostman.com/app/download/win64
第二個(gè)難點(diǎn)就是對(duì)于JSON的處理,里面還是有很多的參考之處。總體感覺雖然可以實(shí)現(xiàn),但是所有的細(xì)節(jié)都需要自己來控制,比如輸入結(jié)構(gòu),輸出結(jié)構(gòu),信息查找的匹配,還有url和方法的映射。總是感覺有些拖泥帶水,拖累太重,you can you up的感覺。
使用RESTful的方式,在Flask里面就是引入這個(gè)模塊即可,相對(duì)來說比較簡(jiǎn)潔和輕量。
要安裝flask_restful的話,一個(gè)命令即可。
pip install flask_restful
比如我有個(gè)需求,做一個(gè)基本的任務(wù)管理需求,可以分為兩類功能,對(duì)任務(wù)理和任務(wù)列表管理,任務(wù)管理包括查看任務(wù),增加,刪除任務(wù),都是對(duì)應(yīng)單一的任務(wù)。任務(wù)列表就是對(duì)多個(gè)任務(wù)信息的查詢和添加。
這種需求,其實(shí)基本的處理單元是任務(wù),每一層級(jí)都可以不斷的細(xì)化。盡可能對(duì)于應(yīng)用層面來說更加透明,比如我就開放一個(gè)url: todos完成任務(wù)列表的管理,可以查看任務(wù)列表,添加任務(wù)信息。
todos/todo1 完成對(duì)單一任務(wù)的管理,比如添加修改,刪除。
這個(gè)例子可能聽起來不是很清晰,我舉一個(gè)生活中的例子,比如你去一個(gè)游樂園,只有一個(gè)服務(wù)臺(tái),充值,退卡,辦卡的需求都是在這一個(gè)柜臺(tái)辦理。這個(gè)時(shí)候需求可能是這幾類:
比如你給他100塊錢,那就意味著你要辦卡,并且充值相應(yīng)的金額(可能還要扣除工本費(fèi))
比如你給他100塊錢,并且?guī)Эǎ蔷鸵馕吨阋渲?/p>
比如你給他一張卡,那就意味著你要退錢。
所以上述的需求,輸入可能很簡(jiǎn)單,但是對(duì)應(yīng)的業(yè)務(wù)場(chǎng)景可能截然不同。所以上述的代碼要實(shí)現(xiàn)這個(gè)需求,邏輯還是比較復(fù)雜,而且不夠清晰。
RESTful里面的一個(gè)優(yōu)勢(shì)就是可以基于class來構(gòu)建不同的需求接口,可能對(duì)外開放的url是一個(gè)統(tǒng)一入口,但是可以在這個(gè)基礎(chǔ)上進(jìn)行細(xì)化。比如url: /todos和/todos/todo1
寫一個(gè)程序腳本來實(shí)現(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)用情況如下:
請(qǐng)輸入描述
如果是查看某一個(gè)task的信息,可以直接輸入即可匹配。
請(qǐng)輸入描述
看一下代碼其實(shí)會(huì)發(fā)現(xiàn),這里注冊(cè)了兩個(gè)API,這里和上面程序的不同就在于里面使用了Resource做了封裝,如果我要添加一個(gè)邏輯,其實(shí)也是很方便的。不需要堆砌一大堆的if-else
以上就是怎么使用Flask構(gòu)建簡(jiǎn)單的RESTful服務(wù),小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見到或用到的。希望你能通過這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司行業(yè)資訊頻道。
名稱欄目:怎么使用Flask構(gòu)建簡(jiǎn)單的RESTful服務(wù)-創(chuàng)新互聯(lián)
URL網(wǎng)址:http://chinadenli.net/article42/ehgec.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供靜態(tài)網(wǎng)站、動(dòng)態(tài)網(wǎng)站、營(yíng)銷型網(wǎng)站建設(shè)、微信公眾號(hào)、品牌網(wǎng)站設(shè)計(jì)、服務(wù)器托管
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容