关于导入的新手python错误

时间:2010-03-16 06:50:03

标签: python google-app-engine

我是一名python新手,开始在Google App Engine上使用Bottle网络框架。我一直在搞乱超小型,超级简单的Hello World样本,并且已经遇到了问题。嘿。我终于得到了代码来处理这个......

import bottle
from bottle import route
from google.appengine.ext.webapp import util 

@route('/')
def index():
    return "Hello World!"

util.run_wsgi_app(bottle.default_app())

我的问题是,我想我可以在没有第二行的情况下去'导入瓶'。但如果我拿出第二行,我会得到一个NameError。或者如果我从'瓶子导入''',我仍然得到错误。 bottle只是我网站根目录中名为'bottle.py'的单个文件。所以这些都不起作用......

import bottle
from google.appengine.ext.webapp import util 

@route('/')
def index():
    return "Hello World!"

util.run_wsgi_app(bottle.default_app())

或者

from bottle import *
from google.appengine.ext.webapp import util 

@route('/')
def index():
    return "Hello World!"

util.run_wsgi_app(bottle.default_app())

我得到的错误信息是......

  

追踪(最近的呼叫最后):
  文件   “/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/dev_appserver.py”   第3180行,在_HandleRequest中       self._Dispatch(dispatcher,self.rfile,outfile,env_dict)文件   “/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/dev_appserver.py”   第3123行,在_Dispatch中       base_env_dict = env_dict)文件“/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/dev_appserver.py”,   第515行,在Dispatch中       base_env_dict = base_env_dict)文件   “/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/dev_appserver.py”   第2382行,在Dispatch中       self._module_dict)文件“/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/dev_appserver.py”,   第2292行,在ExecuteCGI中       reset_modules = exec_script(handler_path,cgi_path,   hook)文件   “/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/dev_appserver.py”   第2188行,在ExecuteOrImportScript中       exec module_code在script_module。 dict 文件中   “/Users/tyler/Dropbox/sites/dietgrid/code2.py”   第4行,在       @route('/')NameError:未定义名称'route'

所以我认为它应该能够以其他方式工作或者不工作是错误的吗?

5 个答案:

答案 0 :(得分:8)

在您的代码中,您有两种不同的方法从瓶包中调用方法。

route('/hello')

bottle.default_app()

首次通话需要from bottle import routefrom bottle import *,第二次通话需要import bottle

from foo import bar允许您在代码中使用方法或参数bar,而无需在每次调用时指定包。

答案 1 :(得分:5)

关于为什么

from bottle import *

不起作用:当你这样导入时,只导入瓶子的_____all_____列表中指定的名称。因此,如果路由不存在,则必须明确指定导入:

from bottle import route

答案 2 :(得分:3)

routebottle模块的一部分。

以下内容应解决问题

import bottle
...

@bottle.route('/hello')
def hello():
    return "Hello World!"

...

答案 3 :(得分:2)

您可以将瓶子导入您的命名空间,因此每次您希望使用其中的某些内容时,您都需要bottle.作为前缀。

import bottle
from google.appengine.ext.webapp import util 

@bottle.route('/')
def index():
    return "Hello World!"

util.run_wsgi_app(bottle.default_app())

另一种方法是将要使用的瓶子部分导入命名空间。

from bottle import route, default_app
from google.appengine.ext.webapp import util 

@route('/')
def index():
    return "Hello World!"

util.run_wsgi_app(default_app())

答案 4 :(得分:0)

我也学会了使用带GAE的瓶子,因为它的体积非常小。你可以做的是直接将瓶子与你的主文件保持在一起,这将允许你使用'import bottle',或者放入一个文件夹(将它与其他文件分开,给出一个整洁的结构),并添加一个空的{{1文件到该文件夹​​。然后您可以将其导入为__init__.py,依此类推。 我在how to use Bottle with GAE上写了一个小教程。