App Engine 401/403状态代码在WebApp2上不起作用

时间:2012-05-09 18:41:02

标签: google-app-engine http-status-codes webapp2

我试图在用户尝试访问他们没有权限的内容时提高401/403状态。我使用了Webapp2 Exceptions示例,它为404/500“自然”事件生成了正确的错误代码。比如转到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

1 个答案:

答案 0 :(得分: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.abort()而不是self.error()
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()执行负责错误处理的函数。