首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在CKAN中为特定的REST请求定制URL

问在CKAN中为特定的REST请求定制URL
EN

Stack Overflow用户
提问于 2018-08-27 15:38:07
回答 2查看 288关注 0票数 0

我想要创建一个导出按钮,这样当搜索完成后,导出函数可以将搜索结果导出到csv文件中,并将这个csv文件下载到本地机器。我有两个想法,但我不知道哪个更适合CKAN?

  1. 给一个URL,这样这个URL将接收到search_criteria请求,然后返回json列表,然后在csv中转换json并下载它。在模板文件中,我只需要给出一个类似于<a href="{{h.url_for(request url)}}">Export</a>的URL,但是我必须在plugin.py、controller.py和helpers.py中实现请求的句柄。
  2. 提供一个URL,以便处理请求、转换和下载,但在模板文件上,我将将“导出”按钮链接到请求js文件,如<a href="request.js">Export</a>。

对于这两种想法,我必须添加这个新的url在路线地图和添加响应,转换和下载在控制器和插件。我想知道哪个想法需要更少的修改?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-08-29 16:08:55

我选择了第一个方法,它工作得很好,与第二个方法相比,它保存了我的修改以实现export.js。

您可以在url,template/search.html中添加任何搜索条件。

<a href={{h.url_for("/export", search_criteria='random string', ...)}}></a>

然后,在plugin.py中,您可以在IRoutes下位覆盖before_map,并在before_map中添加URL

代码语言:javascript
复制
class ExportPlugin(plugins.SingletonPlugin):
    plugins.implements(plugins.IRoutes, inherit=True)

    def before_map(self, m):
        m.connect('export', '/export', 
              controller='ckanext.my_export_plugin.controller:ExportController',
              action='export')

然后,在controller.py中,您可以继承BaseController,这样就可以通过package_search API处理搜索,并在facet查询fq中传递任何定制的搜索条件。还可以在此控制器中添加转换和下载功能:

代码语言:javascript
复制
class ExportController(base.BaseController):

    def json_to_csv(original_json):
        '''
        Other Implementation of convertion
        '''
        return csv.read()

    def export(self, data):
        '''
        Other Implementation of handling search operation
        '''
        search_results = toolkit.get_action('package_search')(data_dict=data)
        file_name = "export.csv"
        response.headers['Content-Type'] = 'application/csv'
        response.headers['Content-Disposition'] = file_name
        return json_to_csv(search_results)

在您自己实现之后,您应该能够为REST服务定制url并在后端完全处理请求。

票数 1
EN

Stack Overflow用户

发布于 2018-08-27 20:08:41

对我来说,1似乎是一个很好的选择--您需要使用一些现有的python代码,所以javascript将是一个更难的选项。

搜索结果由search()方法中的包控制器( CKAN 2.9中的dataset视图)生成。它接受查询字符串,对包含搜索参数(例如SOLR、q和fq参数)的data_dict进行一些转换。使用这些参数调用package_search逻辑函数,并以JSON的形式返回搜索结果列表。现在,在控制器中,在呈现模板网页时使用JSON,但在您的示例中,您希望将其转换为CSV并返回它。因此,您可以将控制器search()代码复制并粘贴到您自己的CKAN扩展中,将所需的内容序列化到CSV并返回它。

或者更好的是,你可以做一个解决方案,让每个人使用。在search()旁边添加一个控制器方法,并将搜索方法所需的代码分解到他们都调用的单独方法中。将其添加为模板底部的链接,并将其作为PR提交。:)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52042689

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档