[mod_python] Physical paths ?

Graham Dumpleton graham.dumpleton at gmail.com
Tue Feb 5 05:20:34 EST 2008


Sorry for the delay.

Since you are using .psp files, then you must be using AddHandler. As
a result the following should work to give you the name of the
directory corresponding to the Directory container in Apache
configuration, or .htaccess file, that you defined PythonHandler in.

        root = req.hlist.directory
        parent = req.hlist.parent
        while parent is not None:
            root = parent.directory
            parent = parent.parent

In other words, if in main Apache configuration you have:

  Alias /MyApp/ /home/user/MyApp/

  <Directory /home/user/MyApp>
  AddHandler mod_python .psp
  PythonHandler mod_python.psp | .psp
  ...
  </Directory>

The 'root' should end up being '/home/user/MyApp'.

This only works where PythonHandler in a Directory container or .htaccess file.

You must be using mod_python 3.3.1.

Graham

On 03/02/2008, Graham Dumpleton <graham.dumpleton at gmail.com> wrote:
> Please keep your replies on the list.
>
> FYI. That code was setting req.application_root so you could use it as
> a reference, not trying to use it.
>
> Do:
>
>   PythonHandler somemodulenameinrootofpspfilesdirectory .psp
>   PythonHandler mod_python.psp .psp
>
> In somemodulenameinrootofpspfilesdirectory.py have:
>
>   import os
>
>   def handler(req):
>     req.application_root = os.path,dirname(__file__)
>     return apache.OK
>
> Read the documentation about stacked mod_python handlers to see how this works.
>
> Have no time to read all this new mail now, maybe someone else will help.
>
> Graham
>
> ---------- Forwarded message ----------
> From: S.R.Pardá <linux at qbox.es>
> Date: 2 Feb 2008 21:26
> Subject: Re: [mod_python] Physical paths ?
> To: Graham Dumpleton <graham.dumpleton at gmail.com>
>
>
> Thank You.
>
> I'm using: PythonHandler mod_python.psp and req.application_root doesn't
> exist.
> But __file__ is '/usr/lib/python2.5/site-packages/mod_python/psp.pyc' in
> the psp page, so it doen't seem related to the root of my app pages
> where I wnt to save.
>
>
>
> Anyway, I will try to explain it better, so it can help any other person
> in the future looking for info like this.
>
> Basically, I want the mod_python psp application, allow content upload
> from the user client:
>
> That's done in:         http://SERVER/MyApp/config/upload.psp
> (and that page is in /home/user/MyApp/config/index.psp)
>
> And I want to save the user file to a directory accesible later at:
>         http://SERVER/MyApp/images/users/USER_FILE
> (that page would be in /home/user/MyApp/images/users)
>
> So the upload.psp save the file received from form at that images
> directory (instead of the form directory).
>
>
>
> I wanted that the code from upload psp will pass a relative path from
> the root of the App (/MyApp) to the module that saves the file, that is
> something like:
>         save_file(USER_FILE,"images/users/", req)
>
> I needed the save_file to obtain the physical path to the URL:
>         '//SERVER' + '/MyApp/' + 'images/users/'
>         (server + application_root + destiny_folder)
> that is, the physical path to save the file:
>         '/home/user/MyApp/config/index.psp'
>
> Of course, I didn't wanted the function to use a constant to the root of
> the application '/home/user/MyApp' (at code time) to allow to the
> application to be independent from the installation directory.
>
>
>
> I know req.filename give me the physical path to
> http://SERVER/MyApp/config/upload.psp
> that is:
> /home/user/MyApp/config/upload.psp
>
> so I could save to '/home/user/MyApp/config/' without problem. And the
> same in some subdirectory like '/home/user/MyApp/config/images/users/'.
> I know.
>
> But, I had an images directory in '/home/user/MyApp/images/', and maybe
> I like the things in the hard way. And decide to save to that directory
> of images (don't ask me why).
> I know that ... application root is at '..' relative to the physical
> directory of the page ('/home/user/MyApp/config/').
> But I really like the things in the hard way and I wanted the save
> function to be usable from any other pages in other directories, and I
> don't wanted to send a constant relative path to the app root (remember
> '/home/user/MyApp/') from every page to the save function (because, I
> want app to be independent of the installation directory, and I don't
> want to worry about the constant relative paths if I move the pages).
>
>
> So, the code I'm using now, take the physical path of the page, and the
> uri of the page , and the application root (uri), to obtain the physical
> path of the application.
> And from that , I can take the pyshical path of any subdirectory
> relative to root (only if no subdirectory with alias are involved, of
> course).
>
> ######
> def physicalAppRoot(req):
>
>   rootApp = req.get_options()['mod_python.session.application_path']
>   pageDir, pageName = os.path.split(req.parsed_uri[6])
>
>   if pageDir.startswith(rootApp):
>      appPageDir = pageDir[len(rootApp):]
>   else:
>      appPageDir = pageDir
>
>   physPath = os.path.dirname(req.filename)
>
>   i = physPath.rfind(appPageDir)
>   physAppRoot = physPath[:i]+os.path.sep
>
>   return physAppRoot
> ######
>
>
> The application path is an apache's directory alias, so option
> application_path is indicated in the config (like you said me Graham, to
> set different paths for cookies from various applications, and that
> worked great for me).
>
>
>
> That's work for me but, really all I wanted was some function like:
>
>         physicalPath(uri = 'images/users/')
> or
>         physicalPath(uri = '/MyApp/images/users/')
>
> that give me:  '/home/user/MyApp/images/users/'
> for an apache mod_python application installed in /home/user/MyApp,
> accessible at 'http://server/MyApp' (because an alias would be set at
> apache 'alias /MyApp/ "/home/user/MyApp"').
>
>
>
> Sorry, if I can explain it better. Maybe I'm doing a silly thing,
> because an apache function available at mod_python does exctly this, but
> I didn't found it.
>
>
>
> Thank You,
>
>
>         S.R.Pardá
>
>
>
> El sáb, 02-02-2008 a las 08:36 +1100, Graham Dumpleton escribió:
> > I think I only partly understand what you want. Anyway, work out what
> > the following would do if done in your mod_python handler.
> >
> >   import os
> >   req.application_root = os.path.dirname(__file__)
> >
> > Graham
> >
> > On 01/02/2008, S.R.Pardá <linux at qbox.es> wrote:
> > > Hi,
> > >
> > > Now, thank you to your help,  my applicattion is capable of receive
> > > image files from users using forms.
> > > And app store them into a physical path of the server.
> > >
> > >
> > > It's possible to save from the app to an uri folder ?
> > >
> > > Can I know the physical path of one uri ?
> > >
> > >
> > > I can save easily to a subfolder of the pyhsical path obtained by
> > > req.filename relative to the page visited, and that can work without
> > > problem.
> > >
> > >
> > > But I would like the module (the module that implements the form
> > > proccesing) receive the relative route relative to the root of the
> > > application path, so module will not need to know the physical structure
> > > of directories, and can save to a route not descendent of the directory
> > > of my own page.
> > >
> > > ... And in my app, the root of the app is a directory alias. outside of
> > > the apache document_root '/var/www'
> > >
> > >
> > > That's it
> > >
> > >         DocumentRoot    /             /var/www
> > >
> > >         Alias           MyApp         /home/user/MyApp/
> > >
> > >         /MyApp/index.psp   .......... /home/user/MyApp/index.psp
> > >
> > >         /MyApp/config/upload.psp  ... /home/user/MyApp/config/index.psp
> > >
> > >         /MyApp/images/  ............. /home/user/MyApp/images/
> > >         /MyApp/images/users/    ..... /home/user/MyApp/images/users/
> > >
> > >
> > > And I want to obtain from code executed in
> > >
> > >         http:/MyApp/config/upload.psp
> > >
> > > the physical path of root of the application:
> > >
> > >
> > >
> > > so I can't sent to a function in form.py:
> > >
> > >         app_root = ???    # function that returns '/home/user/MyApp/'
> > >         imgs_folder = 'images/users/'
> > >
> > >         process(form, directory_to_save = app_root+imgs_folder)
> > >
> > >
> > > So, the code is independent of the installation directory and the app
> > > path.
> > >
> > > Another thing ... if images would be an alias, ¿ could I know the path ?
> > >
> > >
> > >
> > >
> > > Thank You again.
> > >
> > >         S.R.Parda
> > >
> > > _______________________________________________
> > > Mod_python mailing list
> > > Mod_python at modpython.org
> > > http://mailman.modpython.org/mailman/listinfo/mod_python
> > >
>



More information about the Mod_python mailing list