背景:在服務(wù)器部署api供前端調(diào)用在業(yè)界是一種非常常見的做法掸驱×樵伲基于RESTful API的方式簡(jiǎn)單清晰笼蛛,很好的前后端分離實(shí)踐。
相關(guān)軟件版本:
服務(wù)器是CentOS 6.8 加 nginx顾画,python 是自帶的2.6.6,有點(diǎn)低匆笤,不過不影響就不升級(jí)了研侣。
安裝Flask
安裝virtualenv:
sudo pip install virtualenv
【或者:sudo apt-get install python-virtualenv
】
【注:virtualenv 是什么?當(dāng)我們有很多項(xiàng)目且項(xiàng)目要求不同版本的python時(shí)炮捧,Virtualenv 能夠?yàn)槊總€(gè)項(xiàng)目安裝一套 Python庶诡,實(shí)現(xiàn)多套 Python 并存。但它不是真正地安裝多套獨(dú)立的 Python 拷貝咆课,而是讓不同的項(xiàng)目處于各自獨(dú)立的環(huán)境中末誓。virtualenv xxx 就是給 xxx 目錄建立一個(gè)獨(dú)立的環(huán)境】
創(chuàng)建環(huán)境:
mkdir aidraw_api
virtualenv aidraw_api
在 virtualenv 中安裝 Flask:
sudo pip install Flask
寫一個(gè) python 腳本:
python ./app_new.py
這個(gè)時(shí)候顯示 “* Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)”
#!flask/bin/python
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
return "Hello, World!"
if __name__ == '__main__':
app.run(host='0.0.0.0')
測(cè)試一下:
curl http://localhost:5000/
顯示 “...... "GET / HTTP/1.1" 200 ”,done书蚪!
這時(shí)候發(fā)現(xiàn)一個(gè)問題喇澡,不是 api 肯定要供外網(wǎng)訪問的,根據(jù) Flask 的文檔殊校,app.run(host='0.0.0.0')
就是供外網(wǎng)訪問的設(shè)置撩幽。但似乎不行。不虛,我們還有 nginx窜醉!在 /etc/nginx/conf.d
新建一個(gè) server:
server {
listen 80;
server_name api.xxx.cn;
location / {
root xxx;
proxy_pass http://127.0.0.1:5000;
}
error_page 500 502 503 504 /50x.html;
}
這獸宪萄,瀏覽器敲下 api.xxx.cn
,看到“hello world榨惰!”拜英,done!
實(shí)戰(zhàn)
目標(biāo):通過一個(gè)圖片 id琅催,將圖片保存至本地居凶。
#!flask/bin/python
from flask import Flask, jsonify, request
import urllib2
app = Flask(__name__)
@app.route('/')
def index():
return "this is a server_name for api."
@app.route('/xxx/v1.0/pic_id', methods=['POST'])
def post_pic_id():
if not request.json or not 'pic_id' in request.json:
abort(400)
pic_id_str = "http://xxx/input/" + request.json['pic_id'] + ".jpeg"
pic_path = "/home/xxx/" + request.json['pic_id'] + ".jpeg"
f = open(pic_path,'wb')
data = urllib2.urlopen(pic_id_str)
f.write(data.read())
f.close()
return pic_id_str, 200
if __name__ == '__main__':
app.run(host='0.0.0.0')
curl -i -H "Content-Type: application/json" -X POST -d '{"pic_id":"00000000000021euAlQpm1RP92f-txh_bcrMCaKKJxCuBrzoJTXi8VG_LD5nF30e9kMAMF-F8cs8W"}' http://xxx/v1.0/pic_id
打開 /home/xxx/
發(fā)現(xiàn)圖片已下載至本地,done藤抡!
【附:urllib 和 urllib2 的區(qū)別
urllib 和 urllib2 都是接受 URL 請(qǐng)求的相關(guān)模塊侠碧,但是 urllib2 可以接受一個(gè) Request 類的實(shí)例來設(shè)置 URL 請(qǐng)求的 headers,urllib 僅可以接受 URL缠黍。這意味著弄兜,你不可以偽裝你的 User Agent 字符串等。urllib 提供 urlencode 方法用來GET查詢字符串的產(chǎn)生瓷式,而urllib2 沒有替饿。這是為何 urllib 常和 urllib2 一起使用的原因。目前的大部分 http 請(qǐng)求都是通過 urllib2 來訪問的】
結(jié)語(yǔ)
搭好環(huán)境贸典,開始愉快的開發(fā) api 接口吧视卢!