Philippe C. Martin
pmartin at snakecard.com
Tue Oct 18 20:21:01 EDT 2005
Hi, If any of you wish to look at this: this code works in command line, and crashes with apache. Something I'm doing is really anoying minidom. you can fetch the xml file responsible at: www.snakecard.com/mod_python Any help is greatly appreciated. Regards, Philippe if __name__ != "__main__": 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') import xml import xml.dom from xml.dom import minidom def test(): l_doc = minidom.parse('/var/www/html/mp/templates/sc_template.xml') print l_doc def world(req): l_doc = minidom.parse('/var/www/html/mp/templates/sc_template.xml') return 'OK' #let's stop here for now ls = SC_Script_Processor() #INSTANTIATE A _BIG_ OBJECT ==> *** HIS IS THE KILLER *** ll = ls.Reader_List() # get the reader list #Grab ATR from card - assume first reader l_appli_conn = ls.Get_Connection(ll[0] ) req.send_http_header() req.write("RETURN CARD ATR= " + l_appli_conn.Get_Connection_ATR() ) return apache.OK #******************************************************************************* if __name__ == "__main__": test() On Wednesday 19 October 2005 12:00 am, Philippe C. Martin wrote: > Hi, > > It took me a while to understand that although I had apache configured to > run as me "philippe", doing an os.getenv still returned the root > environment variables. > > Maybe forcing a source of ~/.bashrc ? > > Regards, > > Philippe > > On Tuesday 18 October 2005 11:40 pm, Philippe C. Martin wrote: > > 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 *************************************
|