python 部署 Restful web

来源:http://www.cnblogs.com/loveincode/archive/2017/09/22/python_restful_web.html
-Advertisement-
Play Games

使用python web做Restful 風格,很簡單,採用Flask框架輕鬆實現一個RESTful的服務。 Restful相關介紹請查看:https://www.ibm.com/developerworks/library/ws-restful/index.html 1. 環境搭建 首先需要準備環 ...


使用python web做Restful 風格,很簡單,採用Flask框架輕鬆實現一個RESTful的服務。

Restful相關介紹請查看:https://www.ibm.com/developerworks/library/ws-restful/index.html

1. 環境搭建

首先需要準備環境

  need virtualenv  python的沙盒環境--virtualenv

    這裡使用 virtualenv  來創建一個Python環境,用來運行我們稍後的restful服務端。

  need flask

1.1 安裝

1.1.1 pip

  下載地址:https://pypi.python.org/pypi/pip/

  下載 pip tar.gz

  解壓 tar -xzvf 

  進入目錄安裝 python setup.py install 即可使用

1.1.2 virtualenv  

  pip install virtualenv 直接下載安裝

  或者 進入 https://pypi.python.org/pypi/virtualenv 下載 tar包 和pip安裝類似

1.1.3 flask

  pip install flask 直接下載安裝

  或者 https://pypi.python.org/pypi/Flask/0.12.2#downloads 下載tar包 解壓安裝

  手動裝需要(install會自動安裝,如果linux虛擬機未聯網,根據提示缺什麼,去安裝什麼):

    click >=2.0:https://pypi.python.org/simple/click/

    itsdangerous >=0.21:https://pypi.python.org/simple/itsdangerous/

    jinja2 >= 2.4:https://pypi.python.org/simple/jinja2/

    werkzeug>=0.7:https://pypi.python.org/simple/werkzeug/

2. 環境測試

2.1 創建虛擬環境

選擇一個合適的路徑下 

我選擇的是  /var/flask 當然可以隨意選擇一個目錄

virtualenv web ,做一個名為web的python環境

目錄如:

  

2.2 新建app.py

在bin中新建app.py

app.route 的用法和Springmvc 的controller requestmapping很類似,詳細請查看:http://www.guadong.net/article/2eHheDFm.html

#環境測試
from flask import Flask

app = Flask(__name__)

@app.route('/')
def index():
    return "Hello, Python Flask!"

if __name__ == '__main__':
    app.run(debug=True)

2.3 執行訪問

執行 python app.py

  

本地訪問(可以新開一個ssh進行測試,也可以用IP地址 用瀏覽器測試)

這裡採用linux內部訪問:curl -i http://localhost:5000

  

訪問得到了Hello, Python Flask!

說明環境搭建成功success!

3. 正式幹活

這裡還是使用Person對象來做Restful的演示,參考:SpringMVC 構建Restful風格 及問題處理

/persons  GET         得所有person

/person/{id}  GET     得到id的person

/person   POST        新增person

/person/{id}  PUT      更新id的person

/person/{id}  DELETE    刪除id的person

新建person.py

編碼:

#coding=utf-8

引入需要的模塊:

from flask import Flask,jsonify,abort,make_response,request

模擬資料庫數據:

#模擬資料庫 person 屬性 id name age done url
persons = [
    {
        'id': 1,
        'name': u'loveincode',
        'age': 20, 
        'done': False,
        'url':u'loveincode.cnblogs.com'
    },
    {
        'id': 2,
        'name': u'strive',
        'age': 18, 
        'done': False,
        'url':u'loveincode.cnblogs.com'
    }
]

3.1 GET persons

代碼設計:

@app.route('/restful/persons', methods=['GET'])
def get_persons():
    return jsonify({'persons': persons})

先執行:python person.py

test:curl -i http://localhost:5000/restful/persons

  

3.2 GET person

@app.route('/restful/person/<int:id>', methods=['GET'])
def get_person(id):
    person = filter(lambda t: t['id'] == id, persons)
    if len(person) == 0:
        abort(404)
    return jsonify({'person': person[0]})

先執行:python person.py

test:curl -i http://localhost:5000/restful/person/2

  

錯誤404 後面一起講。

3.3 POST

@app.route('/restful/person', methods=['POST'])
def create_person():
    if not request.json or not 'name' in request.json:
        abort(400)
    person = {
        'id': persons[-1]['id'] + 1,
        'name': request.json['name'],
        #如果沒有提交age參數預設為20
        'age': request.json.get('age', 20),
        #同理如果沒提交url,url也是預設值
        'url': request.json.get('url', "預設URL loveincode.cnblogs.com"),
        #該參數初始化FALSE
        'done': False
    }
    persons.append(person)
    return jsonify({'person': person}), 201

先執行:python person.py

test:提供三個測試

curl -i -H "Content-Type: application/json" -X POST -d '{"name":"new loveincode"}' http://localhost:5000/restful/person

curl -i -H "Content-Type: application/json" -X POST -d '{"name":"new loveincode","age":23}' http://localhost:5000/restful/person

curl -i -H "Content-Type: application/json" -X POST -d '{"name":"new loveincode","age":23,"url":"1234"}' http://localhost:5000/restful/person

驗證最後一個 ,先post 再看所有 添加成功

  

3.4 PUT

@app.route('/restful/person/<int:id>', methods=['PUT'])
def update_person(id):
    person = filter(lambda t: t['id'] == id, persons)
    if len(person) == 0:
        abort(404)
    if not request.json:
        abort(400)
    if 'name' in request.json and type(request.json['name']) != unicode:
        abort(400)
    if 'age' in request.json and type(request.json['age']) is not int:
        abort(400)
    if 'url' in request.json and type(request.json['url']) != unicode:
        abort(400)
    if 'done' in request.json and type(request.json['done']) is not bool:
        abort(400)
    person[0]['name'] = request.json.get('name', person[0]['name'])
    person[0]['age'] = request.json.get('age', person[0]['age'])
    person[0]['url'] = request.json.get('url', person[0]['url'])
    person[0]['done'] = request.json.get('done', person[0]['done'])
    return jsonify({'person': person[0]})

先執行:python person.py

test:

curl -i -H "Content-Type: application/json" -X PUT -d '{"done":true}' http://localhost:5000/restful/person/2

curl -i -H "Content-Type: application/json" -X PUT -d '{"name":"update","age":30}' http://localhost:5000/restful/person/2

  

3.5 DELETE

@app.route('/restful/person/<int:id>', methods=['DELETE'])
def delete_person(id):
    person = filter(lambda t: t['id'] == id, persons)
    if len(person) == 0:
        abort(404)
    persons.remove(person[0])
    return jsonify({'result': True})

先執行:python person.py

test:

curl -i -X DELETE http://localhost:5000/restful/person/2

  

3.6 Error 處理

對400 和 404 進行錯誤json封裝,一個友好的錯誤提示

@app.errorhandler(404)
def not_found(error):
    return make_response(jsonify({'error': 'Not found'}), 404)

@app.errorhandler(400)
def not_found(error):
    return make_response(jsonify({'error': 'Request Error'}), 400)

github地址:https://github.com/loveincode/python-restful-web

參考:http://www.cnblogs.com/vovlie/p/4178077.html


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • [導航頁 LeetCode專題 Python實現][1] [1]: http://www.cnblogs.com/exploitht/p/7488742.html 相關代碼已經上傳到github: "https://github.com/exploitht/leetcode python" 文中代碼 ...
  • 學習VGA顯示圖片的過程中,遇到了一個小問題,我在顯示屏上開了一個60x60的框,放了一張圖片進去顯示,但是最終的結果如下圖所示。 出現了一個豎黑邊,看了看代碼,分析了一下邏輯沒問題,然而看這個顯示那肯定是有問題的,然後模擬了一下看看,時序圖如下。 正確的時序 錯誤的時序 我這是的是當行計數器記到2 ...
  • 註:本人用Python3.4作為學習版本,以下學習心得只適用於Python3.4。 寫下這篇博客,意味著我即將步入函數式編程的大門。 說起函數,首先想到的莫過於讀書至今依然圍繞在我身邊的那個“函數”。數學計算中的函數,簡單地說,就是對給定數的一種人為約定的運演算法則,將給定的數通過某種變化得到一個新的 ...
  • Dima and Magic Guitar CodeForces - 366E 題意: http://blog.csdn.net/u011026968/article/details/38716425http://vawait.com/2013/11/codeforces-366e/http://w ...
  • 如圖: 在列印等腰三角形基礎之上列印鏤空等腰三角形 列印等腰三角形在此不做贅述,博客地址: http://www.cnblogs.com/realjanushu/p/7576556.html 列印等腰三角形源碼: 在此基礎上觀察 如圖: 鏤空的三角形: 特點頂層與最底層不會鏤空,除了頂層與最底層其他 ...
  • <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <property name="defaultEncoding" value="utf-8 ...
  • 轉載請註明原創出處,謝謝! 經過 4 次跳票,歷經曲折的 Java 9 正式版終於發佈了!今天看著到處都是jdk9發佈了,新特性說明,心想這麼好的蹭熱度計劃能錯過嘛,哈哈,所以就發了這篇文章。 目前jdk9和jvm9的規範都還沒有出來,很多細節估計還不清楚,基本就是通過官方介紹,看的。 所以各位看官 ...
  • 如圖: 第一步:分析行數 4行 迴圈列印4層 第二步:分析 * 的個數 1->3->5->7 2*n-1 第三步:彙總列印直角三角形 第四步: 觀察 (2*n-2)/2 3->2->1 列印0的直角倒三角 第五步:彙總列印等腰三角形 最後將0替換成" "(空格),編譯再運行就好了 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...