为了更加熟悉django,我决定建立一个网站,该网站可以让用户上传CSV文件,然后将其转换为excel,用户可以下载该文件。
为了实现这一点,我创建了一个名为model FileField
的{{1}}的模型表单,如下所示:
csv_file
,相应的视图是:
#models.py
class CSVUpload(models.Model):
csv_file = models.FileField(upload_to="csvupload/")
def __str__(self):
return self.csv_file
#forms.py
class CsvForm(forms.ModelForm):
class Meta:
model = CSVUpload
fields = ('csv_file', )
现在,您可以看到我正在使用Pandas以便将csv文件转换为views.py文件中的excel。我的问题是,是否有更好的方法(例如在表单或模型模块中)来使excel文件更有效地下载?
感谢您提供的任何帮助!
答案 0 :(得分:1)
首先,我想指出您的示例演示了一个任意文件上传漏洞。 Pandas不会为您验证文件的格式,因此,作为攻击者,我可以仅将malware.php.csv
之类的内容上传到您的转换脚本中,并且包含的所有恶意代码都将保持不变。由于您并未验证此文件的内容实际上是否为CSV格式,因此您为用户提供了一种直接上传具有任意扩展名的文件并可能在您的网站上执行代码的方法。由于您是按照自己的方式在网页上呈现xlsx格式的,因此很可能有人会滥用此格式。如果这只是您自己进行个人实验以帮助自己熟悉,那是一回事,但我强烈建议您不要在生产环境中部署它。您在这里所做的工作非常危险。
关于您更迫切的问题,我个人不熟悉Django,但这看起来与以下问题非常相似:Having Django serve downloadable files
在您的情况下,您不想将文件的内容实际保存到服务器,而是想要处理文件的内容并将其返回到响应的正文中。 django smartfile模块看起来正是您想要的:https://github.com/smartfile/django-transfer
这提供了Apache,Nginx和lighttpd的组件,并应允许您提供一种在上载/转换文件请求后立即在响应中提供文件的方法。我应该强调,您需要非常谨慎地保存这些文件的位置,验证它们的内容,确保最终用户无法在Web服务器上下文中浏览或执行这些文件,并且在响应和文件被删除后立即将其删除。成功发送。
更熟悉Django的人可以随时纠正我或提供可用的代码示例,但是以我的经验,这种功能是将代码执行引入网站的方式。通常这是个坏主意。