使用 Python 和 Flask 設(shè)計 RESTful API

資料參考

restful API規(guī)范
  • url鏈接纹安,不能有動詞煤篙,只能有名詞慢味,出現(xiàn)復(fù)數(shù)亦镶,就加s
image.png
常用狀態(tài)碼
  • 200 服務(wù)器成功響應(yīng)客戶端的請求
  • 201 創(chuàng)建新資源成功
  • 204 資源被刪除成功(可以不真的重數(shù)據(jù)庫刪除,可以增加一個狀態(tài)status=207等來表示屬于刪除的資源)
  • 400 bad request
  • 401用戶沒權(quán)限
  • 403 因?yàn)槟承┰蚪乖L問這個請求
  • 404 用戶發(fā)送的url不存在
  • 406 用戶請求不被服務(wù)器接收灼狰,(比如服務(wù)器期望客戶端發(fā)送某個字段宛瞄,但是沒有發(fā)送)
  • 500 服務(wù)器內(nèi)部錯誤,
使用 Python 和 Flask 實(shí)現(xiàn) RESTful services(一)
from flask import Flask, jsonify, abort, make_response, request, redirect, url_for
from flask_restful import Resource, Api
app = Flask(__name__)
api = Api(app)
tasks = [{
    'id': 1,
    'title': "python書籍",
    'content': "我是python入門書籍交胚,了解一下"
},
    {
        'id': 2,
        'title': "Java書籍",
        'content': "我是java入門書籍份汗,了解一下"
    }
]
#查詢所有tasks
@app.route("/todo/api/v1.0/tasks", methods=["GET"])
def get_tasks():
    return jsonify(tasks)

@app.errorhandler(404)
def not_found(error):
    return jsonify({'error': 'not found'}),404
if __name__ == '__main__':
    app.run()

效果圖:


image.png
#根據(jù)id查詢 ,python3中蝴簇,filter是一個可遍歷的對象杯活,用list直接轉(zhuǎn)成列表
@app.route('/todo/api/v1.0/tasks/<int:task_id>', methods=['GET'])
def get_task(task_id):
    task = list(filter(lambda t: t['id'] == task_id, tasks))
    if len(task) == 0:
        abort(404)
    else:
        data = task[0]
        if data:
            print(data)
            return jsonify(data)
image.png

增加一個task,201表示創(chuàng)建新資源成功

#添加一個tasks
@app.route('/todo/api/v1.0/tasks/add', methods=['POST'])
def create_taask():
    if not request.form or not 'title' in request.form:
        abort(404)
    task = {"id": request.form['id'], 'title': request.form['title']
        , 'content': request.form.get('content', "")}
    tasks.append(task)
    return jsonify(tasks), 201

image.png
@app.route("/todo/api/v1.0/tasks/del", methods=["POST"])
def del_task():
    if not request.form or not "id" in request.form:
        abort(404)
    else:
        id = request.form.get("id")
        print(type(id))
        # 注意獲取的是str類型
        task = list(filter(lambda t: t['id'] == int(id), tasks))
        if len(task) == 0:
            abort(404)
        else:
            data = task[0]
            if data:
                tasks.remove(data)
                return jsonify(tasks)

image.png

以上代碼就使用flask提供的jsonify實(shí)現(xiàn)一個查看列表,查看某一條信息熬词,增加某一條旁钧,刪除某一條的基本接口使用,注意到?jīng)]得互拾,增加的id=a歪今,沒有做驗(yàn)證,id重復(fù)也沒有驗(yàn)證颜矿。平常寄猩,最好是結(jié)合數(shù)據(jù)庫來操作。更多使用flask-restful插件

加強(qiáng) RESTful web service 的安全性

不加以驗(yàn)證骑疆,如果一個陌生人弄清我們的 API 是如何工作的田篇,他或她可以編寫一個客戶端訪問我們的 web service 并且毀壞我們的數(shù)據(jù)。
注意:確保我們的 web service 安全服務(wù)的最簡單的方法是要求客戶端提供一個用戶名和密碼封断。在常規(guī)的 web 應(yīng)用程序會提供一個登錄的表單用來認(rèn)證斯辰,并且服務(wù)器會創(chuàng)建一個會話為登錄的用戶以后的操作使用,會話的 id 以 cookie 形式存儲在客戶端瀏覽器中坡疼。然而 REST 的規(guī)則之一就是 “無狀態(tài)”彬呻, 因此我們必須要求客戶端在每一次請求中提供認(rèn)證的信息。

既然我們需要實(shí)現(xiàn)認(rèn)證我們需要在 HTTP 上下文中去完成,HTTP 協(xié)議提供了兩種認(rèn)證機(jī)制: Basic 和 Digest闸氮。

flask-httpauth插件
from flask_httpauth import HTTPBasicAuth
auth = HTTPBasicAuth()

"""@auth.get_password
def get_password(username):
   if username == 'admin':
        return '123456'
    return None"""
"""@auth.verify_password
def verify_password(email,password):
    pass
    if user.verify_password(password):
        return True"""
@auth.error_handler
def unauthorized():
    return make_response(jsonify({'error': 'Unauthorized access'}), 401)
...
@app.route("/todo/api/v1.0/tasks", methods=["GET"])
@auth.login_required
def get_tasks():
    return jsonify(tasks)

復(fù)制地址到瀏覽器剪况,會彈出輸入框,為了不要輸入框可改成error_handler中可改成403
注意蒲跨,驗(yàn)證的話译断,我們可以用get_password,來驗(yàn)證user叫admin,密碼是123456的用戶,或者驗(yàn)證用戶中有沒得叫某某名字的或悲,只要唯一孙咪,我們就可以用來驗(yàn)證,或者使用verfy_password來參考資料
參考資料2
最后感謝文章作者:傳送門

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末巡语,一起剝皮案震驚了整個濱河市翎蹈,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌男公,老刑警劉巖荤堪,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異枢赔,居然都是意外死亡澄阳,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進(jìn)店門踏拜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來碎赢,“玉大人,你說我怎么就攤上這事速梗】眨” “怎么了?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵镀琉,是天一觀的道長。 經(jīng)常有香客問我蕊唐,道長屋摔,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任替梨,我火速辦了婚禮钓试,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘副瀑。我一直安慰自己弓熏,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布糠睡。 她就那樣靜靜地躺著挽鞠,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上信认,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天材义,我揣著相機(jī)與錄音,去河邊找鬼嫁赏。 笑死其掂,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的潦蝇。 我是一名探鬼主播款熬,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼攘乒!你這毒婦竟也來了贤牛?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤持灰,失蹤者是張志新(化名)和其女友劉穎盔夜,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體堤魁,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡喂链,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年芋膘,在試婚紗的時候發(fā)現(xiàn)自己被綠了残制。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡之众,死狀恐怖盲链,靈堂內(nèi)的尸體忽然破棺而出蝇率,到底是詐尸還是另有隱情,我是刑警寧澤刽沾,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布本慕,位于F島的核電站,受9級特大地震影響侧漓,放射性物質(zhì)發(fā)生泄漏锅尘。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一布蔗、第九天 我趴在偏房一處隱蔽的房頂上張望藤违。 院中可真熱鬧,春花似錦纵揍、人聲如沸顿乒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽璧榄。三九已至特漩,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間犹菱,已是汗流浹背拾稳。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留腊脱,地道東北人访得。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像陕凹,于是被迫代替她去往敵國和親悍抑。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評論 2 345

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

  • Flask文檔 1. 快速入門(Quickstart) 1.1 最小的Flask應(yīng)用 1.2 路由(Routing...
    plutoese閱讀 4,579評論 0 51
  • 介紹: Flask-Restful是一個專門用來寫restful api的一個插件杜耙。使用他可以快速的集成restf...
    97833632c0c7閱讀 915評論 0 4
  • pip install flask-restfulFlask-RESTful需要Python版本2.7,3.4,...
    指向遠(yuǎn)方的燈塔閱讀 2,132評論 0 0
  • RESTful API 什么是REST 一種軟件架構(gòu)風(fēng)格搜骡、設(shè)計風(fēng)格、而不是標(biāo)準(zhǔn)佑女,只是提供了一組設(shè)計原則和約束條件记靡。...
    佐卡ww閱讀 795評論 0 3
  • 下著一個人的雨 通約即稀釋 見過一人之國、一人之天堂否团驱? 一人之地獄里烤火 火烤的是自己 火的影子是火 一走就斷的...
    一位手藝人閱讀 357評論 11 19