標籤:

Python 部署 Restful web

儘力做好自己份內的事,剩下的就交給老天,其實人生如是而已。n ——張德芬《遇見心想事成的自己》n

章節目錄

1. 環境搭建

2. 環境測試

3. 正式幹活

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

Restful 相關介紹請查看:ibm.com/developerworks/

環境搭建

首先需要準備環境

  • need virtualenv python 的沙盒環境--virtualenv (不必須)
  • 這裡使用 virtualenv 來創建一個 Python 環境,用來運行我們稍後的 restful服務端。
  • need flask (必須)

安裝

pip

  • 安裝軟體用
  • 下載地址:pypi.python.org/pypi/pi
  • 下載 pip tar.gz
  • 解壓 tar -xzvf
  • 進入目錄安裝 python setup.py install 即可使用

virtualenv

  • 創建虛擬環境用
  • pip install virtualenv 直接下載安裝
  • 或者 進入 pypi.python.org/pypi/vi 下載 tar 包 和 pip 安裝類似

flask

  • web 框架 重要
  • pip install flask 直接下載安裝
  • 或者 pypi.python.org/pypi/Fl 下載 tar 包 解壓安裝
  • 手動裝需要(install 會自動安裝,如果 linux 虛擬機未聯網,根據提示缺什麼,去安裝什麼):

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

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

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

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

環境測試

創建虛擬環境

選擇一個合適的路徑下 

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

virtualenv web ,做一個名為 Web 的 Python 環境,也可以不要這個環境,直接第二步創建 app.py

目錄如:

新建 app.py

在 bin 中新建 app.py

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

from flask import Flasknnapp = Flask(__name__)nn@app.route(/)ndef index():n return "Hello, Python Flask!"nnif __name__ == __main__:n app.run(host="0.0.0.0",debug=True) n

執行訪問

執行 python app.py

本地訪問(可以新開一個 ssh 進行測試,也可以用 IP 地址( ip 訪問需要綁定0.0.0.0) app.run(host="0.0.0.0",debug=True) 用瀏覽器測試)

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

訪問得到了 Hello, Python Flask!

說明環境搭建成功 success!。

正式幹活

這裡還是使用 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-8n

引入需要的模塊:

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

模擬資料庫數據:

#模擬資料庫 person 屬性 id name age done urlnpersons = [n {n id: 1,n name: uloveincode,n age: 20, n done: False,n url:uloveincode.cnblogs.comn },n {n id: 2,n name: ustrive,n age: 18, n done: False,n url:uloveincode.cnblogs.comn }n] n

GET persons

代碼設計:

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

先執行:python person.py

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

GET person

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

先執行:python person.py

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

錯誤 404 後面一起講。

POST

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

先執行: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 再看所有 添加成功

PUT

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

先執行: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

DELETE

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

先執行:python person.py

test:

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

Error 處理

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

@app.errorhandler(404)ndef not_found(error):n return make_response(jsonify({error: Not found}), 404)nn@app.errorhandler(400)ndef not_found(error):n return make_response(jsonify({error: Request Error}), 400) n

github 地址:github.com/loveincode/p

參考:cnblogs.com/vovlie/p/41

原文鏈接:cnblogs.com/loveincode/

小月兒

推薦閱讀:

如何在visual studio上寫 python?
如果每天堅持用12個小時學習一門編程語言,一年下來,編程能力會達到什麼程度?
Python爬蟲實戰六之抓取愛問知識人問題並保存至資料庫
簡歷中如何證明自己的編程能力?
python如何查看某一個包中的某一個函數的使用方法?

TAG:Python |