Python 部署 Restful web
儘力做好自己份內的事,剩下的就交給老天,其實人生如是而已。n ——張德芬《遇見心想事成的自己》n
章節目錄
1. 環境搭建
2. 環境測試
3. 正式幹活
使用 Python Web 做 Restful 風格,很簡單,採用 Flask 框架輕鬆實現一個RESTful 的服務。
Restful 相關介紹請查看:https://www.ibm.com/developerworks/library/ws-restful/index.html
環境搭建
首先需要準備環境
- need virtualenv python 的沙盒環境--virtualenv (不必須)
- 這裡使用 virtualenv 來創建一個 Python 環境,用來運行我們稍後的 restful服務端。
- need flask (必須)
安裝
pip
- 安裝軟體用
- 下載地址:https://pypi.python.org/pypi/pip/
- 下載 pip tar.gz
- 解壓 tar -xzvf
- 進入目錄安裝 python setup.py install 即可使用
virtualenv
- 創建虛擬環境用
- pip install virtualenv 直接下載安裝
- 或者 進入 https://pypi.python.org/pypi/virtualenv 下載 tar 包 和 pip 安裝類似
flask
- web 框架 重要
- 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/
環境測試
創建虛擬環境
選擇一個合適的路徑下
我選擇的是 /var/flask 當然可以隨意選擇一個目錄
virtualenv web ,做一個名為 Web 的 Python 環境,也可以不要這個環境,直接第二步創建 app.py
目錄如:
新建 app.py
在 bin 中新建 app.py
app.route 的用法和 Springmvc 的 controller requestmapping 很類似,詳細請查看:http://www.guadong.net/article/2eHheDFm.html
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 地址:https://github.com/loveincode/python-restful-web
參考:http://www.cnblogs.com/vovlie/p/4178077.html原文鏈接:http://www.cnblogs.com/loveincode/p/python_restful_web.html
小月兒
推薦閱讀:
※如何在visual studio上寫 python?
※如果每天堅持用12個小時學習一門編程語言,一年下來,編程能力會達到什麼程度?
※Python爬蟲實戰六之抓取愛問知識人問題並保存至資料庫
※簡歷中如何證明自己的編程能力?
※python如何查看某一個包中的某一個函數的使用方法?
TAG:Python |