背景:在服务器部署api供前端调用在业界是一种非常常见的做法。基于RESTful API的方式简单清晰,很好的前后端分离实践。
相关软件版本:
服务器是CentOS 6.8 加 nginx,python 是自带的2.6.6,有点低,不过不影响就不升级了。
安装Flask
安装virtualenv:
sudo pip install virtualenv
【或者:sudo apt-get install python-virtualenv
】
【注:virtualenv 是什么?当我们有很多项目且项目要求不同版本的python时,Virtualenv 能够为每个项目安装一套 Python,实现多套 Python 并存。但它不是真正地安装多套独立的 Python 拷贝,而是让不同的项目处于各自独立的环境中。virtualenv xxx 就是给 xxx 目录建立一个独立的环境】
创建环境:
mkdir aidraw_api
virtualenv aidraw_api
在 virtualenv 中安装 Flask:
sudo pip install Flask
写一个 python 脚本:
python ./app_new.py
这个时候显示 “* 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')
测试一下:
curl http://localhost:5000/
显示 “...... "GET / HTTP/1.1" 200 ”,done!
这时候发现一个问题,不是 api 肯定要供外网访问的,根据 Flask 的文档,app.run(host='0.0.0.0')
就是供外网访问的设置。但似乎不行。不虚,我们还有 nginx!在 /etc/nginx/conf.d
新建一个 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!
实战
目标:通过一个图片 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/
发现图片已下载至本地,done!
【附:urllib 和 urllib2 的区别
urllib 和 urllib2 都是接受 URL 请求的相关模块,但是 urllib2 可以接受一个 Request 类的实例来设置 URL 请求的 headers,urllib 仅可以接受 URL。这意味着,你不可以伪装你的 User Agent 字符串等。urllib 提供 urlencode 方法用来GET查询字符串的产生,而urllib2 没有。这是为何 urllib 常和 urllib2 一起使用的原因。目前的大部分 http 请求都是通过 urllib2 来访问的】
结语
搭好环境,开始愉快的开发 api 接口吧!