This is an example implementation of a server-side script which can be used with a Python scripting environment. It is configured as a CGI script (so remember to chmod 755 etc) but could readily be modified to be used in a Python scripting framework.
To use the code on your own server, simply change the _columns array to list the columns you wish to include from your database, set _indexColumn to a column which is indexed (for speed), _sTable to the table name, and finally fill in your database connection parameters to _databaseInfo. You may also have to change the #! line to point towards your Python engine.
#!/usr/bin/python # Script: DataTables server-side script for PHP and MySQL # Copyright: 2010 - Allan Jardine # License: GPL v2 or BSD (3-point) # Modules import cgi import MySQLdb # CGI header print "Content-Type: text/plain\n\n" # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # Easy set varaibles # # Array of database columns which should be read and sent back to DataTables _columns = [ 'engine', 'browser', 'platform', 'version', 'grade' ] # Indexed column (used for fast and accurate table cardinality) _indexColumn = "id"; # DB table to use _sTable = "ajax"; # Database connection information _databaseInfo = dict( host = "", user = "", passwd = "", db = "" ) # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # If you just want to use the basic configuration for DataTables with PHP server-side, there is # no need to edit below this line # class DataTablesServer: # # __init__ # Constructor # def __init__( self ): # Class properties self.cgi = cgi.FieldStorage() self.dbh = MySQLdb.connect(host=_databaseInfo['host'], user=_databaseInfo['user'], \ passwd=_databaseInfo['passwd'], db=_databaseInfo['db']) self.resultData = None self.cadinalityFiltered = 0 self.cadinality = 0 self.runQueries() self.outputResult() # # outputResult # Output the JSON required for DataTables # def outputResult( self ): output = '{' output += '"sEcho": '+str(int(self.cgi['sEcho'].value))+', ' output += '"iTotalRecords": '+str(self.cardinality)+', ' output += '"iTotalDisplayRecords": '+str(self.cadinalityFiltered)+', ' output += '"aaData": [ ' for row in self.resultData: output += '[' for i in range( len(_columns) ): if ( _columns[i] == "version" ): # 'version' specific formatting if ( row[ _columns[i] ] == "0" ): output += '"-",' else: output += '"'+str(row[ _columns[i] ])+'",' else: # general formatting output += '"'+row[ _columns[i] ].replace('"','\\"')+'",' # Optional Configuration: # If you need to add any extra columns (add/edit/delete etc) to the table, that aren't in the # database - you can do it here output = output[:-1] output += '],' output = output[:-1] output += '] }' print output # # runQueries # Generate the SQL needed and run the queries # def runQueries( self ): # Get the data dataCursor = self.dbh.cursor( cursorclass=MySQLdb.cursors.DictCursor ) dataCursor.execute( """ SELECT SQL_CALC_FOUND_ROWS %(columns)s FROM %(table)s %(where)s %(order)s %(limit)s""" % dict( columns=', '.join(_columns), table=_sTable, where=self.filtering(), order=self.ordering(), limit=self.paging() ) ) self.resultData = dataCursor.fetchall() cadinalityFilteredCursor = self.dbh.cursor() cadinalityFilteredCursor.execute( """ SELECT FOUND_ROWS() """ ) self.cadinalityFiltered = cadinalityFilteredCursor.fetchone()[0] cadinalityCursor = self.dbh.cursor() cadinalityCursor.execute( """ SELECT COUNT(%s) FROM %s """ % _indexColumn, _sTable ) self.cardinality = cadinalityCursor.fetchone()[0] # # filtering # Create the 'WHERE' part of the SQL string # def filtering( self ): filter = "" if ( self.cgi.has_key('sSearch') ) and ( self.cgi['sSearch'].value != "" ): filter = "WHERE " for i in range( len(_columns) ): filter += "%s LIKE '%%%s%%' OR " % (_columns[i], self.cgi['sSearch'].value) filter = filter[:-3] return filter # # ordering # Create the 'ORDER BY' part of the SQL string # def ordering( self ): order = "" if ( self.cgi['iSortCol_0'].value != "" ) and ( self.cgi['iSortingCols'].value > 0 ): order = "ORDER BY " for i in range( int(self.cgi['iSortingCols'].value) ): order += "%s %s, " % (_columns[ int(self.cgi['iSortCol_'+str(i)].value) ], \ self.cgi['sSortDir_'+str(i)].value) return order[:-2] # # paging # Create the 'LIMIT' part of the SQL string # def paging( self ): limit = "" if ( self.cgi['iDisplayStart'] != "" ) and ( self.cgi['iDisplayLength'] != -1 ): limit = "LIMIT %s, %s" % (self.cgi['iDisplayStart'].value, self.cgi['iDisplayLength'].value ) return limit # Perform the server-side actions for DataTables dtserver=DataTablesServer()