ckan.toolkit.redirect_to 不重定向

ckan.toolkit.redirect_to does not redirect

我目前正在开发一个 ckan 扩展,我需要在其中重定向到另一个域上的 url。

在我的插件中,我定义了一个自定义操作函数:

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

但是当我调用这个端点时,我只得到以下响应:

response screenshot

所以我假设调用了动作函数,但是 redirect_to 调用没有重定向到我定义的 url。

感谢您的帮助! 弗洛里安

很难弄清楚你想要完成什么,但这里有一些我希望能有所帮助的事情。

简答:

不,您不能从 CKAN 中的 API 端点重定向。 CKAN 中的端点响应是建立起来的,并期望从您的操作中得到某些东西。你的行动应该 return 某种结果。在你的情况下,它 return 只是试图重定向。 IActions 的逻辑动作函数与蓝图或塔控制器动作不同。

参见 Making an API request docs, specifically the breakdown of an API response in CKAN. Also, you can review the pylons implementation that builds up the API response or the flask blueprints implementation

更多信息来帮助您的方法:

您说您正在尝试调用一个端点,该端点将用户重定向到另一个域url。基于此考虑以下几点:

  1. 我认为您首先想要的是 url 某人通过您网站的 Web 界面访问并被重定向到另一个网站。在这种情况下,您的 toolkit.redirect_to('http://my.json-builder.com?id=1234') 示例代码是有意义的,并且适用于带有 IRoutes or if you're using flask then IBlueprint 的自定义控制器操作 using/implemented。用户会转到您网站上的 URL,例如 http://localhost.com/download_json,并在其浏览器中被重定向到新的 URL/site。
  2. 如果您打算将此作为对其他用户的 API 调用,这开始感觉有点奇怪。如果用户正在使用您的 API,他们希望从您的网站获得 JSON 的结果,CKAN 的 API 旨在 return 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 获取重定向信息,我可能会 return 重定向 url 作为结果,例如result: {'redirect_url': 'http://my.json-builder.com?id=1234'} 并在您的扩展程序的 API 文档中很好地记录这一点(例如,您为什么要 return 使用此端点,您希望别人用它做什么,等等)。

  3. 如果这是一个 API 调用你自己的扩展,我猜你想做的是使用 my.json-builder.com 来构建一个 json 的东西(数据集可能?)和 return json 作为你端点的结果,或者甚至可能使用结果来做其他事情?如果是这种情况,那么在您的函数中,您可以调用 my.json-builder.com、处理结果并将结果 return 发送给用户。在这种情况下,您实际上并不想将用户重定向到新站点,而是调用新站点以获取一些结果。如果您确实想要扩展的结果,则不需要额外的端点。您可以从您的分机进行调用,使用结果和 return 您尝试创建的所需对象。

希望这对您有所帮助,如果我完全误解了,请见谅。