【问题标题】:App Engine 401/403 Status Codes Not Working on WebApp2App Engine 401/403 状态代码在 WebApp2 上不起作用
【发布时间】:2012-05-09 18:41:02
【问题描述】:

当用户尝试访问他们无权访问的内容时,我正在尝试引发 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

【问题讨论】:

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


    【解决方案1】:

    您正在使用带有线程安全环境的 py27。 在 app.yaml 中你设置了script: main.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() 执行负责错误处理的函数。

    【讨论】:

    • 同样的结果。错误显示在终端上,但不在浏览器中。
    • 发现了问题。你应该使用 self.abort() 而不是 self.error()
    • 和记录。如果您像在原始问题中一样声明应用程序,它也可以工作。
    • 你的答案几乎就在那里。让它工作所需的只是将 app.run() 从 def main() 中拉出来:我将发布修改后的代码,以便其他人可以找到它。虽然我在 dev_appserver 上使用了 --debug 并注意到这仍然使用 CGI 而不是 WSGI。对此不确定。不过我会在上面添加一个新问题。
    • 那么你的代码中有一些不同的东西。删除 main() 函数不会在 error_handler 中写出错误消息。正如您从 webapp2 源代码中看到的那样,您需要使用 self.abort() 。 self.error 不执行任何其他操作,然后设置标题并清除响应。
    猜你喜欢
    • 2017-10-04
    • 2018-04-13
    • 2012-07-11
    • 1970-01-01
    • 1970-01-01
    • 2012-06-16
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    相关资源
    最近更新 更多