我可以在有空格的URI中使用WSGI吗?
我写了一个小的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 个回答
更新
一般来说,WSGI的URI看起来像 localhost:8000/foo/bar/baz
或 localhost:8000/?foo=bar
,而且通常不会包含空格。所以我猜测服务器可能因为没有处理空格的功能而超时了。
也许你的问题其实是“我可以在包含空格的URI中使用WSGI吗?” -- 我认为答案是不可以,正如@S.Lott所解释的,服务器的前端应该为你处理这个问题;你不需要在WSGI应用中担心空格。
原始回答
如果替换空格可以解决问题(你对我评论的回复似乎是这样),那么你可以使用 urllib2.quote()
来把URL中的空格替换成 %20,像这样:
checkURL = 'http://localhost:8000/%s' % urllib2.quote('foo bar')
我从wsgiref.simple_server切换到了cherrypy,现在运行得很好。客户端请求大约在1秒后会超时。非常感谢jcoon和S.Lott的帮助!
来自 http://www.ietf.org/rfc/rfc2396.txt
这里提到的空格字符是不能用的,因为在处理URI(统一资源标识符)时,重要的空格可能会消失,而不重要的空格可能会被加入。这种情况在你输入、排版或者使用文字处理软件时都可能发生。此外,空格在很多情况下也用来分隔URI。
空格的表示方式是 <US-ASCII coded character 20 hexadecimal>
总结一下:不,你不能使用空格。这不是WSGI服务器的问题,而是你的URI有问题。
另外,你不应该单独使用WSGI服务器。你应该通过 mod_wsgi
将它嵌入到Apache中。这样做的话,Apache会帮你处理那些不合法的URI请求。