GAE应用间通过urlfetch通信

last modified : 2015-04-06 | published: 2016-04-20 | category:

一个App拆分成多个App,是最简单的,倍翻利用app engine的方法,但涉及到应用间通信的问题。

在被请求的应用上实施访问控制

官方文档在此,介绍了被请求端,利用请求端urlfetch产生的headers中X-Appengine-Inbound-Appid字段来限制来源,特别注意:在请求端,需要在urlfetch请求过程中,使用follow_redirects = False

server:

import webapp2
ALLOWED_APP_IDS = ('cp-thre-pio', 'r-two-deetu')

class AssertIDHandler(webapp2.RequestHandler):
    def dispatch(self):
        app_id = self.request.headers.get('X-Appengine-Inbound-Appid', None)

        if app_id in ALLOWED_APP_IDS:
            # do something ...
        else:
            self.abort(403)</pre>

client:

result = urlfetch.fetch(url="http://*.appspot.com/xxx",
                        payload=form_data,
                        method=urlfetch.POST,
                        headers={'Content-Type': 'application/x-www-form-urlencoded'},
                        follow_redirects=False)

使用什么格式最效率?

我的测试结果如下。

marshal取胜,而且处理utf-8更舒服一些,但切记marshal不能用于两个不同版本的python之间序列化数据。

如果使用json,要随时注意编码:

form_fields = {
    "something": self.request.get("something", default_value="").encode("utf-8"),
}
form_data = urllib.urlencode(form_fields)
result = urlfetch.fetch(url=SOME_URL,
                        payload=form_data,
                        method=urlfetch.POST,
                        headers={'Content-Type': 'application/x-www-form-urlencoded'})
self.response.headers['Content-Type'] = 'application/json'
self.response.out.write(result.content)