0

ユーザーが権限を持っていないものにアクセスしようとしたときに、401/403 ステータスを上げようとしています。404/500 の「自然な」イベントに対して適切なエラー コードを生成するWebapp2 Exceptionsの例を使用しました。http://localhost:8080/nourlに移動すると、適切な 404 が生成され、コードを台無しにすると 500 が生成されます。しかし、以下のような方法を使用して、self.error(XXX) を使用してコードを設定すると、コンソールには表示されますが、ブラウザには表示されません。EG self.error() を空のままにすると、適切な 500 コードが生成されます。self.error(500) を使用すると、コンソールに次のように出力されます。

INFO     2012-05-09 18:25:29,549 dev_appserver.py:2891] "GET / HTTP/1.1" 500 -

しかし、ブラウザは完全に空白です。以下は、この動作を示すアプリの例です。self.error() 行を目的のコードに変更して実行するだけです。期待される結果は、404 などの「自然な」イベントが発生したときだけでなく、提供されたコードに基づいてブラウザーに適切な応答を生成することです。

main.py

import webapp2
import wsgiref.handlers
import logging
from google.appengine.api import users


class HomeHandler(webapp2.RequestHandler):
    def get(self):
        user = users.get_current_user()
        if user:
            self.response.out.write("Hi :1", user.nickname)
        else:
            self.error(401)


app = webapp2.WSGIApplication([
    (r'/', HomeHandler),
], debug=True)


def handle_401(request, response, exception):
    logging.exception(exception)
    response.write("401 Error")
    response.set_status(401)


def handle_403(request, response, exception):
    logging.exception(exception)
    response.write("403 Error")
    response.set_status(403)


def handle_404(request, response, exception):
    logging.exception(exception)
    response.write("404 Error")
    response.set_status(404)


def handle_500(request, response, exception):
    logging.exception(exception)
    response.write("500 Error")
    response.set_status(500)

app.error_handlers[401] = handle_401
app.error_handlers[403] = handle_403
app.error_handlers[404] = handle_404
app.error_handlers[500] = handle_500


#  Run the application
def main():
    app.run()

app.yaml

application: 401test
version: 1
runtime: python27
api_version: 1
threadsafe: yes

libraries:
- name: webapp2
  version: latest

handlers:
- url: /.*
  script: main.app
4

1 に答える 1

3

スレッドセーフ環境でpy27を使用しています。app.yamlでscript: main.app、appが定義された後のコードが実行されないように設定します。

テストしませんでしたが、これは機能するはずです:

# create a bare app 
bare_app = webapp2.WSGIApplication(debug=True)

#define the error handlers
def handle_401(request, response, exception):
    logging.exception(exception)
    response.write("401 Error")
    response.set_status(401)

def handle_403(request, response, exception):
    logging.exception(exception)
    response.write("403 Error")
    response.set_status(403)


def handle_404(request, response, exception):
    logging.exception(exception)
    response.write("404 Error")
    response.set_status(404)


def handle_500(request, response, exception):
    logging.exception(exception)
    response.write("500 Error")
    response.set_status(500)

# add the error handlers
bare_app.error_handlers[401] = handle_401
bare_app.error_handlers[403] = handle_403
bare_app.error_handlers[404] = handle_404
bare_app.error_handlers[500] = handle_500


bare_app.router.add((r'/', HomeHandler))

app = bare_app

編集
self.error()の代わりにself.abort()を使用する
http://webapp-improved.appspot.com/guide/exceptions.html#abort

ソースコードの違いを確認できます:
http
: //code.google.com/p/webapp-improved/source/browse/webapp2.py#574 self.error()はステータスコードを設定しますが、応答をクリアします。 self.abort()は、エラー処理を処理する関数を実行します。

于 2012-05-09T19:02:50.160 に答える