python實(shí)現(xiàn)RESTful服務(wù)(基于flask)

前言

上一篇文章講到如何用java實(shí)現(xiàn)RESTful服務(wù)逗嫡,這就來講講怎么用python來實(shí)現(xiàn)吧锦茁,因?yàn)橐罱ㄒ惶譲ava和python互調(diào)的服務(wù)炫隶,兩者都不能少啊。
對(duì)于python的述求呢也是要輕量化仑荐,并且能快捷開發(fā)雕拼,因?yàn)槲疫@套服務(wù)主要控制邏輯還是在java端,python這塊負(fù)責(zé)一些工具邏輯释漆,比如網(wǎng)頁爬取悲没、文字轉(zhuǎn)拼音篮迎、圖像處理等等男图,在java端當(dāng)成工具類來使用示姿,所以輕量和快捷開發(fā)就是重點(diǎn)了

web框架選擇

java端需要選擇一個(gè)web容器,同樣的逊笆,python也需要選擇一個(gè)web框架栈戳,當(dāng)然自己實(shí)現(xiàn)一套也可以哈,不過本著【人生苦短难裆,我用python】的原則子檀,還是找框架吧

知乎上有一個(gè)討論Python 有哪些好的 Web 框架?乃戈,從這個(gè)討論中最后我選擇了flask褂痰,原因是:

  • Django,流行但是笨重症虑,還麻煩缩歪,人生苦短,肯定不選
  • web.py谍憔,輕量匪蝙,但據(jù)說作者仙逝無人維護(hù),好吧习贫,先pass
  • tornado逛球,據(jù)說倡導(dǎo)自己造輪子,雖然是facebook開源的吧苫昌,但聽到這個(gè)颤绕,就算了吧
  • 還有一些其他的就不說了,直到看到一個(gè)人做了如下回復(fù)蜡歹,就暫定了flask屋厘,再發(fā)現(xiàn)flask寫RESTful居然超簡單,于是就它了


擼代碼

選定了flask框架月而,那就動(dòng)手寫代碼咯


安裝flask

pip install flask

hello world

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# by vellhe 2017/7/9

from flask import Flask

# Flask初始化參數(shù)盡量使用你的包名汗洒,這個(gè)初始化方式是官方推薦的,官方解釋:http://flask.pocoo.org/docs/0.12/api/#flask.Flask
app = Flask(__name__)


@app.route('/HelloWorld')
def hello_world():
    return "Hello World!"


if __name__ == "__main__":
    # 這種是不太推薦的啟動(dòng)方式父款,我這只是做演示用溢谤,官方啟動(dòng)方式參見:http://flask.pocoo.org/docs/0.12/quickstart/#a-minimal-application
    app.run(debug=True)

注:代碼里參見的官方文檔都是英文的,也有一個(gè)不錯(cuò)的中文網(wǎng)站做了很好的翻譯憨攒,可以在扎個(gè)上面找到很好的對(duì)應(yīng):
http://www.pythondoc.com/flask/quickstart.html

驗(yàn)證結(jié)果:
  • PostMan驗(yàn)證


    PostMan驗(yàn)證
  • 瀏覽器打開


    瀏覽器打開

完美J郎薄!肝集!就這幾行代碼就實(shí)現(xiàn)了一個(gè)簡單的網(wǎng)頁瞻坝,簡直爽得不要不要的了


簡單的RESTful實(shí)現(xiàn)

光實(shí)現(xiàn)一個(gè)簡單網(wǎng)頁可不是本事(畢竟python用SimpleHTTPServer都可以不用寫代碼),實(shí)現(xiàn)RESTful是不是也同樣簡單呢杏瞻?

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# by vellhe 2017/7/9
from flask import Flask, abort, request, jsonify

app = Flask(__name__)

# 測試數(shù)據(jù)暫時(shí)存放
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設(shè)置為0.0.0.0所刀,則外網(wǎng)用戶也可以訪問到這個(gè)服務(wù)
    app.run(host="0.0.0.0", port=8383, debug=True)

驗(yàn)證結(jié)果
add_task
get_task
get_task by id

以上是通過最原始的方式實(shí)現(xiàn)衙荐,沒有使用flask的RESTful擴(kuò)展庫,就這種實(shí)現(xiàn)方式都已經(jīng)非常給力了浮创,這么一點(diǎn)代碼就搞定了RESTful服務(wù)忧吟,真的是人生苦短啊,但這真的就完美了嗎斩披?
答案肯定是no啦~ 必須要試試flask的RESTful擴(kuò)展庫才知道什么叫真正的爽啊


使用flask的RESTful擴(kuò)展庫 flask-restful

強(qiáng)烈建議參考官方文檔(因?yàn)橄旅嫖乙彩钦瞻岵徽`):http://flask-restful.readthedocs.io/en/0.3.5/quickstart.html#a-minimal-api

安裝flask-restful
pip install flask-restful
demo
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# by vellhe 2017/7/9
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)
驗(yàn)證結(jié)果

查詢列表:


get

查詢單任務(wù):


get by id

刪除任務(wù):
delete by id

添加任務(wù)(這是用post表單形式溜族,還可以改成json形式啦):


add

更新任務(wù):
update
flask-restful框架使用總結(jié)

這個(gè)框架用Resource類將封裝好了http的各種請求,只需定義一下對(duì)應(yīng)的函數(shù)即可垦沉,返回值也是可以直接丟對(duì)象過去煌抒,非常方便,寫好接口類用API配置一下路徑就搞定了

后語

Perfect2薇丁4菝怠!經(jīng)過這一番測試绑青,flask-restful完全滿足了我的需求诬像,框架輕量,開發(fā)方便闸婴,以class為單位去開發(fā)我的各個(gè)接口給到j(luò)ava調(diào)用坏挠,果然是【人生苦短,我用python】啊~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末邪乍,一起剝皮案震驚了整個(gè)濱河市降狠,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌庇楞,老刑警劉巖榜配,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異吕晌,居然都是意外死亡蛋褥,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門睛驳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來烙心,“玉大人,你說我怎么就攤上這事乏沸∫穑” “怎么了?”我有些...
    開封第一講書人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵蹬跃,是天一觀的道長匙瘪。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么丹喻? 我笑而不...
    開封第一講書人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任算灸,我火速辦了婚禮,結(jié)果婚禮上驻啤,老公的妹妹穿的比我還像新娘。我一直安慰自己荐吵,他們只是感情好骑冗,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著先煎,像睡著了一般贼涩。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上薯蝎,一...
    開封第一講書人閱讀 49,046評(píng)論 1 285
  • 那天遥倦,我揣著相機(jī)與錄音,去河邊找鬼占锯。 笑死袒哥,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的消略。 我是一名探鬼主播堡称,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼艺演!你這毒婦竟也來了却紧?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤胎撤,失蹤者是張志新(化名)和其女友劉穎晓殊,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體伤提,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡巫俺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了肿男。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片识藤。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖次伶,靈堂內(nèi)的尸體忽然破棺而出痴昧,到底是詐尸還是另有隱情,我是刑警寧澤冠王,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布赶撰,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏豪娜。R本人自食惡果不足惜餐胀,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望瘤载。 院中可真熱鬧否灾,春花似錦、人聲如沸鸣奔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽挎狸。三九已至扣汪,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間锨匆,已是汗流浹背崭别。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留恐锣,地道東北人茅主。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像土榴,于是被迫代替她去往敵國和親暗膜。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • # Python 資源大全中文版 我想很多程序員應(yīng)該記得 GitHub 上有一個(gè) Awesome - XXX 系列...
    aimaile閱讀 26,441評(píng)論 6 428
  • 環(huán)境管理管理Python版本和環(huán)境的工具鞭衩。p–非常簡單的交互式python版本管理工具学搜。pyenv–簡單的Pyth...
    MrHamster閱讀 3,783評(píng)論 1 61
  • 本文首發(fā)于Gevin的博客 原文鏈接:Flask 入門指南 未經(jīng) Gevin 授權(quán),禁止轉(zhuǎn)載 1. 初識(shí)Flask...
    Gevin閱讀 16,723評(píng)論 10 237
  • 人承認(rèn)自己不能论衍,比承認(rèn)自己能要困難的多瑞佩。只有看到不足,才會(huì)虛心向他人請教坯台,讓自己收獲多多炬丸。而不是在錯(cuò)的路上越走越遠(yuǎn)。
    斐麗希婭閱讀 79評(píng)論 0 0
  • 月光瀉進(jìn)屋蜒蕾, 幾片葉隨舞稠炬, 書上的字落了地, 貓遠(yuǎn)遠(yuǎn)的待在那里咪啡。 幽藍(lán)的世界里首启, 沒有事污,也沒有糊涂撤摸。 淡薄的影...
    H3190閱讀 245評(píng)論 0 3