在mod_python Publisher中,我可以使用以下代码编写文件加载器(在此示例中为uploader.py):
def index():
html = '''
<html>
<body>
<form id="fileUpload" action="uploader.py/upload" enctype="multipart/form-data" method="post">
<input type="file" id="file" name="file_name"/>
<input type="submit" value="Upload"/>
</form>
</body>
</html>
'''
return html
def upload(req, file_name):
fd = open("/mydir/myfile", "w")
for line in file_name.file.readlines():
fd.write(line)
fd.close()
这个例子排除了任何错误检查,但说明了我可以用mod_python和Publisher做什么。关键是Publisher能够在文件uploader.py中调用我的函数,上传并传递一个参数,file_name和属性文件以及在表单中选择的文件。
我想做的是在mod_wsgi中做同样的事情。我正在寻找一种方法从一个表单调用这样的函数,并以类似的方式调用我的函数。我看过webob,但无法弄清楚如何用这个包做同样的事情。我很感激编写类似解决方案的任何帮助,而无需使用mod_python和Publisher。
答案 0 :(得分:1)
从问题文本迁移的答案。
经过一番挖掘,我找到了解决这个问题的方法。这是我提出的解决方案。我用两个文件实现了这个:uploader1.py和uploader2.py。这是uploader1.py的代码:
def application(environ, start_response):
from webob import Response
html = '''
<html>
<body>
<h1>Upload</h1>
<form id="fileUpload" action="uploader2.py" enctype="multipart/form-data" method="post">
<input type="file" name="filename"/>
<input type="submit" value="Upload"/>
</form>
</body>
</html>
'''
response = Response(body = html,
content_type = "text/html",
charset = "utf8",
status = "200 OK")
return response(environ, start_response)
这是uploader2.py的代码:
import os
import cgi
def application(environ, start_response):
from webob import Response
form = cgi.FieldStorage(fp=environ['wsgi.input'], environ=environ, keep_blank_values=True)
try:
fileitem = form['filename']
except KeyError:
fileitem = None
if fileitem is not None and fileitem.filename and fileitem.file:
# remove any relative paths to prevent directory traversal attacks
fn = os.path.basename(fileitem.filename)
# directory to upload to
fn = "/tmp/"+fn
with open(fn, 'w') as f:
# this upload is for text files
lines = fileitem.file.readlines()
for line in lines:
f.write(line)
f.close()
message = "Uploaded file: %s" % fn
else:
message = "Error: no file selected for upload"
html = '''
<html>
<body>
<p>%s
</body>
</html>
''' % message
response = Response(body = html,
content_type = "text/html",
charset = "utf8",
status = "200 OK")
return response(environ, start_response)
这个实现相对于mod_python的唯一缺点是我无法找到在单个文件中实现此解决方案的方法。 mod_python允许我调用模块中的函数,我无法找到一种方法来使用mod_wsgi。此外,在调试期间,能够将输出记录到我为mod_wsgi设置的相同自定义error_log文件并且我找不到这样做的方法本来很好,所以不得不通过以下方式登录到主Apache日志文件使用打印语句。如果有人有办法做到这一点,我很高兴知道一个解决方案。