2010-01-26 68 views
1

我写了一个小WSGI应用:我可以使用带有空格的URI的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应用程序)。当运行脚本2时,我在这里遇到问题。 WSGI不检索来自脚本2的请求(checkURL在foo和bar之间有一个空格),并且对我的WSGI的所有其他请求没有响应。 现在,当url请求有空格时,我该如何纠正这个问题?

+1

是否使用%20而不是空间不起作用? – 2010-01-26 13:31:54

+0

它的工作原理。但是当url请求有空格时,我需要解决这个问题。 – Warpzv 2010-01-26 13:35:00

+0

您能举出更多关于其他用户如何致电您的服务的例子吗? – 2010-01-26 14:01:20

回答

-1

你应该用 “%20” 中的URL编码空间进入,然后 - 但不这样做,手动: 使用urllib.quote功能,如:

进口的urllib 基= “http://localhost:8000/” 路径= urllib.quote( “富栏”) checkURL =基地+路径

(有也是“所享有”功能供您使用服务器端)

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') 
+0

,但是,如果其他程序员在url请求中使用空格,我的系统将不会响应所有其他请求 – Warpzv 2010-01-26 13:44:46

+0

我看到最初并不清楚。看到我对你原来的问题的评论 – 2010-01-26 14:00:16

+0

是的,这正是我的问题。但有些情况下字符串依赖于用户(我不在客户端) 例如:如果某些客户端请求:http:// localhost:8000/login?username = foo bar&password = b7a6f237e110de5786aea5024d7d0552 – Warpzv 2010-01-26 14:33:35

1

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

空格字符被排除在外,因为显当URI被 转录或排版或受到处理程序的处理时,缺陷空间可能会消失并且可能引入微不足道的空间。空白还用于在很多 上下文中分隔URI。

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

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

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

0

我从wsgiref.simple_server移动到cherrypy,它工作正常。客户请求将在约1秒后超时。非常感谢jcoon和S.Lott!

相关问题