1

小さな 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

4 に答える 4

1

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

スペース文字は除外されます。これは、URI が転写されるか、タイプセットされるか、ワード プロセッシング プログラムの処理を受けるときに、重要なスペースが消え、重要でないスペースが導入される可能性があるためです。空白は、多くのコンテキストで URI を区切るためにも使用されます。

スペース =<US-ASCII coded character 20 hexadecimal>

結論。いいえ、スペースは使用できません。WSGI サーバーの問題ではありません。URI に問題があります。

さらに、WSGI サーバーをスタンドアロンで使用しないでください。経由で Apache に埋め込んで使用する必要がありますmod_wsgi。これを行うと、Apache が不正な URI リクエストを処理します。

于 2010-01-26T14:27:11.977 に答える
0

アップデート

通常、WSGI URIはスペースのように見えるかlocalhost:8000/foo/bar/bazlocalhost:8000/?foo=barスペースを使用しないため、サーバーにはスペースの処理機能が組み込まれていないため、サーバーがタイムアウトしていると思われます。

たぶんあなたの質問は本当に「スペースのあるURIでWSGIを使用できますか?」です。-- @ S.Lottがサーバーのフロントエンドがこれを処理する必要があると説明しているので、答えは「いいえ」だと思います。WSGIアプリのスペースについて心配する必要はありません。


元の回答

スペースの置き換えが修正された場合(私のコメントへの返信はそうであるように見えます)、次のようurllib2.quote()に、URLのスペースを%20に置き換えることができます。

checkURL = 'http://localhost:8000/%s' % urllib2.quote('foo bar')
于 2010-01-26T13:42:06.867 に答える
0

wsgiref.simple_server から cherrypy に移行しましたが、うまくいきました。クライアント リクエストは、約 1 秒後にタイムアウトします。jcoonさん、S.Lottさん、本当にありがとうございました!

于 2010-01-27T11:30:59.030 に答える
-1

URLに「%20」を使用してスペースをエンコードする必要がありますが、手動で行うことはしないでください。次のようなurllib.quote関数を使用してください。

import urllib base = " http:// localhost:8000 / " path = urllib.quote( "foo bar")checkURL = base + path

(サーバーサイドで使用するための「引用解除」機能もあります)

于 2010-01-26T13:41:24.320 に答える