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

1 投票
4 回答
681 浏览
提问于 2025-04-15 18:29

我写了一个小的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()

我先运行了第一个脚本(WSGI应用)。但是当我运行第二个脚本时,遇到了一个问题。WSGI没有从第二个脚本获取请求(checkURL在foo和bar之间有一个空格),而且对我WSGI的其他请求也没有响应。

现在,我该如何解决这个问题,当网址请求中有空格时?

4 个回答

0

更新

一般来说,WSGI的URI看起来像 localhost:8000/foo/bar/bazlocalhost:8000/?foo=bar,而且通常不会包含空格。所以我猜测服务器可能因为没有处理空格的功能而超时了。

也许你的问题其实是“我可以在包含空格的URI中使用WSGI吗?” -- 我认为答案是不可以,正如@S.Lott所解释的,服务器的前端应该为你处理这个问题;你不需要在WSGI应用中担心空格。


原始回答

如果替换空格可以解决问题(你对我评论的回复似乎是这样),那么你可以使用 urllib2.quote() 来把URL中的空格替换成 %20,像这样:

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

我从wsgiref.simple_server切换到了cherrypy,现在运行得很好。客户端请求大约在1秒后会超时。非常感谢jcoon和S.Lott的帮助!

1

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

这里提到的空格字符是不能用的,因为在处理URI(统一资源标识符)时,重要的空格可能会消失,而不重要的空格可能会被加入。这种情况在你输入、排版或者使用文字处理软件时都可能发生。此外,空格在很多情况下也用来分隔URI。

空格的表示方式是 <US-ASCII coded character 20 hexadecimal>

总结一下:不,你不能使用空格。这不是WSGI服务器的问题,而是你的URI有问题。

另外,你不应该单独使用WSGI服务器。你应该通过 mod_wsgi 将它嵌入到Apache中。这样做的话,Apache会帮你处理那些不合法的URI请求。

撰写回答