2013-05-13 2 views
3

Я попытался получить раздел значков, содержащий мои собственные значки, а не поисковые запросы Google, пытаясь установить патч обезьяны ApiConfigGenerator.get_descriptor_defaults. К сожалению, они игнорируются/отбрасываются, когда документ обнаружения завершен.Как я могу указать свои собственные значки, чтобы они отображались в документе обнаружения API Google Endpoints?

{ 
"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": { 

Как мне обойти это, если вообще?

+1

Большой вопрос @sstriker. Заглядывая в него прямо сейчас :) – bossylobster

ответ

2

Это не поддерживается в библиотеке google.appengine.api.endpoints, но возможно, если вы укажете icon16 и icon32 в конфигурации API. Для этого вы можете обезглавить патч 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. Надеюсь это поможет.

+0

Спасибо за ответ @bossylobster; Я должен был сделать свой вопрос более полным, поскольку патч обезьяны был чем-то, что у меня было. В этом драгоценном камне используются «icon16» и «icon32». Я ошибочно предположил следующее, посмотрев документ о возможном открытии: дескриптор ['icons'] = { "x16": "http://example.com/s/16x16_transparent.png", "x32": "http://example.com/s/32x32_transparent.png", } – sstriker

+0

Действительно. Отображение конфигурации API обычно отличается от документа обнаружения. Я рад, что вы задаете больше вопросов, когда придумываете их. Мы надеемся документировать конфигурацию API полностью, так что это проще сделать. – bossylobster

Смежные вопросы