Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/202.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在CKAN中为特定REST请求生成自定义URL_Python_Rest_Backend_Ckan - Fatal编程技术网

Python 在CKAN中为特定REST请求生成自定义URL

Python 在CKAN中为特定REST请求生成自定义URL,python,rest,backend,ckan,Python,Rest,Backend,Ckan,我想创建一个导出按钮,以便在搜索完成后,导出功能可以将搜索结果导出到csv文件中,并将此csv文件下载到本地计算机。我有两个想法,但我不知道哪一个是更好的做法在CKAN 给出一个URL,该URL将接收带有搜索条件的请求,并首先返回json列表,然后将json转换为csv格式并下载。在模板文件中,我只需要给出一个URL,比如,但我必须在plugin.py、controller.py和helpers.py中实现请求句柄 给出一个URL,以便处理请求、转换和下载,但在模板文件上,我会将“导出”按钮链接

我想创建一个导出按钮,以便在搜索完成后,导出功能可以将搜索结果导出到csv文件中,并将此csv文件下载到本地计算机。我有两个想法,但我不知道哪一个是更好的做法在CKAN

  • 给出一个URL,该URL将接收带有
    搜索条件的请求,并首先返回json列表,然后将json转换为csv格式并下载。在模板文件中,我只需要给出一个URL,比如
    ,但我必须在
    plugin.py
    controller.py
    helpers.py
    中实现请求句柄
  • 给出一个URL,以便处理请求、转换和下载,但在模板文件上,我会将“导出”按钮链接到请求js文件,如

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

    1对我来说似乎是个不错的选择-您需要使用一些现有的python代码,因此javascript将是更难的选择

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


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

    1对我来说似乎是一个不错的选择-您需要使用一些现有的python代码,因此javascript将是一个更难的选择

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


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

    我选择了第一种方法,效果很好,与第二种方法相比,它保存了我的修改以实现
    export.js

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

    然后在
    plugin.py
    中,您可以在
    IRoutes
    inferface中覆盖
    before\u map
    并在
    before\u 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\u search
    API处理搜索,并在facet query
    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,并在后端完全处理请求。

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

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

    然后在
    plugin.py
    中,您可以在
    IRoutes
    inferface中覆盖
    before\u map
    并在
    before\u 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\u search
    API处理搜索,并在facet query
    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,并在后端完全处理请求。

    谢谢,我还有一个问题是如何将
    fq
    作为搜索参数传递到
    url\u for()
    ?或者你必须调用
    add_param_to_url
    当覆盖
    before_search()
    ?Nvm,我已经在我的答案中添加了我的实现。谢谢,我还有一个问题是如何在
    url_for()
    中传递
    fq
    作为搜索参数?或者,当在搜索()之前覆盖
    时,您必须调用
    add_param_to_url
    ?Nvm,我在回答中添加了我的实现。很好。这引发了更多关于如何实现这一点的讨论:很好。这引发了更多关于如何在此处实施的讨论: