我是否正确地解析了这个httppost请求?

2024-10-01 17:32:21 发布

您现在位置:Python中文网/ 问答频道 /正文

首先让我说,我使用的是twisted.web框架。Twisted.web的文件上传没有像我希望的那样工作(它只包括文件数据,没有任何其他信息),cgi.parse_multipart没有像我希望的那样工作(同样,twisted.web使用了这个函数),cgi.FieldStorage没有工作('因为我是通过twisted获得POST数据,而不是CGI接口——据我所知,FieldStorage试图获取通过stdin请求)和twisted.web2对我不起作用,因为使用Deferred使我困惑和愤怒(对于我想要的东西来说太复杂了)。在

也就是说,我决定尝试自己解析HTTP请求。在

使用Chrome,HTTP请求的格式如下:

------WebKitFormBoundary7fouZ8mEjlCe92pq
Content-Disposition: form-data; name="upload_file_nonce"

11b03b61-9252-11df-a357-00266c608adb
------WebKitFormBoundary7fouZ8mEjlCe92pq
Content-Disposition: form-data; name="file"; filename="login.html"
Content-Type: text/html

<!DOCTYPE html>
<html>
  <head> 

...

------WebKitFormBoundary7fouZ8mEjlCe92pq
Content-Disposition: form-data; name="file"; filename=""


------WebKitFormBoundary7fouZ8mEjlCe92pq--

它总是这样形成的吗?我用正则表达式解析它,比如这样(请原谅代码墙):

(注意,我删去了大部分代码,只显示我认为相关的部分(正则表达式(是的,嵌套括号),这是我构建的Uploads类中的__init__方法(目前为止唯一的方法)。完整的代码可以在修订历史中看到(我希望我没有错配任何括号)

^{pr2}$

您可以看到,每当到达边界时,我都会启动一个新的“file”dict。我将in_header设置为True,表示我正在解析头。当我到达一个空行时,我将它切换到False——但在检查是否为该表单值设置了Content-Type之前——如果没有,我就设置ignore_current_file,因为我只查找文件上传。在

我知道我应该使用一个库,但是我厌倦了阅读文档,尝试在我的项目中使用不同的解决方案,并且仍然让代码看起来合理。我只想跳过这一部分——如果用文件上传来解析HTTPPOST就这么简单了,那么我将坚持这一点。在

注意:这段代码目前运行得很好,我只是想知道它是否会阻塞某些浏览器的请求。在


Tags: 文件数据代码nameformwebdatahtml
3条回答

我解决这个问题的方法是用cgi.FieldStorage公司比如:

class Root(Resource):

def render_POST(self, request):

    self.headers = request.getAllHeaders()
    # For the parsing part look at [PyMOTW by Doug Hellmann][1]
    img = cgi.FieldStorage(
        fp = request.content,
        headers = self.headers,
        environ = {'REQUEST_METHOD':'POST',
                 'CONTENT_TYPE': self.headers['content-type'],
                 }
    )

    print img["upl_file"].name, img["upl_file"].filename,
    print img["upl_file"].type, img["upl_file"].type
    out = open(img["upl_file"].filename, 'wb')
    out.write(img["upl_file"].value)
    out.close()
    request.redirect('/tests')
    return ''

content disposition头没有为字段定义顺序,而且它可能包含的字段可能多于文件名。所以你的文件名匹配可能失败-甚至可能没有一个文件名!在

请参见rfc2183edit这是针对邮件的,请参见rfc1806rfc2616以及http的更多信息)

另外,我建议在这类regexp中用\s*替换每个空格,而不要依赖字符大小写。在

您试图避免阅读文档,但我认为最好的建议是实际阅读:

确保你不会错过任何案子。更简单的方法可能是使用poster库。在

相关问题 更多 >

    热门问题