我目前正在开发一个ckan扩展名,在这里我需要重定向到另一个域上的url。
在我的插件中,我定义了一个自定义动作函数:
@side_effect_free
def download_json(context, data_dict):
toolkit.redirect_to('http://my.json-builder.com?id=1234')
但是当我调用此端点时,我只会得到以下响应:
因此,我假定已调用动作函数,但redirect_to调用不会重定向到我定义的网址。
感谢您的帮助! 弗洛里安
答案 0 :(得分:0)
弄清楚您要完成的目标有点困难,但是我希望这对您有所帮助。
否,您无法从CKAN中的API端点重定向。 CKAN中的端点响应已建立,并期望您的操作中能做出某些反应。您的操作应返回某种结果。在您的情况下,除了尝试重定向外,它什么也不返回。带有IActions
的逻辑动作函数与“蓝图”或“铁塔”控制器动作不同。
请参阅Making an API request文档,特别是CKAN中API响应的细分。另外,您可以查看构建API响应的pylons implementation或flask blueprints implementation。
您说您正在尝试调用将用户重定向到另一个域URL的终结点。基于此,请考虑以下内容:
toolkit.redirect_to('http://my.json-builder.com?id=1234')
是有意义的,并且适用于使用IRoutes
或由其实现的自定义控制器动作,或者如果您使用的是flask,则使用IBlueprint
。用户将转到您网站上的URL,例如http://localhost.com/download_json
,并在其浏览器中被重定向到新的URL /网站。 如果您打算将其作为其他用户的API调用,这会开始有些奇怪。如果用户使用您的API,则他们希望使用JSON来从您的网站获取结果CKAN的API旨在返回JSON。消耗您API端点的人不会期望重定向到另一个站点,例如如果我叫http://localhost.com/api/3/action/download_json
,我希望得到一个
{
help: "http://localhost/api/3/action/help_show?name=download_json",
success: true,
result: {
...
}
}
他们会寻找success
以确保该呼叫能够正常工作,然后他们会使用result
继续进行所需的过程。如果您确实希望某人通过API获得重定向信息,则可能会返回重定向网址,例如result: {'redirect_url': 'http://my.json-builder.com?id=1234'}
并将其很好地记录在扩展程序的API文档中(例如,为什么要返回此终结点,您希望某人对此做什么等)。
my.json-builder.com
来构建某个内容的json(也许是数据集?),并将该json作为结果返回给您的端点,甚至可能消耗结果来做其他事情?在这种情况下,您可以在函数中调用my.json-builder.com
,处理结果并将结果返回给用户。在这种情况下,您实际上并不想将用户重定向到新站点,而是打电话到新站点以获得一些结果。如果您确实想要扩展的结果,则不需要其他端点。您可以通过分机拨打电话,使用结果并返回您要创建的所需对象。希望这会有所帮助,如果我完全错过了理解的话,对不起。