netbox 导出 csv 中文乱码、时区修改

NetBox是IP地址管理(IPAM)和数据中心基础结构管理(DCIM)工具。 NetBox最初是由的网络工程团队构想的,它是专门为满足网络和基础架构工程师的需求而开发的。

项目地址:https://github.com/netbox-community/netbox


Netbox CSV 导出中文乱码

解决办法

修改文件:./netbox/netbox/netbox/views/generic.py

修改内容:

# 1. 在 import 语句后面添加一个新的类,重写父类 `TableExport`
...
class TableExport2(TableExport):
    def response(self, filename=None):
        response = HttpResponse(content_type="text/csv; charset=utf-8-sig")
        if filename is not None:
            response["Content-Disposition"] = 'attachment; filename="{}"'.format(filename)
        response.write(self.export())
        return response

# 2. 修改 export_table 方法(大约在文件 200 行左右)让其使用重写的类来实例化
class ObjectListView(ObjectPermissionRequiredMixin, View):
    ...
    # 
    def export_table(self, table, columns=None):
        ...
        exporter = TableExport2(
            export_format=TableExport.CSV,
            table=table,
            exclude_columns=exclude_columns
        )
        ...

修改文件后,重启 netbox 服务。如果是容器部署,重启 netbox-docker_netbox_1 容器(暴露端口的那个容器)。

解决过程记录

Django 导出 csv 文件乱码,一般是编码格式的问题,可以参考:解决 Django 导出 csv 乱码问题,根据这篇文章,思路就是只需要修改 HttpResponsecharset 就行了。

在 url.py 中搜索 export 相关字样,发现没有相关路由。

在从 export 的 html 中可以看到,它是直接把 export 传给了后端。

<li><a class="dropdown-item" href="?{% if url_params %}{{ url_params.urlencode }}&{% endif %}export">All 

后端处理的时候肯定是需要解析这个字段的,在 views.py 中搜索,发现定义了 export 的按钮,是继承自 generic.ObjectListView 的,所以这个方法应该是定义在 generic.ObjectListView 中。

class ConsolePortListView(generic.ObjectListView):
    queryset = ConsolePort.objects.all()
    filterset = filtersets.ConsolePortFilterSet
    filterset_form = forms.ConsolePortFilterForm
    table = tables.ConsolePortTable
    action_buttons = ('import', 'export')

在 generic 中找到如下方法,证明前端 export 传过来的参数是由 export_table 来处理:

       ...
        if 'export' in request.GET:

            # Export the current table view
            if request.GET['export'] == 'table':
                table = self.get_table(request, permissions)
                columns = [name for name, _ in table.selected_columns]
                return self.export_table(table, columns)
    ...
    def export_table(self, table, columns=None):
        """
        Export all table data in CSV format.

        :param table: The Table instance to export
        :param columns: A list of specific columns to include. If not specified, all columns will be exported.
        """
        exclude_columns = {'pk'}
        if columns:
            all_columns = [col_name for col_name, _ in table.selected_columns + table.available_columns]
            exclude_columns.update({
                col for col in all_columns if col not in columns
            })
        exporter = TableExport(
            export_format=TableExport.CSV,
            table=table,
            exclude_columns=exclude_columns
        )
        return exporter.response(
            filename=f'netbox_{self.queryset.model._meta.verbose_name_plural}.csv'
        )

可以看到这个方法返回了一个 response 对象,修改这个对象的 charset:

    def export_table(self, table, columns=None):
        ...
        response = exporter.response(
            filename=f'netbox_{self.queryset.model._meta.verbose_name_plural}.csv'
        )
        response.charset = "utf-8-sig"
        return response

修改之后,发现前端页面中,确实增加了 charset 且值正确,但是导出的文件仍为乱码。

分析 exporter.response 这个对象——来自于 django-tables2 插件,初始化 TableExport 时里面使用了 export_format=TableExport.CSV,这里指定了 csv 格式

    exporter = TableExport(
        export_format=TableExport.CSV,
        table=table,
        exclude_columns=exclude_columns
    )
 

之后调用了这个类的 response 方法:

    def response(self, filename=None):
        response = HttpResponse(content_type=self.content_type())
        if filename is not None:
            response["Content-Disposition"] = 'attachment; filename="{}"'.format(filename)

        response.write(self.export())
        return 

通过分析这个类,发现这里 self.content_type() 调用的是传入的 self.format,即 export_format=TableExport.CSV 值为 ‘csv’。
由于这个值会被 tablib 这个库调用(类中的 self.export()方法调用),所以不能重写这个字段来实现。

response 方法也不支持传参,所以这里的 csv 编码格式是写死的,即:"text/csv; charset=utf-8"

而且 response.write(self.export()) 写入对象时已经是 utf-8 了,写入完成之后再修改编码也没有任何意义。

最后思考的结果是:在 netbox 的 generic.py 中重写 def response(self, filename=None): 方法,固定其编码为 utf-8-sig

因为 netbox 的导出只使用了 csv 格式,所以把编码格式固定不会对 netbox 运行造成影响,只是修改了导出的格式。

最终解决方法见上方。

Netbox 时区修改

容器部署的情况下,修改文件: ./netbox-docker/configuration/extra.py

TIME_ZONE = 'Asia/Shanghai'

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
产品介绍   NetBox 是一个全新概念的开发平台,它提供了业界最快速的用于开发 Internet 商业应用的开发和编译工具。NetBox 支持包括 JavaScript、VBScript、Perl 等目前应用最为广泛的脚本语言来构建功能强大和性能稳定的应用服务器、网络服务器以及 HTML-Based 网络多媒体桌面应用。NetBox 支持目前最为流行的 XML 和 Web Service 工业标准和 ASP、COM、.NET 等流行标准,NetBox 对第三方数据库的完美支持使您新构建的商务应用可以容易的将已有的应用系统整合进来,从而充分利用现有的 IT 资源,大大的节约投资。NetBox 提供的 SSL、TLS 安全协议、RSA、DES 等加密算法和独立于应用程序的虚拟机技术使您的数据得到最大限度的保护。NetBox 提供将应用部署到无线设备的能力。NetBox 提供将您的应用编译成独立可执行文件的能力,极大的加快运行速度和代码安全性。使用 NetBox 开发,大大提高了应用系统的可扩展性、稳定性和安全性。NetBox 的出现也首次让应用软件开发商能够如此快速和容易的构建完整的基于 Internet 强大应用。   NetBox Development Platform 开发 Server Application 和 Desktop Application,编译 Web 应用成独立可执行文件: 支持 JavaScript、VBScript、Perl 等脚本语言 支持 XML 和 Web Service 兼容 Active Server Pages 支持 COM 和 .NET 组件 支持 SSL 3.0、TLS 内置 RSA、DES、3DES、SHA、MD5 提供可编程的安全虚拟机用于运行第三方程序 支持通过 ADO 和 ODBC 访问几乎所有的大型数据库 支持系统硬件设备 RS232、RS485 等 支持基于 Microsoft、CISCO 和其他厂商的群集技术 兼容 Windows Script Components 并提供编译支持 支持 WAP、WML 构建 Web Service 和 Internet 应用程序   NetBox 提供一套完整的脚本语言开发环境,提供超轻量脚本引擎和极快的 Web Server,桌面应用对象轻松开发出基于 HTML 界面整合多种媒体的 XML 桌面应用。   NetBox 提供 Microsoft IIS 5.0 兼容的 Active Server Pages 模块,不用修改代码直接将已经存在的使用 ASP 开发的应用程序移植到 NetBox 平台上来,也可以直接使用已经存在所有 COM 组件。通过修改一部分代码,用 NetBox 的高性能对象大大的提高运行速度。区别于 IIS,NetBox 在 ASP 中加入对 .NET 对象的直接支持,并且可以编译 ASP 引擎和代码到独立执行文件中。   通过 ADO 和 ODBC,NetBox 开发的应用可以访问几乎所有的大型数据库和桌面数据库。通过对XML的集成,加强了和外部应用和数据的集成能力,新加入的对 SOAP、UDDI、WSDL,方便构建出下一代 Internet 应用程序。   无论是开发简单的桌面应用,或是复杂的 Internet 应用,还是下一代的 Web Service 应用,你都可以从 NetBox 中得到巨大的帮助。
"Powered by Netbox" 是指由Netbox提供支持。Netbox是一种开源工具,它是一个用于数据中心网络管理的Web应用程序。它的主要功能包括IP地址管理(IPAM)、设备追踪、操作系统管理和电缆管理等。通过Netbox,网络管理员可以轻松地管理和维护一个大型数据中心的网络基础设施。 Netbox的IPAM功能使管理员能够精确管理和控制网络中的IP地址分配。它提供了一个直观的界面,让管理员可以查看和编辑IP地址,轻松地添加、删除和修改地址,以及跟踪地址的使用情况。此外,Netbox还提供了与其他网络管理工具的集成,使管理员能够更好地协调和管理IP地址。 在设备追踪方面,Netbox可以记录并跟踪网络设备的详细信息,如设备型号、序列号和位置等。管理员可以轻松地查看和编辑设备信息,以及查找特定设备的位置和连接信息。这对于维护和维护设备非常有用,尤其是在一个庞大的数据中心网络中。 此外,Netbox还提供了操作系统管理功能,允许管理员记录和管理网络设备上安装的操作系统信息。管理员可以轻松地查看和编辑操作系统信息,以及为设备分配和管理操作系统。 最后,Netbox还提供了电缆管理功能,使管理员能够记录和管理网络设备之间的物理连接。管理员可以轻松地查看和编辑电缆信息,以及查找特定设备之间的连接信息。这在维护和扩展网络设备时非常有用。 总而言之,“Powered by Netbox”表示基于Netbox的功能和性能,网络管理员可以更轻松地管理和维护数据中心的网络基础设施。它提供了强大的IPAM、设备追踪、操作系统管理和电缆管理功能,使管理员能够高效地管理一个大型数据中心的网络。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

某呆啊

赏个糖吃吧~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值