ckan.toolkit.redirect_to не перенаправляет - PullRequest
0 голосов
/ 26 декабря 2018

В настоящее время я разрабатываю расширение ckan, где мне нужно перенаправить на URL-адрес в другом домене.

В моем плагине я определил функцию настраиваемого действия:

@side_effect_free
def download_json(context, data_dict):
    toolkit.redirect_to('http://my.json-builder.com?id=1234')

Но когда я вызываю эту конечную точку, я просто получаю следующий ответ:

снимок экрана ответа

Итак, я предполагаю, что вызывается функция action, но вызов redirect_to не перенаправляет на определенный мной URL-адрес.

Спасибо за вашу помощь!Florian

1 Ответ

0 голосов
/ 27 декабря 2018

Довольно сложно понять, чего вы пытаетесь достичь, но вот несколько вещей, которые, я надеюсь, помогут.

Краткий ответ:

Нет, вы не можете перенаправить сКонечная точка API в CKAN.Ответ конечной точки в CKAN создан и ожидает определенных действий от вашего действия.Ваше действие должно вернуть какой-то результат.В вашем случае он ничего не возвращает, кроме попытки перенаправить.Функция логического действия с IActions не совпадает с действием контроллера Blueprint или pylons.

См. Создание запроса API документов, в частности разбивка ответа API в CKAN.Кроме того, вы можете ознакомиться с реализацией пилонов , которая создает ответ API, или с реализацией чертежей колб .

Дополнительная информация, чтобы помочь с вашим подходом:

Вы говорите, что пытаетесь вызвать конечную точку, которая перенаправляет пользователя на другой URL-адрес домена.Исходя из этого, рассмотрим следующее:

  1. Первое, что я подумал, что вы хотели, чтобы у вас был URL, через который кто-то переходит через веб-интерфейс вашего сайта и перенаправляется на другой сайт.В этом случае ваш пример кода toolkit.redirect_to('http://my.json-builder.com?id=1234') имеет смысл и работает для пользовательского действия контроллера, использующего / реализованного с помощью IRoutes или, если вы используете колбу, тогда IBlueprint.Пользователь будет переходить по URL на вашем сайте, например http://localhost.com/download_json, и перенаправляться на новый URL / сайт в своем браузере.
  2. Если вы хотите, чтобы это был вызов API для других пользователей, это начинает казаться немного странным.Если пользователь использует ваш API, он будет ожидать получения результатов от вашего сайта в JSON. API CKAN предназначен для возврата JSON.Кто-то, потребляющий вашу конечную точку API, не будет ожидать перенаправления на другой сайт, например, если бы я позвонил http://localhost.com/api/3/action/download_json, я бы ожидал получить объект JSON, такой как

    { help: "http://localhost/api/3/action/help_show?name=download_json", success: true, result: { ... } }

    Они будут искать success, чтобы убедиться, что вызов сработал, и затем они будут использовать result, чтобы продолжать двигаться вперед с желаемыми процессами.Если вы хотите, чтобы кто-то через API получал информацию о перенаправлении, я бы, вероятно, вернул URL-адрес перенаправления, например result: {'redirect_url': 'http://my.json-builder.com?id=1234'}, и задокументировал бы это в документах API вашего расширения (например, почему вы возвращаете эту конечную точку, чего вы ожидаете от кого-точто делать с этим и т. д.).

  3. Если это вызов API для вашего собственного расширения, я предполагаю, что вы пытаетесь сделать, это использовать my.json-builder.com для создания json чего-либо (может быть, набор данных?) и вернуть этот JSON в качестве результата в вашей конечной точке или, может быть, даже использовать результат, чтобы сделать что-то еще?Если это так, то в вашей функции вы можете сделать вызов my.json-builder.com, обработать результаты и вернуть результаты пользователю.В этом случае вы на самом деле не хотите перенаправлять пользователя на новый сайт, а вместо этого звоните на новый сайт, чтобы получить некоторые результаты.Если вы действительно хотите получить результаты для вашего расширения, вам не нужна дополнительная конечная точка.Вы можете позвонить со своего внутреннего номера, использовать результаты и вернуть нужный объект, который вы пытаетесь создать.

Надеюсь, это поможет, и извините, если я полностью не понял.

...