【问题标题】:Web2Py - generic view for csv?Web2Py - csv 的通用视图?
【发布时间】:2019-08-29 22:01:56
【问题描述】:

对于 web2py,有通用视图,例如对于 JSON。

我找不到样品。

查看 web2py 手册 10.1.2 和 10.1.6 时,它写道: '.. 定义一个“generic.csv”文件,但必须指定要序列化的对象的名称(示例中为“animals”)'

查看通用 pdf 视图

{{
import os
from gluon.contrib.generics import pdf_from_html
filename = '%s/%s.html' % (request.controller,request.function)
if os.path.exists(os.path.join(request.folder,'views',filename)):
  html=response.render(filename)
else:
  html=BODY(BEAUTIFY(response._vars))
pass
=pdf_from_html(html)
}}

还有指定的 csv(手册章节 10.1.6):

{{
import cStringIO
stream=cStringIO.StringIO() animals.export_to_csv_file(stream)     
response.headers['Content-Type']='application/vnd.ms-excel'  
response.write(stream.getvalue(), escape=False)
}}

Massimo 正在写:'web2py 不提供“generic.csv”;'

他并不完全反对,但是..

因此,让我们尝试获取它并在必要时停用它。 通用视图应类似于(非工作) (好吧,我们最好将其称为伪代码,因为它不起作用):

{{
import os
from gluon.contrib.generics export export_to_csv_file(stream)
filename = '%s/%s' % (request.controller,request.function)
if os.path.exists(os.path.join(request.folder,'views',filename)):
  csv=response.render(filename)
else:
  csv=BODY(BEAUTIFY(response._vars))
pass
= export_to_csv_file(stream)
}}

怎么了? 或者有样品吗? 没有通用的 csv 是否有道理?

【问题讨论】:

    标签: csv web2py


    【解决方案1】:
    {{
    import os
    from gluon.contrib.generics export export_to_csv_file(stream)
    filename = '%s/%s' % (request.controller,request.function)
    if os.path.exists(os.path.join(request.folder,'views',filename)):
      csv=response.render(filename)
    else:
      csv=BODY(BEAUTIFY(response._vars))
    pass
    = export_to_csv_file(stream)
    }}
    

    按字面意思调整generic.pdf 代码对CSV 输出不起作用,因为generic.pdf 代码首先执行标准HTML 模板,然后简单地将生成的HTML 转换为PDF。这种方法对 CSV 没有意义,因为 CSV 需要特定结构的数据。

    如文档中所述:

    请注意,也可以定义一个“generic.csv”文件,但可以 必须指定要序列化的对象的名称(“动物”在 这个例子)。这就是我们不提供“generic.csv”文件的原因。

    视图的执行由返回字典的控制器操作触发。字典的键在视图执行环境中可用作变量(整个字典也可用作response._vars)。如果要创建 generic.csv 视图,则需要就返回的字典中的变量以及返回数据的可能结构建立一些约定。

    例如,控制器可以返回类似dict(data=mydata) 的内容。然后 generic.csv 中的代码将访问 data 变量并将其转换为 CSV。在这种情况下,必须有一些关于 data 结构的约定——也许它可能需要是一个字典列表或 DAL Rows 对象(或任意一个)。

    另一个可能的约定是控制器返回类似dict(columns=mycolumns, rows=myrows) 的内容,其中columns 是列名列表,rows 是包含每行数据的列表列表。

    关键是,对于控制器可能返回的内容以及如何将其转换为 CSV,没有通用约定,因此您首先需要确定一些约定,然后相应地编写 generic.csv。

    例如,这是一个非常简单的 generic.csv,它仅在控制器返回 dict(rows=myrows) 时才有效,其中 myrows 是 DAL Rows 对象:

    {{
    import cStringIO
    stream=cStringIO.StringIO() rows.export_to_csv_file(stream)     
    response.headers['Content-Type']='application/vnd.ms-excel'  
    response.write(stream.getvalue(), escape=False)
    }}
    

    【讨论】:

      【解决方案2】:

      我试过了:

      # Sample from Web2Py manual 10.1.1 Page 464
      def count():
        session.counter = (session.counter or 0) + 1 
        return dict(counter=session.counter, now = request.now)
      
      #and my own creation from a SQL table (if possible used for json and csv):
      def csv_rt_bat_c_x():
        battdat = db().select(db.csv_rt_bat_c.rec_time, db.csv_rt_bat_c.cellnr,   
        db.csv_rt_bat_c.volt_act, db.csv_rt_bat_c.id).as_list()
      return dict(battdat=battdat)
      

      尝试使用 csv 时出现错误。它适用于 /default/count.json 但不适用于 /default/count.csv

      我想要求:

      dict(rows=myrows)
      

      “其中 myrows 是 DAL Rows 对象”不满足。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-03
        相关资源
        最近更新 更多