Google app engine 本地单元测试Google云存储签名URL

Google app engine 本地单元测试Google云存储签名URL,google-app-engine,google-cloud-storage,google-app-engine-python,Google App Engine,Google Cloud Storage,Google App Engine Python,我正在使用appengine编写一个新的应用程序,正如文档建议不要使用blobstoreapi一样,我正在使用googlecloudstorageclient(GCS)。一切都很好,但我希望能够返回“签名URL”给客户端,这样他们就可以在不通过应用程序的情况下获得GCS资源。我相信这就是图章URL的用途 但是如何测试呢?我可以成功地测试来自客户端的GCS调用,但我不知道如何使用urlfetch测试客户端的HTTP调用 下面是一个完整的测试用例,说明了我的问题: 导入base64 导入模拟类型 导

我正在使用appengine编写一个新的应用程序,正如文档建议不要使用blobstoreapi一样,我正在使用googlecloudstorageclient(GCS)。一切都很好,但我希望能够返回“签名URL”给客户端,这样他们就可以在不通过应用程序的情况下获得GCS资源。我相信这就是图章URL的用途

但是如何测试呢?我可以成功地测试来自客户端的GCS调用,但我不知道如何使用urlfetch测试客户端的HTTP调用

下面是一个完整的测试用例,说明了我的问题:

导入base64
导入模拟类型
导入URL库
导入urllib2
从datetime导入datetime,timedelta
导入时间
从google.appengine.api导入应用程序_identity
从google.appengine.datastore导入datastore\u stub\u util
从google.appengine.ext导入测试床
从google.appengine.ext导入ndb
导入单元测试
导入云存储
#是这样吗?
地面军事系统API访问终端http://localhost:8000/_ah/gcs'
def sign_url(bucket_对象,在_秒=60后过期):
“”“cloudstorage已签名url,无需登录即可下载cloudstorage对象。”
文件:https://cloud.google.com/storage/docs/access-control?hl=bg#Signed-网址
应用程序编程接口:https://cloud.google.com/storage/docs/reference-methods?hl=bg#getobject
"""
#资料来源:https://github.com/voscausa/appengine-gcs-signed-url/blob/05b8a93e2777679d40af62cc5ffce933216e6a85/sign_url.py
方法='GET'
gcs_filename=urllib.quote(bucket_对象)
content\u md5,content\u type=None,None
#过期:自纪元起的秒数
expiration\u dt=datetime.utcnow()+timedelta(秒=秒后过期)
expiration=int(time.mktime(expiration\u dt.timetuple())
#生成要签名的字符串。
签名\u字符串='\n'。加入([
方法,,
内容_md5或“”,
内容类型或“”,
str(到期日),
gcs_文件名])
signature\u bytes=app\u identity.signature\u blob(signature\u string)[1]
google\u access\u id=app\u identity.get\u service\u account\u name()
#设置正确的查询参数。我们使用gae服务帐户作为id
query_params={'GoogleAccessId':谷歌访问id,
“过期”:str(过期),
“签名”:base64.b64编码(签名字节)}
#返回构建的URL。
结果='{endpoint}{resource}?{querystring}'。格式(endpoint=GCS\u API\u ACCESS\u endpoint,
资源=gcs\U文件名,
querystring=urllib.urlencode(查询参数))
返回结果
FILE\u DATA=“这是文件内容。”
MIME=“text/plain”
类TestGCS(unittest.TestCase):
def设置(自):
self.testbed=testbed.testbed()
self.testbed.activate()
self.policy=datastore\u stub\u util.pseudorandomhr一致性策略(概率=0)
self.testbed.init\u数据存储\u v3\u存根(一致性\u策略=self.policy)
self.testbed.init_app_identity_stub()
self.testbed.init_memcache_stub()
self.testbed.init_urlfetch_stub()
self.testbed.init\u blobstore\u stub()
ndb.get_context().清除_缓存()
def拆卸(自):
self.testbed.deactivate()
def测试地面军事系统工作(自身):
使用cloudstorage.open('/mybucket/test.txt',w',content_type=MIME)作为f:
f、 写入(文件和数据)
将cloudstorage.open('/mybucket/test.txt',r')作为f:
data=f.read()
打印(数据)
self.assertEqual(数据、文件和数据)
def测试签名URL(自身):
url=sign_url('/mybucket/test.txt'))
#FIXME:还没有工作,因为我们不知道如何在测试期间访问本地地面军事系统。
结果=urllib2.urlopen(url)
self.assertEqual(200,结果代码)
self.assertEqual(文件\u数据,result.read())

您可以在SDK中测试GCS和服务\u帐户,但在使用签名url时,您没有本地appengine GCS服务

但你可以用服务账户和谷歌云服务测试你的本地应用

服务帐户使授权appengine请求到其他Google API和服务变得非常容易

要在appengine SDK中使用服务帐户,您必须在以下情况下添加两个未记录的选项:

  • --appidentity\u email\u address=
  • --appidentity\u private\u key\u path=
  • 更多信息请访问

    您可以在appengine云项目的中创建或查找服务帐户。
    您可以为服务帐户创建并下载p12密钥

    使用OpenSSL将此p12密钥转换为RSA pem密钥

    我用过窗户

    要在Windows中创建pem密钥文件,请使用:

    opensslpkcs12-in-nocerts-nodes-passin-pass:notasecret | openssl rsa-out


    现在,您可以在开发服务器中使用云应用服务帐户,并使用来签署和授权请求。

    GCS\u API\u ACCESS\u ENDPOIND没有本地端点。您只能使用:。您的test_gcs_works()@voscausa使用的本地/SDK Google云存储客户端库是否为endpont?您的意思是我无法从本地开发测试gcs HTTP访问?test_gcs_works只使用cloudstorage api,但我需要测试HTTP访问。我打算在应用程序中做的是将用户重定向到我创建的签名url,这样我就不必直接从应用程序请求周期中提供文件。您可以在SDK中测试GCS和service_帐户,但是,当您使用签名url时,您没有本地appengine GCS服务。newbie-meta问题:如何将此评论标记为该帖子的正确答案(或者你可以发布一个回答,说明GCS URL无法测试,只能进行API调用吗?thx。我知道有服务帐户,但这只允许对Google live服务器进行测试,这有违本地测试的目的。根据你之前的评论,目前没有办法对GCS URL进行本地测试,只有