Graham Dumpleton wrote:
A few additional comments on top of what others have said.

On Aug 26, 11:09 am, Phil <phil...@gmail.com> wrote:
As I've read elsewhere, "These days, FastCGI is never used directly.

    Actually, FCGI works quite well.  Sitetruth's AdRater
(http://www.sitetruth.com/downloads/adrater.html) uses
FCGI and Python on the server.

    FCGI is basically CGI with process reusability. Each
app gets its own process in its own address space with its
own global interpreter lock.  mod_fcgi in Apache keeps a
supply of such processes around, launching additional ones if there's
heavy request traffic and shutting down existing ones when there
isn't.  Each process handles one transaction after another,
so, unlike CGI, you're not spending all your time loading Python
and its modules.

    Here's the main loop of a real FCGI application.  This uses a small
WSGI library on the Python side.  No "framework" is involved.


#!/usr/local/bin/python
...
from fcgi import WSGIServer
import MySQLdb
db = None       # database connection, held open for life of FCGI
#
#       The application
#
def QuickSitetruthQuery(environ, start_response):
    global db   # static global - active database handle
    try:
        if db : # if previously attached
            try :
                db.ping() # test whether connection is still up
            # handle loss of database connection
            except MySQLdb.OperationalError, message:   
                db = None # we lost database connection
                if db is None : # if no valid database handle
                    db = miscutils.dbattach(kdbfile)    # connect to database
        status = '200 OK'               # normal status
        headers = [('Content-type','text/xml'), ('charset','utf-8')]
        reqlist = cgi.parse_qsl(environ['QUERY_STRING'])        # Parse params
        priority = 1            # priority of request
        sourceip = environ['REMOTE_ADDR']       # get IP address of client
        urls = []                       # list of URLs to check
        for item in reqlist :           # for all items
            (key, value) = item         # extract item
            if key.lower() == 'url' :   # want all "url" items
                urls.append(value)
            elif key.lower() == 'priority' :    # if priority
                priority = int(value)   # get priority value
        #       Make request; no waiting, no details
        outstr = InfoDisplay.getratingXMLquick(db, kdbfile, urls,
                priority, sourceip) # get the rating XML, never wait
        start_response(status, headers)         # compose result
        s = kprefixxml + outstr + ksuffixxml    # construct output XML
        return [s.encode('utf8')]               # encode as UTF8
    except Exception, message:          # if trouble, report to user
        #       Error handling
        status = "500 Internal Error on Server"
        response_headers = [("Content-type","text/html")]
        start_response(status, response_headers)
        s = "<h1>Internal error - request not processed.</h1>\n\n"
            + traceback.format_exc()
        s = s.replace("\n","<br>")    # convert to HTML
        return [s]
#
#       Main FCGI program
#
WSGIServer(QuickSitetruthQuery).run()

                                        
--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to