您的位置:首页 > 移动开发

初遇 Google App Engine, 更新问题的解决

2009-01-21 17:34 573 查看
2010.11.25 更新:

最新版本的 GAE SDK 已经解决了该问题。不需要做任何修改,只需设定环境变量即可。具体到 Windows 环境,在命令行输入如下命令:

C:/>set HTTP_PROXY=http://xxx.xxx.xxx.xxx:<port>

C:/>set HTTPS_PROXY=https://xxx.xxx.xxx.xxx:<port>

=======

Google App Engine 提供了统一的web application应用程序接口及托管。它为用户快速构建一个web应用提供了方便的途径。今天初步尝试了一下,用起来很容易。

在代理后更新 App:

由于我们公司访问网络是使用代理方式,起初,无论怎么设置,appcfg.py均返回错误,或长时间无响应。Google了一下,遇到同样问题的同学还不少。最后找到一片文档,有效解决了该问题。方案如下:

首先,编辑文件 google_appengine/google/appengine/tools/appcfg.py

在这个文件中,找到这两行:

response = self.opener.open(req)
response_body = response.read()


将它们替换为如下内容。注意保持原有对齐方式,并将 xxx.xxx.xxx.xxx:0000替换为你实际使用的代理:

opener = urllib2.build_opener(ConnectHTTPHandler, ConnectHTTPSHandler)
urllib2.install_opener(opener)
urlpath = r"https://www.google.com/accounts/ClientLogin?"
urlpath = urlpath + "Passwd="+password
urlpath = urlpath + "&source=Google-appcfg-1.0&accountType=HOSTED_OR_GOOGLE&Email="
urlpath = urlpath + email
urlpath = urlpath + "&service=ah"
req = urllib2.Request(url=urlpath)
req.set_proxy('xxx.xxx.xxx.xxx:0000', 'https')
f = urllib2.urlopen(req)
response_body = f.read()


然后,在同一个目录下 google_appengine/google/appengine/tools/, 建立一个文件 ProxyHTTPConnection.py,内容如下:

# urllib2 opener to connection through a proxy using the CONNECT method, (useful for SSL)
# tested with python 2.4
import urllib2
import urllib
import httplib
import socket

class ProxyHTTPConnection(httplib.HTTPConnection):
_ports = {'http' : 80, 'https' : 443}

def request(self, method, url, body=None, headers={}):
#request is called before connect, so can interpret url and get
#real host/port to be used to make CONNECT request to proxy
proto, rest = urllib.splittype(url)
if proto is None:
raise ValueError, "unknown URL type: %s" % url
#get host
host, rest = urllib.splithost(rest)
#try to get port
host, port = urllib.splitport(host)
#if port is not defined try to get from proto
if port is None:
try:
port = self._ports[proto]
except KeyError:
raise ValueError, "unknown protocol for: %s" % url
self._real_host = host
self._real_port = port
self.set_debuglevel(99)
httplib.HTTPConnection.request(self, method, url, body, headers)

def connect(self):
httplib.HTTPConnection.connect(self)
#send proxy CONNECT request
self.send("CONNECT %s:%d HTTP/1.0/r/n/r/n" % (self._real_host, self._real_port))
#expect a HTTP/1.0 200 Connection established
response = self.response_class(self.sock, strict=self.strict, method=self._method)
(version, code, message) = response._read_status()
#probably here we can handle auth requests...
if code != 200:
#proxy returned and error, abort connection, and raise exception
self.close()
raise socket.error, "Proxy connection failed: %d %s" % (code, message.strip())
#eat up header block from proxy....
while True:
#should not use directly fp probablu
line = response.fp.readline()
if line == '/r/n': break

class ProxyHTTPSConnection(ProxyHTTPConnection):

default_port = 443
def __init__(self, host, port = None, key_file = None, cert_file = None, strict = None):
ProxyHTTPConnection.__init__(self, host, port)
self.key_file = key_file
self.cert_file = cert_file

def connect(self):
ProxyHTTPConnection.connect(self)
#make the sock ssl-aware
ssl = socket.ssl(self.sock, self.key_file, self.cert_file)
self.sock = httplib.FakeSocket(self.sock, ssl)

class ConnectHTTPHandler(urllib2.HTTPHandler):

def __init__(self, proxy=None, debuglevel=9):
self.proxy = proxy
urllib2.HTTPHandler.__init__(self, debuglevel)
def do_open(self, http_class, req):
if self.proxy is not None:
req.set_proxy(self.proxy, 'http')
return urllib2.HTTPHandler.do_open(self, ProxyHTTPConnection, req)
class ConnectHTTPSHandler(urllib2.HTTPSHandler):
def __init__(self, proxy=None, debuglevel=9):
self.proxy = proxy
urllib2.HTTPSHandler.__init__(self, debuglevel)
def do_open(self, http_class, req):
if self.proxy is not None:
req.set_proxy(self.proxy, 'https')
return urllib2.HTTPSHandler.do_open(self, ProxyHTTPSConnection, req)
if __name__ == '__main__':

import sys

proxy = '10.xx.xx.xxx:8080'
opener = urllib2.build_opener(ConnectHTTPHandler(proxy=proxy), ConnectHTTPSHandler(proxy=proxy))
urllib2.install_opener(opener)
urlpath = r"https://www.gmail.com/"
req = urllib2.Request(url=urlpath)
f = urllib2.urlopen(req)
print f.read()


重新运行appcfg.py。一切OK。

问题:

安全性是最重要的问题。一方面,Google 如何保证托管的 App 的安全。另一方面,托管的 App,如何保证用户数据的安全?

参考:

1. http://code.google.com/intl/zh-CN/appengine/

2. http://fasondev.ycool.com/post.2910659.html
3. http://code.activestate.com/recipes/456195/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: