由于JSONP强大的跨域访问功能,发现tornado没有对jsonp的默认支持,还好tornado是开源的,就简单实现了一个JSONPHandler,对一切JSONP请求进行封装。
对于jsonp跨域见上一篇文章
tornado对于jsonp的封装主要在finish的时候返回的json是对前端页面js的调用
import json
from functools import wraps
def jsonp(func):
"Wraps JSONfiled output for JSONP requests."
@wraps(func)
def decorated_func(*args, **kwargs):
# First argument always be the requestHandler
requestHandler = args[0]
callback = requestHandler.get_argument('callback', False)
data = json.dumps(func(*args, **kwargs))
content = str(callback) + '(' + data + ')' if callback else data
requestHandler.write(content)
requestHandler.finish()
return decorated_func
在tornado中可是直接使用函数修饰,对返回的数据做jsonp的处理
from tools import jsonp
class AnalyzeDomainIp(tornado.web.RequestHandler):
@jsonp
def get(self, collection='todayDomain', domain=''):
return datacenter.get_domain_detail_ip(collection, domain)
$.getJSON('http://www.server.com:8081/jsonp/helloword?jsonp=?', function(data) {
$('#get-console').html(data['josnp-get']);
});