在CGI中保存临时文件(Ubuntu)

2 投票
2 回答
1222 浏览
提问于 2025-04-16 20:41

我是一名博士后,刚刚完成了一个很酷的小科学应用程序,使用的是Python,想要和大家分享。这是一个对遗传学家非常有用的工具。

我希望能让大家通过一个CGI表单界面来运行这个程序。因为我不再是学生了,所以现在没有一个整洁的cgi-bin子目录可以使用。

几年前我写过一个简单的CGI Python程序,想用它作为模板。

我有个问题:我的程序需要创建临时文件(从命令行运行时,它会把图像保存到指定的路径)。我看过一些关于Apache等的教程,搞定了很多东西,但就是不知道怎么让我的程序写入临时文件(我也不知道这些文件会存在哪里)。每次我尝试在Python程序中写入文件时,CGI就“崩溃”了,似乎不太正常。

我并不是特别担心安全问题,因为这些临时文件只是程序的输出(而不是用户输入)。

顺便问一下(我猜你如果看到这里应该对CGI挺了解的),你知道我的CGI程序能否在不创建临时文件的情况下接受文件参数吗?

我之前的做法是简单地把一串文本作为参数传入:

try:
    if item.file:
        data = item.file.read()
        if check:
            Tools_file.main(["ExeName", "-d", "-w " + data])
        else:
            Tools_file.main(["ExeName", "-s", "-d", "-w " + data])
...

我想要以正确的方式来做这件事!提前谢谢你。

此致,
奥利弗

2 个回答

1

正如保罗·麦克米伦所说,可以使用临时文件:

 temp, temp_filename = tempfile.mkstemp(text = True)
 temp_output = os.fdopen(temp, 'w')
 temp_output.write(something_or_other)
 temp_output.close()

我个人认为,框架会浪费很多时间,除非你真的需要那些现成的功能。CGI(通用网关接口)要简单得多,可能就能满足你的应用需求,至少在它还不太受欢迎的时候。

3

其实,最“正确”的做法可能是用现有的网络框架,比如Django,来重新整理一下。不过在这个情况下,可能有点过于复杂了。别小看了安全性的问题,这些可能比你想的更重要。

话虽如此,你可能想用Python的标准库里的临时文件模块:

http://docs.python.org/library/tempfile.html

一般来说,如果你是在Unix系统上,它会把东西写到/tmp/whatever这个地方。如果你的程序在Apache下运行时崩溃(但直接运行没问题),那就检查一下权限。确保你的Apache用户有权限写入你决定存放临时文件的地方。还要确保临时文件的写入权限合适(别写了个文件,结果自己看不了)。

撰写回答