I'm a python newbie and starting out with using the Bottle web framework on Google App Engine. I've been messing with the super small, super easy Hello World sample and have already ran into problems. Heh. I finally got the code to work with this...
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())
My question is, I thought I could just go 'import bottle' without the second line. But if I take the second line out, I get a NameError. Or if I do 'from bottle import *', I still get the error. bottle is just a single file called 'bottle.py' in my site's root directory. So neither of these work....
import bottle
from google.appengine.ext.webapp import util
@route('/')
def index():
return "Hello World!"
util.run_wsgi_app(bottle.default_app())
Or
from bottle import *
from google.appengine.ext.webapp import util
@route('/')
def index():
return "Hello World!"
util.run_wsgi_app(bottle.default_app())
The error message I get is...
Traceback (most recent call last):
File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/dev_appserver.py", line 3180, in _HandleRequest self._Dispatch(dispatcher, self.rfile, outfile, env_dict) File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/dev_appserver.py", line 3123, in _Dispatch base_env_dict=env_dict) File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/dev_appserver.py", line 515, in Dispatch base_env_dict=base_env_dict) File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/dev_appserver.py", line 2382, in Dispatch self._module_dict) File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/dev_appserver.py", line 2292, in ExecuteCGI reset_modules = exec_script(handler_path, cgi_path, hook) File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/dev_appserver.py", line 2188, in ExecuteOrImportScript exec module_code in script_module.dict File "/Users/tyler/Dropbox/sites/dietgrid/code2.py", line 4, in @route('/') NameError: name 'route' is not defined
So am I wrong in thinking it should be able to work the other ways or no?
I too learned to use Bottle with GAE, because of its very small size. What you can do is keep bottle directly with your main files, that will allow you to use 'import bottle', or put in a folder (to separate it from other files, give a neat structure), and add an empty
__init__.py
file to that folder. Then you can import it asimport bottle from <foldername>
and so on. I wrote a small tutorial on how to use Bottle with GAE.Regarding why
does not do the trick: when you import like that, only names that are specified in bottle's _____all_____ list are imported. So, if route is not there, you have to specify the import explicitly:
You can either just import bottle into you namespace, so every time you wish to use something from there you have
bottle.
as a prefix.The other way is to import the parts of bottle you are going to use into your namespace.
In your code you have two different ways of calling methods from bottle package.
and
First call requires
from bottle import route
orfrom bottle import *
and second one requiresimport bottle
.from foo import bar
is letting you to use method or parameterbar
in your code without specifying the package on each call.route
is part of thebottle
module.The following should fix the problem