1

私は Python 2.7 で gae を使用しています。gae 1.7.6 にアップグレードした後、単体テストが壊れています。単体テストにはnoseとnosegaeを使用しています。何が起こっているのか誰にも分かりませんか?どんなアイデアでも本当に感謝しています。これは、webob 1.2.3 が GA に昇格したことに関連していると感じています。

    self.app.post(task['url'], params, headers)
  File "/Library/Python/2.7/site-packages/WebTest-1.4.0-py2.7.egg/webtest/app.py", line 835, in post
    content_type=content_type)
  File "/Library/Python/2.7/site-packages/WebTest-1.4.0-py2.7.egg/webtest/app.py", line 807, in _gen_request
    expect_errors=expect_errors)
  File "/Library/Python/2.7/site-packages/WebTest-1.4.0-py2.7.egg/webtest/app.py", line 1118, in do_request
    self._check_status(status, res)
  File "/Library/Python/2.7/site-packages/WebTest-1.4.0-py2.7.egg/webtest/app.py", line 1154, in _check_status
    res)
AppError: Bad response: 500 Internal Server Error (not 200 OK or 3xx redirect for http://localhost/task/request_log)
<pre>Traceback (most recent call last):
  File &quot;/Users/***/Downloads/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/webapp2-2.5.2/webapp2.py&quot;, line 1089, in __call__
    method(*args, **kwargs)
  File &quot;/Users/***/projects/game_server/game_service/events.py&quot;, line 184, in post
    inputs = pickle.loads(self.request.body)
  File &quot;/Users/***/Downloads/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/webob-1.2.3/webob/request.py&quot;, line 677, in _body__get
    self.make_body_seekable() # we need this to have content_length
  File &quot;/Users/***/Downloads/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/webob-1.2.3/webob/request.py&quot;, line 922, in make_body_seekable
    self.copy_body()
  File &quot;/Users/***/Downloads/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/webob-1.2.3/webob/request.py&quot;, line 945, in copy_body
    self.body = self.body_file.read(self.content_length)
  File &quot;/Users/***/Downloads/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/webob-1.2.3/webob/request.py&quot;, line 1528, in readinto
    + &quot;(%d more bytes were expected)&quot; % self.remaining
DisconnectionError: The client disconnected while sending the POST/PUT body (151 more bytes were expected)
</pre>
    self.app.post(task['url'], params, headers)
  File "/Library/Python/2.7/site-packages/WebTest-1.4.0-py2.7.egg/webtest/app.py", line 835, in post
    content_type=content_type)
  File "/Library/Python/2.7/site-packages/WebTest-1.4.0-py2.7.egg/webtest/app.py", line 807, in _gen_request
    expect_errors=expect_errors)
  File "/Library/Python/2.7/site-packages/WebTest-1.4.0-py2.7.egg/webtest/app.py", line 1118, in do_request
    self._check_status(status, res)
  File "/Library/Python/2.7/site-packages/WebTest-1.4.0-py2.7.egg/webtest/app.py", line 1154, in _check_status
    res)
AppError: Bad response: 500 Internal Server Error (not 200 OK or 3xx redirect for http://localhost/task/request_log)
<pre>Traceback (most recent call last):
  File &quot;/Users/***/Downloads/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/webapp2-2.5.2/webapp2.py&quot;, line 1089, in __call__
    method(*args, **kwargs)
  File &quot;/Users/***/projects/game_server/game_service/events.py&quot;, line 184, in post
    inputs = pickle.loads(self.request.body)
  File &quot;/Users/***/Downloads/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/webob-1.2.3/webob/request.py&quot;, line 677, in _body__get
    self.make_body_seekable() # we need this to have content_length
  File &quot;/Users/***/Downloads/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/webob-1.2.3/webob/request.py&quot;, line 922, in make_body_seekable
    self.copy_body()
  File &quot;/Users/***/Downloads/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/webob-1.2.3/webob/request.py&quot;, line 945, in copy_body
    self.body = self.body_file.read(self.content_length)
  File &quot;/Users/***/Downloads/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/webob-1.2.3/webob/request.py&quot;, line 1528, in readinto
    + &quot;(%d more bytes were expected)&quot; % self.remaining
DisconnectionError: The client disconnected while sending the POST/PUT body (151 more bytes were expected)
</pre>
4

2 に答える 2

1

短いバージョン: headers誤った Content-Length が含まれている可能性があります。params次のように修正します (が a であると仮定しますstr):

fixed_header = ('Content-Length', str(len(params)))
for i, header in enumerate(headers):
    if header[0] == 'Content-Length':
        headers[i] = fixed_header
        fixed_header = None
        break
if fixed_header:  # in case you're completely missing a Content-Length header
    headers.append(fixed_header)

GAE 1.7.6 では、デフォルトの webob が v0.9 から v1.2.3 に変更されました。リクエスト パラメータを取得するためのコード (例: 経由webob.Request.get()) が、これらのバージョン間で変更されました。

1.2.3 を見ると、using が作成されBaseRequest.params、Content-Length ヘッダーをチェックするusing を使用してリクエストの本文を読み取ろうとします。Content-Length が正しくない場合は、経験したことがわかります。NestedMultiDictBaseRequest.POSTcgi.FieldStorage()DisconnectionError

0.9 では、そのusing をRequest.params使用しRequest.str_paramsてビルドされます(1.2.3 とは異なります)。これは、 Content-Length ヘッダーをチェックせずに with を使用して読み取られた既存のものを使用します。NestedMultiDictRequest.str_POSTRequest.body_ fileStringIO()

したがって、1.7.5 では間違った Content-Length ヘッダーを回避できましたが、1.7.6 では回避できませんでした。

タスク キュー データは Base64 でエンコードされています。トレースバックの最初の行で渡されているのは Base64 形式からデコードされていると思われますが、これを反映paramsするために Content-Length ヘッダーを更新していません。Content-Length が元の Base64 でエンコードされたデータの長さに設定されている taskqueue スタブheadersから取得したタスクからヘッダーを取得したと思われます。GetTasks()

于 2013-09-20T23:11:09.260 に答える
0

送信しているリクエストには、適切な Content-Length ヘッダーが欠けている可能性があります。

これがないと、サーバーは、クライアントがすべてのデータをアップロードしたのか、転送の途中で切断されたのかを正確に判断できません。

于 2013-03-22T20:18:50.630 に答える