Python web api

本文是系列的第二篇。

##rest服务 这里有简介 ##json Json

Json与pojo ###Python处理json的库

import json  #基本库
import simplejson  #需用pip安装

Json->python object:

json.loads(string_of_json)

Python object->json:

Json.dumps(json, indent=2) #indent为缩进空格数 

##Requests:http for humans 这里有中文简介

个人认为,requests是对Python价值观最好的体现。

##示例2 pm2.5 问题:寻找可用的api,获取城市的pm2.5及空气质量数据

知识点:用requests写rest客户端

子问题1:寻找可用的api

子问题2: 使用api

子问题3:结果缓存与定时获取

代码如下

#encoding=utf-8
u'''
pm25.py
Usage:
	pm25.py  <cityname>

Options:
	<cityname>  城市名
'''
from docopt import docopt
def wget_pm25(city):
	token="5j1znBVAsnSf5xQyNQyq"
	import requests as r
	result=r.get("http://www.pm25.in/api/querys/pm2_5.json",params={
		"city":city,
		"token":token,
	})
	return result.json()
def needs_refresh(filename,timeout=3600):
	return False
	import os,time
	mtime=os.path.getmtime(filename)
	now=time.time()
	return now-mtime>timeout
def get_pm25(city):
	filename='pm25.data.{}.json'.format(city)
	import os,json
	data=None
	if os.path.isfile(filename) and not needs_refresh(filename):
		data=file(filename,'r').read()
		data=json.loads(data)
	else:
		data=wget_pm25(city)
		if type(data)==type({}):
			print data['error']
			return -1
		else:
			file(filename,'w').write(json.dumps(data,indent=2))
	return data[-1]["pm2_5"]
if __name__ == '__main__':
	args=docopt(__doc__)
	cities=args['<cityname>']
	print get_pm25(args['<cityname>'])

##示例3 使用flask-rest搭建rest服务 flask-rest 是一个使用flash框架搭建rest服务的工具,使用方法如下:

  1. 安装pip,方法见这个网页

  2. pip install flask-restful
  3. hello flask-rest
from flask import Flask
from flask.ext import restful

app = Flask(__name__)
api = restful.Api(app)

class HelloWorld(restful.Resource):
    def get(self):
        return {'hello': 'world'}

api.add_resource(HelloWorld, '/')

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

4.在此基础上调用pm25.py,并且把<cityname>作为http get的参数传递

代码如下:

from flask import Flask
from flask.ext import restful

app = Flask(__name__)
api = restful.Api(app)

class PM25(restful.Resource):
    def get(self,city):
    	import pm25
    	res=pm25.get_pm25(city)
        return {city: res}
api.add_resource(PM25, '/pm25/<string:city>')

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

##思考题2

写一个天气服务

输入:

http://<hostname>/<city_name>

输出json:

{
	"city_name":"beijing", 
	"high_temperature":"5",
	"low_temperature":"-3",
}

数据源可选择如下api:

http://www.thinkpage.cn/weather/api/#all.json

http://li600-131.members.linode.com/mapi/?term=beijing&jsoncallback=jQuery17100569556609261781_1363159265751

http://blog.csdn.net/duxinfeng2010/article/details/7830136

也可以自己找。

##拓展阅读

Python Shortcuts for the Python Beginner

分享