1

I wrote a small WSGI App:

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()

And another script to test:

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

print urllib2.urlopen(checkURL).read()

I run script 1 (WSGI App). When run script 2, I has a problem here. WSGI doesn't retrieve request from script 2 (checkURL has a space between foo and bar) and all other request to my WSGI not responding. Now, how do I correct this problem when url request has spaces?

4

4 回答 4

1

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

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

空间=<US-ASCII coded character 20 hexadecimal>

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

此外,您不应该单独使用 WSGI 服务器。您应该使用嵌入在 Apache 中的mod_wsgi. 当您这样做时,Apache 将为您处理非法的 URI 请求。

于 2010-01-26T14:27:11.977 回答
0

更新

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

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


原始答案

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

checkURL = 'http://localhost:8000/%s' % urllib2.quote('foo bar')
于 2010-01-26T13:42:06.867 回答
0

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

于 2010-01-27T11:30:59.030 回答
-1

You should use "%20" in URL's to encode spaces into then -- but don't do that manually: use urllib.quote function, like:

import urllib base = "http://localhost:8000/" path = urllib.quote("foo bar") checkURL = base + path

(there is also the "unquote" function for you to use serverside)

于 2010-01-26T13:41:24.320 回答