3

我试图让图标部分包含我自己的图标,而不是通过尝试猴子补丁来谷歌搜索ApiConfigGenerator.get_descriptor_defaults。不幸的是,当发现文档最终确定时,这些被忽略/丢弃。

{
 "kind": "discovery#restDescription",
 "etag": "...",
 "discoveryVersion": "v1",
 "id": "acme:v1",
 "name": "acme",
 "version": "v1",
 "description": "Acme API",
 "ownerDomain": "google.com",
 "ownerName": "Google",
 "icons": {
  "x16": "http://www.google.com/images/icons/product/search-16.gif",  # <-- acme icon url here!
  "x32": "http://www.google.com/images/icons/product/search-32.gif"   # <--
 },
 "protocol": "rest",
 "baseUrl": "http://acme.appspot.com/_ah/api/acme/v1/",
 "basePath": "/_ah/api/acme/v1/",
 "rootUrl": "http://acme.appspot.com/_ah/api/",
 "servicePath": "acme/v1/",
 "batchPath": "batch",
 "parameters": {

如果有的话,我该如何解决这个问题?

4

1 回答 1

2

库中尚不支持此功能,google.appengine.api.endpoints但如果您在 API 配置中指定icon16,则可以使用。icon32为此,您可以pretty_print_config_to_json对类上的方法进行猴子修补ApiConfigGenerator,或者将其子类化并在google.appengine.ext.endpoints.api_config模块中对类进行猴子修补。

例如,我们在猴子修补模块之前导入模块并保存原始类:

import json
from google.appengine.ext.endpoints import api_config
OriginalConfigGenerator = api_config.ApiConfigGenerator

然后我们定义一个子类来替换它:

class NewConfigGenerator(OriginalConfigGenerator):

然后覆盖生成 API 配置的方法:

  def pretty_print_config_to_json(self, services, hostname=None):
    descriptor = super(NewConfigGenerator, self).pretty_print_config_to_json(
        services, hostname=hostname)
    descriptor = json.loads(descriptor)

一旦你有了配置字典,你就可以添加你自己的键并返回它:

    descriptor['icon16'] = 'YOUR-16x16-ICON-LINK'
    descriptor['icon32'] = 'YOUR-32x32-ICON-LINK'
    # This will be slower than overwriting __api_descriptor
    # due to the json.parse/json.loads having to occur twice
    # but hacking around private methods is a pain.
    return json.dumps(descriptor, sort_keys=True, indent=2)

最后,确保在实际创建 API 之前对模块进行修补:

api_config.ApiConfigGenerator = NewConfigGenerator

例如,这可以通过将这个猴子补丁放在一个文件中monkey_patch.py,然后使用

import monkey_patch

在定义 API 类的文件中。希望这可以帮助。

于 2013-05-16T21:22:04.317 回答