Thanks Massimo, now I understand! Your suggestion worked for me.
Dan

On Jul 12, 11:48 pm, mdipierro <[email protected]> wrote:
> Yes and no.
>
> the mechanism of importing modules (in python and in any other
> language) allows to get stuff out of the module (functions, variables)
> but not in the module (request, response, cache, etc). So you have to
> pass them. You do not want to pass them to every function so here is
> the suggested trick:
>
> #in module mymodule.py
> class MyModule:
>       def __init__(self,request,response,session,cache,T,db):
>
> (self.request,self.response,self.session,self.cache,self.T,self.db)=
>               (request,response,session,cache,T,db)
>       def my_function(self,a):
>             # use self.request, self.response, etc. etc as needed
>             return a
>
> #in models of controllers
>
> mymodule=MyModule(request,response,session,cache,T,db)
> print mymodule.my_function('4')
>
> I know this is somewhat ugly but there is no other way that I know of.
>
> On Jul 13, 1:12 am, Dan <[email protected]> wrote:
>
> > Maybe I'm doing something silly...
>
> > I intend to run my code on GAE when I deploy it. For development and
> > testing, I use SQLite to work out most of the bugs and then I test on
> > GAE to find any GAE-specific bugs/issues. So I have some conditional
> > import statements in the web2py controller files, which detect when
> > the code is running on GAE and import two special GAE modules so that
> > my code will work properly. These are the lines that are at the top of
> > my controller, and they work properly for me:
>
> > # for caching datastore requests
> > if request.env.web2py_runtime_gae: # if running on Google App Engine
> >     from gluon.contrib.gae_memcache import MemcacheClient
> >     cache.ram=cache.disk=MemcacheClient(request)
> > #else: # we will use the normal web2py caching method's cache.ram
>
> > # for task queue support. we use this for offline processing for
> > insertion and aggregation
> > if request.env.web2py_runtime_gae: # if running on Google App Engine
> >     from google.appengine.api.labs import taskqueue
> >     import urllib
>
> > However, my code is getting more complex and I have some routines that
> > access the datastore that I would like to use in a few different
> > controller files. So I would like to put the re-usable code into a
> > custom module and then import that module into the controller files.
> > The problem I'm running into is that I'm getting errors when using
> > these conditional import statements at the top of my custom module,
> > because the request object is not defined. Do I need to put the import
> > statements INSIDE each function in my custom module, and pass the
> > request object to each function? Or is there a better way?
>
> > Maybe this is an easier way to ask this question: Is it possible to
> > use "@cache" function decorators in a custom module - in both the
> > typical web2py (running on SQLite) and GAE environments? If so, how
> > would I import the necessary libraries to get this to work?
>
> > Dan
>
> > On Jul 12, 7:24 pm, mdipierro <[email protected]> wrote:
>
> > > You can determine if it running on gae from
>
> > > request.env.web2py_runtime_gae
>
> > > You do not need any conditional import, perhaps I do not understand
> > > the question.
>
> > > On Jul 12, 8:40 pm, Dan <[email protected]> wrote:
>
> > > > Sorry, I'm afraid I'm still not getting it.
>
> > > > I can see how it would be possible to pass the request object to each
> > > > function within my custom module, and then decide if it's appropriate
> > > > to import the GAE-specific routines. This conditional import would
> > > > need to happen in every function within my custom module, correct?
>
> > > > But it would be nicer to avoid duplicating that import -- if it's
> > > > possible to do the conditional import at the top of a module. It seems
> > > > to me that a conditional import statement at the top of a custom
> > > > module cannot successfully reference the request object -- because it
> > > > is not contained in a function, so I don't know how to pass the
> > > > request object to the module - is that possible? Or is there another
> > > > way to determine if it's running on GAE?
>
> > > > Dan
>
> > > > On Jul 12, 8:42 am, mdipierro <[email protected]> wrote:
>
> > > > > You can one one import statement at the top of the module.
>
> > > > > As far as global objects, it depends. I suggest defining a class, pass
> > > > > the globals to the contructor, store them, so that all methods have
> > > > > access to them as needed.
>
> > > > > On Jul 12, 9:42 am, Dan <[email protected]> wrote:
>
> > > > > > ok,  that makes sense. And would I need to put import statements
> > > > > > inside each function in my custom module? Or can I do something to 
> > > > > > get
> > > > > > that module-level reference to request/response/session/etc working?
>
> > > > > > On Jul 11, 10:21 pm, mdipierro <[email protected]> wrote:
>
> > > > > > > This is not a bad idea but there some rules to follow.
>
> > > > > > > request, response, session, cache, T are global objects in web2py 
> > > > > > > so
> > > > > > > if you import a function from a module, you have to pass those 5
> > > > > > > objects to the function (not all of them, only those you need). 
> > > > > > > You
> > > > > > > probably want to pass your database connection too.
>
> > > > > > > All the other web2py keywords can be imported from your modules as
> > > > > > > needed.
>
> > > > > > > Massimo
>
> > > > > > > On Jul 11, 5:48 pm, Dan <[email protected]> wrote:
>
> > > > > > > > Hello-
> > > > > > > > I want to re-use some data access routines in a few different
> > > > > > > > controller files, so I would like to put them in a separate 
> > > > > > > > file in
> > > > > > > > the /modules directory, and then import that file into the 
> > > > > > > > controller
> > > > > > > > files that need them. However, I'm running into this error 
> > > > > > > > because I'm
> > > > > > > > trying to use some web2py stuff in my module, like caching - 
> > > > > > > > and this
> > > > > > > > is a conditional import that depends on accessing the request
> > > > > > > > variable.
>
> > > > > > > > in /modules/my_module.py:
> > > > > > > > if request.env.web2py_runtime_gae: # if running on Google App 
> > > > > > > > Engine
> > > > > > > >     from gluon.contrib.gae_memcache import MemcacheClient
> > > > > > > >     cache.ram=cache.disk=MemcacheClient(request)
>
> > > > > > > > error:
> > > > > > > > name 'request' is not defined
>
> > > > > > > > Another way to put it is that I'm building an abstraction layer 
> > > > > > > > on top
> > > > > > > > of web2py's DAL so that I can reuse my code. Is this possible? 
> > > > > > > > Or
> > > > > > > > maybe a bad idea?
>
> > > > > > > > Dan
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"web2py Web Framework" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/web2py?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to