cgitb performance issue

Ethan Furman efurman at admailinc.com
Wed May 14 12:51:40 EDT 2008


Gabriel Genellina wrote:

>En Mon, 05 May 2008 15:56:26 -0300, Ethan Furman <efurman at admailinc.com> escribió:
>
>  
>
>>I tried adding a form to our website for uploading large files.
>>Personally, I dislike the forms that tell you you did something wrong
>>and make you re-enter *all* your data again, so this one cycles and
>>remembers your answers, and only prompts for the file once the rest of
>>the entered data is good.  However, the first time the form loads it can
>>take up to 30 seconds... any ideas why?
>>    
>>
>
>Hard to tell without looking at the code... And what has cgitb to do with this?
>  
>
Hmmmm... excellent question, and the answer is -- Nothing.  My 
apologies.  I'm importing cgi (cgitb was while I was debugging it), as 
well as a bunch of others.

Here's the source, with a bunch of the actual html stripped out.  The -u 
as well as the last two lines were an attempt to eliminate the 30-second 
pause while it loads, as it seems to get all data transferred, then just 
waits for a while.  Any ideas appreciated.  My apologies for the ugly code.
-- 
Ethan

<code>
#!/usr/local/bin/python -u

import cgi
#import cgitb; cgitb.enable()
import smtplib
import mimetypes
import os
import sys
from email.Encoders import encode_base64
from email.MIMEBase import MIMEBase
from email.MIMEText import MIMEText
from email.MIMEMultipart import MIMEMultipart

HEADER = """Content-type: text/html\n
   <snip>
   """
SELECTFILES = """
   <snip>
"""
FILESRECEIVED = """
   <snip>
"""
VERIFIED = """
   <snip>
"""
FOOTER = """
   <snip>
   </body>
</html>"""

REQUIRED = '<br><i>*required</i>'
form = cgi.FieldStorage()

clientname = clientemail = clientcsr = subject = body = ""
csrs = {"frank":{'html':'selected="yes"', 'name':'<name removed>', 
'email':'<email removed>'}, \
       "kathy":{'html':'', 'name':'<name removed>', 'email':'<email 
removed>'}, \
       "chris":{'html':'', 'name':'<name removed>', 'email':'<email 
removed>'}, \
       "tracy":{'html':'', 'name':'<name removed>', 'email':'<email 
removed>'}, \
       "susi": {'html':'', 'name':'<name removed>', 'email':'<email 
removed>'}, \
       "bill": {'html':'', 'name':'<name removed>', 'email':'<email 
removed>'}}
incomplete = False
files = []
filelist = []


if form:
   if form.has_key("name"):
       clientname = form["name"].value
   if form.has_key("email"):
       clientemail = form["email"].value
   if form.has_key("CSR"):
       clientcsr = form["CSR"].value
       csrs["frank"]['html'] = ''                              # clear 
default
       csrs[clientcsr]['html'] = 'selected="yes"'
   if form.has_key("subject"):
       subject = form["subject"].value
   if form.has_key("body"):
       body = form["body"].value
   incomplete = not (clientname and clientemail and clientcsr and subject)
     if form.has_key("file1"):
       file1 = form["file1"]
       if file1.filename:
           files.append(file1.filename + "<br>")
           filelist.append(file1)
   if form.has_key("file2"):
       file2 = form["file2"]
       if file2.filename:
           files.append(file2.filename + "<br>")
           filelist.append(file2)
   if form.has_key("file3"):
       file3 = form["file3"]
       if file3.filename:
           files.append(file3.filename + "<br>")
           filelist.append(file3)
   if form.has_key("file4"):
       file4 = form["file4"]
       if file4.filename:
           files.append(file4.filename + "<br>")
           filelist.append(file4)
   if form.has_key("file5"):
       file5 = form["file5"]
       if file5.filename:
           files.append(file5.filename + "<br>")
           filelist.append(file5)
      def csrform():
   cn_present = ''
   ce_present = ''
   sb_present = ''

   if incomplete:
       if not clientname:
           cn_present = REQUIRED
       if not clientemail:
           ce_present = REQUIRED
       if not subject:
           sb_present = REQUIRED
             print """
      <html snipped>
                       <form action="/cgi-bin/contact_files.py" 
method="POST" enctype="multipart/form-data">
                       <p>
                       Please fill in your name, e-mail address, 
subject, and select your CSR.  You will then be able to upload files
                       on the next screen.  Any additional notes may go 
in the Message field.
                       <br /></p>
                       <table border="0">
         """
   print """
                       <tr><td>Your name</td><td><input type="text" 
size="40" maxlength="50" name="name" value="%s">%s</td></tr>""" \
                               % (clientname, cn_present)
   print """
                       <tr><td>Your e-mail</td><td><input type="text" 
size="40" maxlength="100" name="email" value="%s">%s</td></tr>""" \
                               % (clientemail, ce_present)
   print """
                       <tr><td>Subject line</td><td><input type="text" 
size="40" maxlength="100" name="subject" value="%s">%s</td></tr>""" \
                               % (subject, sb_present)
   print """
                       <tr><td>Your CSR</td><td><select name="CSR">
                       <option %s value="frank">Frank</option>
                       <option %s value="kathy">Kathy</option>
                       <option %s value="chris">Chris</option>
                       <option %s value="tracy">Tracy</option>
                       <option %s value="susi">Susi</option>
                       <option %s value="bill">Bill</option>
                       </select></td></tr>""" \
                               % (csrs["frank"]['html'], 
csrs["kathy"]['html'], csrs["chris"]['html'], csrs["tracy"]['html'], 
csrs["susi"]['html'], csrs["bill"]['html'])
   print """
       <html snipped>""" % (body)
  def uploadform():
   try:
       msg = MIMEMultipart()
       msg['To'] = "%s <%s>" % (csrs[clientcsr]['name'], 
csrs[clientcsr]['email'])
       msg['From'] =  "Ad-Mail Upload Manager for %s 
<www at admailinc.com>" % (clientname, )
       msg['Reply-to'] = clientemail
       msg['Subject'] = subject
       msg.attach(MIMEText(body))
       for file in filelist:
           attachment = MIMEBase('application', 'octet-stream')
           attachment.set_payload(file.file.read())
           encode_base64(attachment)
           attachment.add_header('Content-Disposition', 'attachment', 
filename=os.path.split(file.filename)[1])
           msg.attach(attachment)
       smtp = smtplib.SMTP()
       smtp.connect()
       smtp.sendmail('Ad-Mail Upload Manager <www at admailinc.com>', 
csrs[clientcsr]['email'], msg.as_string())
       smtp.close
   except:
       print "<H1>Unknown error.  Please try again later.</H1>"
       smtp = smtp
if not (form and clientname and clientemail and clientcsr):
   print HEADER
   csrform()
   print FOOTER

elif files:
   print HEADER
   print FILESRECEIVED % (' '.join(files), csrs[clientcsr]['name'])
   uploadform()
   print FOOTER
    else:
   print HEADER
   print SELECTFILES % (clientname, clientemail, subject, clientcsr, 
body, clientname.split()[0], csrs[clientcsr]['name'].split()[0])
   print FOOTER

sys.stdout.flush()
sys.stdout.close()
</code>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-list/attachments/20080514/cb851003/attachment-0001.html>


More information about the Python-list mailing list