我写了一个小的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请求有空格时,如何解决此问题?
答案 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/baz
或localhost: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”功能供您使用服务器端)