Python 我可以将WSGI与具有空格的URI一起使用吗?

Python 我可以将WSGI与具有空格的URI一起使用吗?,python,wsgi,spaces,Python,Wsgi,Spaces,我编写了一个小型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

我编写了一个小型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请求包含空格时,如何更正此问题?

您应该在url中使用“%20”将空格编码到中,但不要手动执行此操作: 使用urllib.quote函数,如:

导入URL库 base=“” path=urllib.quote(“foo-bar”) checkURL=base+path


(还有“取消报价”功能供您使用服务器端)

更新

通常,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')

空格字符被排除在外,因为可能存在有效空格 删除URI时,可能会引入消失和不重要的空格 转录的、排版的或经过文字处理的- 处理程序。在许多情况下,空白也用于分隔URI 上下文

空格=

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


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

我从wsgiref.simple\u服务器迁移到cherrypy,它工作得很好。客户端请求将在大约1s后超时。非常感谢jcoon和S.Lott

用%20代替空格也行吗?行。但是我需要解决url请求有空格的问题。你能给出更多其他用户如何调用你的服务的例子吗?我使用WSGI应用程序处理来自客户端(移动和Web客户端)的所有请求(解析路径信息和流程)并返回XML。抱歉,我的代码太长了,无法在这里发布。听起来你好像在问“我可以用空格传递WSGI URI吗?”,所以我更新了我的答案。但是,如果其他程序员在url请求中使用空格,我的系统将不会响应所有其他请求。我看到了,这一点最初并不清楚。看我对你最初问题的评论是的,这正是我的问题。但是一些大小写字符串取决于用户(我不在客户端)例如:如果某个客户端请求:bar&password=b7a6f237e110de5786aea5024d7d0552,答案可能不是。是“不”。如果您使用Apache作为wsgi的前端(通过mod_wsgi),Apache将为您处理此问题。