寻找处理mod_python Publisher等表单的wsgi方式

时间:2014-03-01 02:43:04

标签: python mod-wsgi wsgi mod-python

在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。

1 个答案:

答案 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日志文件使用打印语句。如果有人有办法做到这一点,我很高兴知道一个解决方案。