[mod_python] The DOs and DONTs of mod_python

Philippe C. Martin pmartin at snakecard.com
Tue Oct 18 19:40:17 EDT 2005


On Tuesday 18 October 2005 11:33 pm, Graham Dumpleton wrote:

Thanks,

The one good thing is that I cannot afford all of these threads to attack the 
only hardware resource (the smart card) at the same time: ISO7816 simply is 
not ready for it.

So I will have to find a way to keep the people waiting and avoid concurent 
access.

Regards,

Philippe


> A few additional comments on top of what Jorey has already said.
>
> Philippe C. Martin wrote ..
>
> > Please note that, although I must have bugs, the code I'm calling _seems_
> > to
> > work flawlessly under Linux and Windows.
>
> Besides issues with multiple interpreters, if using a multithread Apache
> MPM, such as is the case for Win32 systems and "worker" MPM on UNIX, you
> have to contend with multithreading. Your system may work quite happily
> if you trickle requests in serially, but get requests come in at the
> same time and they can trample all over each other if your module isn't
> multithread safe.
>
> There are also various issues because of mod_python's module reloading
> system. Problems can also arise if you use a module which has a C code
> component and it uses the simplified threading C APIs in Python.
>
> There are a lot of gotchas.
>
> > from mod_python import apache
> > import os
> > import sys
> > if os.name == 'nt':
> >      sys.path.append("Z:\\dev")
> > else:
> >      sys.path.append('/home/philippe/dev')
>
> You shouldn't extend sys.path in Python code when mod_python is used.
> The main reason is that if mod_python reloads the module, everytime that
> occurs then sys.path will be extended even if the directory is already in
> there. Thus, sys.path could grow and grow. This is made worse by bugs
> in mod_python.publisher in versions of mod_python < 3.2.
>
> > from SC.pilot.SC_Script_Processor import *
> >
> >
> > def world(req):
> >      ls = SC_Script_Processor() #INSTANTIATE A _BIG_ OBJECT ==> *** THIS
> > IS
> > THE KILLER THAT CRASHES APACHE ***
> >      ll = ls.Reader_List() # get the reader list
> >
> >      #Grab ATR from card - assume first reader
> >      l_appli_conn = ls.Get_Connection(r1)
> >
> >
> >
> >      req.send_http_header()
>
> You don't set req.content_type. How is the browser mean't to know what
> to do with the response. You perhaps want:
>
>   req.content_type = 'text/plain'
>   req.send_http_header()
>
> Although, in 3.X the call to 'req.send_http_header()' is actually
> redundant. It was only required in 2.7.X.
>
> >      req.write("RETURN CARD ATR= " +  l_appli_conn.Get_Connection_ATR()
> > )
> >
> >      return apache.OK
>
> I have presumed that mod_python.publisher was being used because
> you weren't using "handler()" for the function, but "world()". If this is
> the case, you shouldn't be returning "apache.OK" as it will result in the
> string "0" being appended to the response sent back to the browser.
>
> Overall, better off perhaps saying:
>
>   req.content_type = 'text/plain'
>   return "RETURN CARD ATR= " +  l_appli_conn.Get_Connection_ATR()
>
> Graham

-- 
*************************************
Philippe C. Martin
SnakeCard, LLC
www.snakecard.com
+1 405 694 8098
*************************************


More information about the Mod_python mailing list