我想要创建一个导出按钮,这样当搜索完成后,导出函数可以将搜索结果导出到csv文件中,并将这个csv文件下载到本地机器。我有两个想法,但我不知道哪个更适合CKAN?
search_criteria请求,然后返回json列表,然后在csv中转换json并下载它。在模板文件中,我只需要给出一个类似于<a href="{{h.url_for(request url)}}">Export</a>的URL,但是我必须在plugin.py、controller.py和helpers.py中实现请求的句柄。<a href="request.js">Export</a>。对于这两种想法,我必须添加这个新的url在路线地图和添加响应,转换和下载在控制器和插件。我想知道哪个想法需要更少的修改?
发布于 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
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中传递任何定制的搜索条件。还可以在此控制器中添加转换和下载功能:
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并在后端完全处理请求。
发布于 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提交。:)
https://stackoverflow.com/questions/52042689
复制相似问题