我可以使用带有空格的URI的WSGI吗?

时间:2010-01-26 13:28:08

标签: python wsgi spaces

我写了一个小的WSGI应用程序:

def foo(environ, start_response):
        bar = 'Your request is %s' % environ['PATH_INFO']
        status = '200 OK'
        response_headers = [('Content-type', 'text/plain'),
                            ('Content-Length', str(len(bar)))]
        start_response(status, response_headers)
        return [bar]

if __name__ == '__main__':
    from wsgiref.simple_server import make_server
    server = make_server('localhost', 8000, foo)
    print "Running..."
    server.serve_forever()

另一个要测试的脚本:

import urllib2
checkURL = 'http://localhost:8000/foo bar'

print urllib2.urlopen(checkURL).read()

我运行脚本1(WSGI App)。运行脚本2时,我遇到了问题。 WSGI不会从脚本2中检索请求(checkURL在foo和bar之间有空格)以及对我的WSGI的所有其他请求都没有响应。 现在,当url请求有空格时,如何解决此问题?

4 个答案:

答案 0 :(得分:1)

来自http://www.ietf.org/rfc/rfc2396.txt

排除空格字符,因为可能存在重要空格    当URI出现时,可能会引入消失和无关紧要的空格    转录或排版或接受单词处理 -    处理程序。空格也用于在许多中分隔URI    上下文。

space = <US-ASCII coded character 20 hexadecimal>

底线。不,你不能使用空间。这不是WSGI服务器的问题。这是您的URI的问题。

此外,您不应该单独使用WSGI服务器。您应该通过mod_wsgi在Apache中嵌入它。执行此操作时,Apache将为您处理非法的URI请求。

答案 1 :(得分:0)

<强>更新

通常,WSGI URI看起来像localhost:8000/foo/bar/bazlocalhost:8000/?foo=bar而不使用空格,所以我怀疑服务器是超时的,因为它没有内置的空格处理。

也许你的问题确实是“我可以使用带有空格的URI来使用WSGI吗?” - 我认为答案是,正如@ S.Lott解释的那样服务器的前端应该为你处理这个问题;您不必担心WSGI应用程序中的空格。


原始回答

如果替换空格是一种修复(您对我的评论的回复似乎是这样),那么您可以使用urllib2.quote()将%中的空格替换为%20,如下所示:

checkURL = 'http://localhost:8000/%s' % urllib2.quote('foo bar')

答案 2 :(得分:0)

我从wsgiref.simple_server转移到了cherrypy并且运行良好。客户请求将在大约1秒后超时。非常感谢jcoon和S.Lott!

答案 3 :(得分:-1)

您应该在URL中使用“%20”将空格编码为 - 但不要手动执行此操作: 使用urllib.quote函数,如:

  
    
      

导入urllib       base =“http://localhost:8000/”       path = urllib.quote(“foo bar”)       checkURL = base + path

    
  

(还有“unquote”功能供您使用服务器端)