Могу ли я использовать WSGI с URI, в котором есть пробелы? - PullRequest
1 голос
/ 26 января 2010

Я написал небольшое приложение 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-адресе есть пробелы?

Ответы [ 4 ]

1 голос
/ 26 января 2010

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

Символ пробела исключен, поскольку значительные пробелы могут исчезают, и незначительные пробелы могут быть введены, когда URI переписано или набрано или подвергнуто обработке слова- обработка программ. Пробелы также используются для разделения URI во многих контексты.

пробел = <US-ASCII coded character 20 hexadecimal>

Итог. Нет, вы не можете использовать пробел. Это не проблема с сервером WSGI. Это проблема с вашим URI.

Кроме того, вы не должны использовать автономный сервер WSGI. Вы должны использовать его, встроенный в Apache через mod_wsgi. Когда вы сделаете это, Apache обработает для вас недопустимые запросы URI.

0 голосов
/ 27 января 2010

Я перешел с wsgiref.simple_server на cherrypy, и он работает хорошо. Время запроса клиента истечет примерно через 1 с. Большое спасибо jcoon и S.Lott!

0 голосов
/ 26 января 2010

Обновление

Как правило, URI WSGI будет выглядеть примерно как localhost:8000/foo/bar/baz или localhost:8000/?foo=bar и не использовать пробелы, поэтому я подозреваю, что у сервера истекло время ожидания, потому что у него нет встроенной обработки пробелов.

Может быть, ваш вопрос действительно «Могу ли я использовать WSGI с URI, в котором есть пробелы?» - я думаю, что ответ Нет , поскольку @ S.Lott объясняет, что сервер интерфейс должен обработать это для вас; вам не нужно беспокоиться о пробелах в вашем приложении WSGI.


Оригинальный ответ

Если замена пробелов является исправлением (ваш ответ на мой комментарий выглядит так), то вы можете использовать urllib2.quote() для замены пробелов в вашем URL% 20, например:

checkURL = 'http://localhost:8000/%s' % urllib2.quote('foo bar')
0 голосов
/ 26 января 2010

Вы должны использовать «% 20» в URL для кодирования пробелов в них, но не делайте этого вручную: используйте функцию urllib.quote, например:

импорт urllib база = "http://localhost:8000/" path = urllib.quote ("foo bar") checkURL = база + путь

(есть также функция "unquote" для использования на стороне сервера)

...