Skip to main content
 首页 » 编程设计

python之属性错误 : 'NoneType' object has no attribute 'route' and webapp2

2025年05月04日31txw1958

我仍然遇到 webapp2 的错误,并且不知道这里可能是什么问题。

ERROR    2011-12-13 11:17:19,059 webapp2.py:1528] 'NoneType' object has no attribute 'route' 
Traceback (most recent call last): 
  File "/home/user/sdk/google_appengine/lib/webapp2/webapp2.py", line 1511, in __call__ 
    rv = self.handle_exception(request, response, e) 
  File "/home/user/sdk/google_appengine/lib/webapp2/webapp2.py", line 1505, in __call__ 
    rv = self.router.dispatch(request, response) 
  File "/home/user/sdk/google_appengine/lib/webapp2/webapp2.py", line 1253, in default_dispatcher 
    return route.handler_adapter(request, response) 
  File "/home/user/sdk/google_appengine/lib/webapp2/webapp2.py", line 1077, in __call__ 
    return handler.dispatch() 
  File "/home/user/sdk/google_appengine/lib/webapp2/webapp2.py", line 526, in dispatch 
    method_name = request.route.handler_method 
AttributeError: 'NoneType' object has no attribute 'route' 
ERROR    2011-12-13 11:17:19,060 wsgi.py:186] 
Traceback (most recent call last): 
  File "/home/user/sdk/google_appengine/google/appengine/runtime/wsgi.py", line 174, in Handle 
    result = handler(self._environ, self._StartResponse) 
  File "/home/user/sdk/google_appengine/lib/webapp2/webapp2.py", line 1519, in __call__ 
    response = self._internal_error(e) 
  File "/home/user/sdk/google_appengine/lib/webapp2/webapp2.py", line 1511, in __call__ 
    rv = self.handle_exception(request, response, e) 
  File "/home/user/sdk/google_appengine/lib/webapp2/webapp2.py", line 1505, in __call__ 
    rv = self.router.dispatch(request, response) 
  File "/home/user/sdk/google_appengine/lib/webapp2/webapp2.py", line 1253, in default_dispatcher 
    return route.handler_adapter(request, response) 
  File "/home/user/sdk/google_appengine/lib/webapp2/webapp2.py", line 1077, in __call__ 
    return handler.dispatch() 
  File "/home/user/sdk/google_appengine/lib/webapp2/webapp2.py", line 526, in dispatch 
    method_name = request.route.handler_method 
AttributeError: 'NoneType' object has no attribute 'route' 

请注意,我使用的是最新的 GAE SDK 版本 (1.6.0)。

我的代码是这样的:

应用.yaml

application: test-app 
version: 1 
runtime: python27 
api_version: 1 
threadsafe: true 
 
handlers: 
- url: /favicon\.ico 
  static_files: static/images/favicon.ico 
  upload: static/images/favicon\.ico 
 
- url: .* 
  script: main.site_app 
  login: required 
 
libraries: 
- name: django 
  version: "1.2" 

主要.py

import os 
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings' 
 
import webapp2 
import urls 
 
site_app = webapp2.WSGIApplication(urls.SITE_URLS, debug=True) 

网址.py

import webapp2 
 
import handler 
 
SITE_URLS = [ 
  webapp2.Route(r'/', handler.TestHome), 
  webapp2.Route(r'/test/<test_key:\w+>', handler.TestPage) 
] 

基本处理器.py

import os 
import webapp2 
from django import template 
 
class BaseHandler(webapp2.RequestHandler): 
 
  def __init__(self, *args, **kwargs): 
    self.tdict = {} 
 
  def render(self, template_file): 
    template_path = os.path.join(os.path.dirname(__file__), 
                                 'templates', 
                                 template_file) 
    t = template.Template(file(template_path,'rb').read()) 
    self.response.write(t.render(template.Context(self.tdict))) 

处理程序.py

import os 
from basehandler import BaseHandler 
 
class TestHome(BaseHandler): 
 
  def get(self): 
    def get(self): 
    self.render('browse.html') 
 
 
class TestPage(BaseHandler): 
 
  def get(self, test_key): 
    self.tdict['test_key'] = test_key 
    self.render('browse.html') 

templates/browse.html

<html> 
<head> 
  <title>Success!</title> 
</head> 
<body> 
Success! 
{% if test_key %}- {{ test_key }}{% endif %} 
</body> 
</html> 

我做错了什么?非常感谢任何帮助/建议!

请您参考如下方法:

我认为这是因为您没有调用 webapp2.RequestHandler.__init__()。这是来自 webapp2.py 的代码片段:

class RequestHandler(object): 
    # ... 
    def __init__(self, request=None, response=None): 
        self.initialize(request, response) 

如您所见,RequestHandler 是用request 和response 初始化的。所以你必须在你的代码中做同样的事情:

class BaseHandler(webapp2.RequestHandler): 
    def __init__(self, request, response): 
        self.tdict = {} 
        self.initialize(request, response)