Ah, I see. That's what I suspected. Thank you again for all your help! On Dec 8, 2015 6:41 AM, "Massimo Di Pierro" <massimo.dipie...@gmail.com> wrote:
> from the point of view of GAE, web2py is one app so all the applications/* > will be deployed and share the same datastore which is a nightmare. This is > why in app.yaml you should make sure only one of the application is > deployed. You can have multiple app.yaml to deploy multiple folders. > > On Tuesday, 8 December 2015 03:15:55 UTC-6, Brad Cardello wrote: >> >> Thank you very much for both of your help. I got it to work by adding a >> routes.py file to my web2py folder, and forcing it to open up to the >> correct app. >> >> One last question, how would I go about deploying multiple apps from the >> same applications/ folder? Would I need multiple app.yaml, etc. files? >> Excuse my complete noobiness, but I'm glad to be learning it! >> On Dec 8, 2015 12:54 AM, "Ramkrishan Bhatt" <ramkrishan.bh...@gmail.com> >> wrote: >> >>> You need to select complete web2py folder. Also you need to remove Admin >>> app from applications. There is one routes.py where you can configure your >>> default application to be called. >>> >>> >>> On Tuesday, 8 December 2015 13:55:22 UTC+5:30, Brad Cardello wrote: >>>> >>>> Alright, so I changed the name from web2py-class to web2py, and I moved >>>> app.yaml and gaehandler.py to the same level as applications and gluon/ but >>>> Google App Engine Launcher refuses to run it, saying that it could not find >>>> app.yaml in the specific application I want it to run. I'm selecting my >>>> actual app (i.e.: web2py/applications/myappname), should I just be >>>> selecting web2py or web2py/applications? Thank you again for the >>>> assistance. >>>> >>>> On Mon, Dec 7, 2015 at 9:00 PM, Massimo Di Pierro < >>>> massimo....@gmail.com> wrote: >>>> >>>>> The easiest setup is if you have web2py/ and web2py/applications/ >>>>> under it. It really does not matter if it is called web2py or not but it >>>>> matters that web2py.py and gaehandler.py and gluon/ are at the same level >>>>> as applications. >>>>> >>>>> You can put your applications in a different folder but this requires >>>>> changing default parameters in examples/options_std.py. I would not >>>>> recommend that to a new user. >>>>> >>>>> Massimo >>>>> >>>>> >>>>> >>>>> On Monday, 7 December 2015 19:38:15 UTC-6, Brad Cardello wrote: >>>>>> >>>>>> Ah, thank you for the advice on removing main.py. And my folder >>>>>> structure is similar to that, with one change. I don't quite remember if >>>>>> this is something I did manually per my instructor's advice, but instead >>>>>> of >>>>>> web2py/, my folder is called web2py-class. I do have a folder called >>>>>> web2py >>>>>> located elsewhere on my computer, though. Should I move my application >>>>>> from >>>>>> web2py-class/applications/ to web2py/applications? Thank you so much. >>>>>> >>>>>> On Monday, December 7, 2015 at 6:57:31 AM UTC-8, Massimo Di Pierro >>>>>> wrote: >>>>>>> >>>>>>> You should not need that main.py in web2py. web2py does not uses >>>>>>> webapp2. You only need app.py and gaehandler.py They look correct. The >>>>>>> error is from this lines in gaehandler: >>>>>>> >>>>>>> >>>>>>> if not os.path.isdir('applications'): >>>>>>> raise RuntimeError('Running from the wrong folder') >>>>>>> >>>>>>> >>>>>>> Do you have the correct folder structure? >>>>>>> >>>>>>> web2py/ >>>>>>> app.yaml >>>>>>> gaehandler.py >>>>>>> web2py.py >>>>>>> applications/... >>>>>>> gluon/... >>>>>>> [etc etc] >>>>>>> >>>>>>> >>>>>>> On Monday, 7 December 2015 06:40:49 UTC-6, Brad Cardello wrote: >>>>>>>> >>>>>>>> Hey everyone, I'm still fairly new to web2py, and completely new to >>>>>>>> deploying my website (developed using PyCharm, if that matters). So, >>>>>>>> here's >>>>>>>> the error I'm getting in the logs whenever I try to access my website: >>>>>>>> >>>>>>>> Traceback (most recent call last): >>>>>>>>> >>>>>>>>> File "C:\Program Files >>>>>>>>> (x86)\Google\google_appengine\google\appengine\runtime\wsgi.py", line >>>>>>>>> 240, >>>>>>>>> in Handle >>>>>>>>> >>>>>>>>> handler = >>>>>>>>> _config_handle.add_wsgi_middleware(self._LoadHandler()) >>>>>>>>> >>>>>>>>> File "C:\Program Files >>>>>>>>> (x86)\Google\google_appengine\google\appengine\runtime\wsgi.py", line >>>>>>>>> 299, >>>>>>>>> in _LoadHandler >>>>>>>>> >>>>>>>>> handler, path, err = LoadObject(self._handler) >>>>>>>>> >>>>>>>>> File "C:\Program Files >>>>>>>>> (x86)\Google\google_appengine\google\appengine\runtime\wsgi.py", line >>>>>>>>> 85, >>>>>>>>> in LoadObject >>>>>>>>> >>>>>>>>> obj = __import__(path[0]) >>>>>>>>> >>>>>>>>> File "C:\Users\Brad Cardello\Desktop\Computer >>>>>>>>> Science\CMPS-183\web2py-class\applications\WebUcscTutor\gaehandler.py", >>>>>>>>> line 40, in <module> >>>>>>>>> >>>>>>>>> raise RuntimeError('Running from the wrong folder') >>>>>>>>> >>>>>>>>> RuntimeError: Running from the wrong folder >>>>>>>>> >>>>>>>>> INFO 2015-12-07 01:10:16,092 module.py:787] default: "GET / >>>>>>>>> HTTP/1.1" 500 - >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> I'm really not sure why this is happening, as it gives me this >>>>>>>> error no matter where gaehandler.py is located in my file system. At >>>>>>>> the >>>>>>>> moment, per multiple people's instructions, my app.yaml, >>>>>>>> gaehandler.py, and >>>>>>>> main.py are all in the root directory for my project >>>>>>>> (/web2py-class/applications/WebUcscTutor). I've tried moving it to >>>>>>>> web2py-class/applications, and web2py-class, but nothing seems to >>>>>>>> change >>>>>>>> this error. >>>>>>>> >>>>>>>> Here's my *app.yaml* >>>>>>>> >>>>>>>> # For Google App Engine deployment, copy this file to app.yaml >>>>>>>> # and edit as required >>>>>>>> # See >>>>>>>> http://code.google.com/appengine/docs/python/config/appconfig.html >>>>>>>> # and http://web2py.com/book/default/chapter/11?search=app.yaml >>>>>>>> >>>>>>>> application: ucsc-tutor-website >>>>>>>> version: 1 >>>>>>>> api_version: 1 >>>>>>>> >>>>>>>> # use these lines for Python 2.7 >>>>>>>> # upload app with: appcfg.py update web2py (where 'web2py' is web2py's >>>>>>>> root directory) >>>>>>>> # >>>>>>>> runtime: python27 >>>>>>>> threadsafe: true # true for WSGI & concurrent requests (Python 2.7 >>>>>>>> only) >>>>>>>> >>>>>>>> default_expiration: "1m" # for static files >>>>>>>> >>>>>>>> handlers: >>>>>>>> >>>>>>>> # Warning! Static mapping - below - isn't compatible with >>>>>>>> # the parametric router's language logic. >>>>>>>> # You cannot use them together. >>>>>>>> >>>>>>>> - url: /(.+?)/static/_(\d+\.\d+\.\d+)\/(.+) >>>>>>>> static_files: applications/\1/static/\3 >>>>>>>> upload: applications/(.+?)/static/(.+) >>>>>>>> secure: optional >>>>>>>> expiration: "365d" >>>>>>>> >>>>>>>> - url: /(.+?)/static/(.+) >>>>>>>> static_files: applications/\1/static/\2 >>>>>>>> upload: applications/(.+?)/static/(.+) >>>>>>>> secure: optional >>>>>>>> >>>>>>>> - url: /favicon.ico >>>>>>>> static_files: applications/welcome/static/favicon.ico >>>>>>>> upload: applications/welcome/static/favicon.ico >>>>>>>> >>>>>>>> - url: /robots.txt >>>>>>>> static_files: applications/welcome/static/robots.txt >>>>>>>> upload: applications/welcome/static/robots.txt >>>>>>>> >>>>>>>> - url: .* >>>>>>>> script: gaehandler.wsgiapp # WSGI (Python 2.7 only) >>>>>>>> secure: optional >>>>>>>> >>>>>>>> admin_console: >>>>>>>> pages: >>>>>>>> - name: Appstats >>>>>>>> url: /_ah/stats >>>>>>>> >>>>>>>> skip_files: | >>>>>>>> ^(.*/)?( >>>>>>>> (app\.yaml)| >>>>>>>> (app\.yml)| >>>>>>>> (index\.yaml)| >>>>>>>> (index\.yml)| >>>>>>>> (#.*#)| >>>>>>>> (.*~)| >>>>>>>> (.*\.py[co])| >>>>>>>> (.*/RCS/.*)| >>>>>>>> (\..*)| >>>>>>>> (applications/examples/.*)| >>>>>>>> ((examples|welcome)\.(w2p|tar))| >>>>>>>> (applications/.*?/(cron|databases|errors|cache|sessions)/.*)| >>>>>>>> ((logs|scripts)/.*)| >>>>>>>> (anyserver\.py)| >>>>>>>> (web2py\.py)| >>>>>>>> ((cgi|fcgi|modpython|wsgi)handler\.py)| >>>>>>>> (epydoc\.(conf|css))| >>>>>>>> (httpserver\.log)| >>>>>>>> (logging\.example\.conf)| >>>>>>>> (route[rs]\.example\.py)| >>>>>>>> (setup_(app|exe)\.py)| >>>>>>>> (splashlogo\.gif)| >>>>>>>> (parameters_\d+\.py)| >>>>>>>> (options_std.py)| >>>>>>>> (gluon/tests/.*)| >>>>>>>> (gluon/rocket\.py)| >>>>>>>> (contrib/(gateways|markdown|memcache|pymysql)/.*)| >>>>>>>> (contrib/(populate|taskbar_widget)\.py)| >>>>>>>> (google_appengine/.*)| >>>>>>>> (.*\.(bak|orig))| >>>>>>>> )$ >>>>>>>> >>>>>>>> builtins: >>>>>>>> - remote_api: on >>>>>>>> - appstats: on >>>>>>>> - admin_redirect: on >>>>>>>> - deferred: on >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> Here's my *gaehandler.py*: >>>>>>>> >>>>>>>> #!/usr/bin/env python >>>>>>>> # -*- coding: utf-8 -*- >>>>>>>> >>>>>>>> """ >>>>>>>> This file is part of the web2py Web Framework >>>>>>>> Copyrighted by Massimo Di Pierro <mdip...@cs.depaul.edu> >>>>>>>> License: LGPLv3 (http://www.gnu.org/licenses/lgpl.html) >>>>>>>> """ >>>>>>>> >>>>>>>> ############################################################################## >>>>>>>> # Configuration parameters for Google App Engine >>>>>>>> ############################################################################## >>>>>>>> LOG_STATS = False # web2py level log statistics >>>>>>>> APPSTATS = True # GAE level usage statistics and profiling >>>>>>>> DEBUG = False # debug mode >>>>>>>> # >>>>>>>> # Read more about APPSTATS here >>>>>>>> # >>>>>>>> http://googleappengine.blogspot.com/2010/03/easy-performance-profiling-with.html >>>>>>>> # can be accessed from: >>>>>>>> # http://localhost:8080/_ah/stats >>>>>>>> ############################################################################## >>>>>>>> # All tricks in this file developed by Robin Bhattacharyya >>>>>>>> ############################################################################## >>>>>>>> >>>>>>>> >>>>>>>> import time >>>>>>>> import os >>>>>>>> import sys >>>>>>>> import logging >>>>>>>> import cPickle >>>>>>>> import pickle >>>>>>>> import wsgiref.handlers >>>>>>>> import datetime >>>>>>>> >>>>>>>> path = os.path.dirname(os.path.abspath(__file__)) >>>>>>>> >>>>>>>> # os.chdir(path) ? >>>>>>>> >>>>>>>> if not os.path.isdir('applications'): >>>>>>>> raise RuntimeError('Running from the wrong folder') >>>>>>>> >>>>>>>> sys.path = [path] + [p for p in sys.path if not p == path] >>>>>>>> >>>>>>>> sys.modules['cPickle'] = sys.modules['pickle'] >>>>>>>> >>>>>>>> >>>>>>>> from gluon.settings import global_settings >>>>>>>> from google.appengine.ext import webapp >>>>>>>> from google.appengine.ext.webapp.util import run_wsgi_app >>>>>>>> >>>>>>>> >>>>>>>> global_settings.web2py_runtime_gae = True >>>>>>>> global_settings.db_sessions = True >>>>>>>> if os.environ.get('SERVER_SOFTWARE', '').startswith('Devel'): >>>>>>>> (global_settings.web2py_runtime, DEBUG) = \ >>>>>>>> ('gae:development', True) >>>>>>>> else: >>>>>>>> (global_settings.web2py_runtime, DEBUG) = \ >>>>>>>> ('gae:production', False) >>>>>>>> >>>>>>>> >>>>>>>> import gluon.main >>>>>>>> >>>>>>>> >>>>>>>> def log_stats(fun): >>>>>>>> """Function that will act as a decorator to make logging""" >>>>>>>> def newfun(env, res): >>>>>>>> """Log the execution time of the passed function""" >>>>>>>> timer = lambda t: (t.time(), t.clock()) >>>>>>>> (t0, c0) = timer(time) >>>>>>>> executed_function = fun(env, res) >>>>>>>> (t1, c1) = timer(time) >>>>>>>> log_info = """**** Request: %.2fms/%.2fms (real time/cpu >>>>>>>> time)""" >>>>>>>> log_info = log_info % ((t1 - t0) * 1000, (c1 - c0) * 1000) >>>>>>>> logging.info(log_info) >>>>>>>> return executed_function >>>>>>>> return newfun >>>>>>>> >>>>>>>> >>>>>>>> logging.basicConfig(level=logging.INFO) >>>>>>>> >>>>>>>> >>>>>>>> def wsgiapp(env, res): >>>>>>>> """Return the wsgiapp""" >>>>>>>> env['PATH_INFO'] = env['PATH_INFO'].decode('latin1').encode('utf8') >>>>>>>> >>>>>>>> #when using the blobstore image uploader GAE dev SDK passes these >>>>>>>> as unicode >>>>>>>> # they should be regular strings as they are parts of URLs >>>>>>>> env['wsgi.url_scheme'] = str(env['wsgi.url_scheme']) >>>>>>>> env['QUERY_STRING'] = str(env['QUERY_STRING']) >>>>>>>> env['SERVER_NAME'] = str(env['SERVER_NAME']) >>>>>>>> >>>>>>>> #this deals with a problem where GAE development server seems to >>>>>>>> forget >>>>>>>> # the path between requests >>>>>>>> if global_settings.web2py_runtime == 'gae:development': >>>>>>>> gluon.admin.create_missing_folders() >>>>>>>> >>>>>>>> web2py_path = global_settings.applications_parent # backward >>>>>>>> compatibility >>>>>>>> >>>>>>>> return gluon.main.wsgibase(env, res) >>>>>>>> >>>>>>>> >>>>>>>> if LOG_STATS or DEBUG: >>>>>>>> wsgiapp = log_stats(wsgiapp) >>>>>>>> >>>>>>>> >>>>>>>> def main(): >>>>>>>> """Run the wsgi app""" >>>>>>>> run_wsgi_app(wsgiapp) >>>>>>>> >>>>>>>> if __name__ == '__main__': >>>>>>>> main() >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> And here's *main.py* (generated by PyCharm): >>>>>>>> >>>>>>>> #!/usr/bin/env python >>>>>>>> # >>>>>>>> # Copyright 2007 Google Inc. >>>>>>>> # >>>>>>>> # Licensed under the Apache License, Version 2.0 (the "License"); >>>>>>>> # you may not use this file except in compliance with the License. >>>>>>>> # You may obtain a copy of the License at >>>>>>>> # >>>>>>>> # http://www.apache.org/licenses/LICENSE-2.0 >>>>>>>> # >>>>>>>> # Unless required by applicable law or agreed to in writing, software >>>>>>>> # distributed under the License is distributed on an "AS IS" BASIS, >>>>>>>> # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or >>>>>>>> implied. >>>>>>>> # See the License for the specific language governing permissions and >>>>>>>> # limitations under the License. >>>>>>>> # >>>>>>>> import webapp2 >>>>>>>> >>>>>>>> class MainHandler(webapp2.RequestHandler): >>>>>>>> def get(self): >>>>>>>> self.response.write('Hello world!') >>>>>>>> >>>>>>>> app = webapp2.WSGIApplication([ >>>>>>>> ('/', MainHandler) >>>>>>>> ], debug=True) >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> Any help would be greatly appreciated! I need this deployed by >>>>>>>> Wednesday (12/9) >>>>>>>> >>>>>>> -- >>>>> Resources: >>>>> - http://web2py.com >>>>> - http://web2py.com/book (Documentation) >>>>> - http://github.com/web2py/web2py (Source code) >>>>> - https://code.google.com/p/web2py/issues/list (Report Issues) >>>>> --- >>>>> You received this message because you are subscribed to a topic in the >>>>> Google Groups "web2py-users" group. >>>>> To unsubscribe from this topic, visit >>>>> https://groups.google.com/d/topic/web2py/tcjBN0qZQ7k/unsubscribe. >>>>> To unsubscribe from this group and all its topics, send an email to >>>>> web2py+un...@googlegroups.com. >>>>> For more options, visit https://groups.google.com/d/optout. >>>>> >>>> >>>> -- >>> Resources: >>> - http://web2py.com >>> - http://web2py.com/book (Documentation) >>> - http://github.com/web2py/web2py (Source code) >>> - https://code.google.com/p/web2py/issues/list (Report Issues) >>> --- >>> You received this message because you are subscribed to a topic in the >>> Google Groups "web2py-users" group. >>> To unsubscribe from this topic, visit >>> https://groups.google.com/d/topic/web2py/tcjBN0qZQ7k/unsubscribe. >>> To unsubscribe from this group and all its topics, send an email to >>> web2py+unsubscr...@googlegroups.com. >>> For more options, visit https://groups.google.com/d/optout. >>> >> -- > Resources: > - http://web2py.com > - http://web2py.com/book (Documentation) > - http://github.com/web2py/web2py (Source code) > - https://code.google.com/p/web2py/issues/list (Report Issues) > --- > You received this message because you are subscribed to a topic in the > Google Groups "web2py-users" group. > To unsubscribe from this topic, visit > https://groups.google.com/d/topic/web2py/tcjBN0qZQ7k/unsubscribe. > To unsubscribe from this group and all its topics, send an email to > web2py+unsubscr...@googlegroups.com. > For more options, visit https://groups.google.com/d/optout. > -- Resources: - http://web2py.com - http://web2py.com/book (Documentation) - http://github.com/web2py/web2py (Source code) - https://code.google.com/p/web2py/issues/list (Report Issues) --- You received this message because you are subscribed to the Google Groups "web2py-users" group. To unsubscribe from this group and stop receiving emails from it, send an email to web2py+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.