2016-03-31 5 views
0

Ich lerne cherrypy Rahmen für meine Python-Entwicklung.Ich habe eine Datenbank erstellt, einige Daten eingefügt und jetzt möchte ich es abrufen und im Browser anzeigen.Daten werden in der SQLite-Datenbank erstellt, aber beim Anzeigen der Daten zeigt es einfach für Schleife statt die Daten im Browser zu drucken.Wie verwende ich Python-Code innerhalb der HTML-Datei im Cherrypy-Framework?

import sqlite3 
import cherrypy 

class simple_db(object): 
    @cherrypy.expose 
    def index(self): 
     db = sqlite3.connect('picnic.db') 
     c = db.cursor() 
     c.execute("SELECT item,quant FROM picnic") 
     data = c.fetchone() 
     c.close() 
     output = open("data.html") 
     return output 


if __name__ == '__main__': 

    cherrypy.config.update("app.conf") 
    cherrypy.quickstart(simple_db()) 

Meine HTML-Datei ist

<h1>Things to bring to our picnic</h1> 
    <head> 
    <style> 
    table { 
     border-collapse: collapse; 
    } 
    </style> 
    </head> 
    <table border=1> 
    <tr><th>Item</th><th>Quantity</th></tr> 
    % for row in data: 
     <tr> 
     % for col in row: 
      <td>{{col}}</td> 
     % endfor 
     </tr> 
    % endfor 

Antwort

2

Ihre HTML-Datei eine Vorlage in der Tat (es sieht aus wie Sie Mako verwenden), die gemacht werden muss.

Derzeit öffnet der Code einfach die Vorlagendatei und gibt das Dateiobjekt zurück. Dies bewirkt, dass cherrypy den Inhalt dieser Datei wörtlich zurückgibt.

Unter der Annahme, dass Sie installiert haben mako die einfachste Art und Weise die Vorlage zu machen ist wie folgt:

import sqlite3 
import cherrypy 
from mako.template import Template 

class simple_db(object): 
    @cherrypy.expose 
    def index(self): 
     db = sqlite3.connect('picnic.db') 
     c = db.cursor() 
     c.execute("SELECT item,quant FROM picnic") 
     data = c.fetchall() 
     c.close() 
     return Template(filename='data.html').render(data=data) 

if __name__ == '__main__': 
    cherrypy.config.update("app.conf") 
    cherrypy.quickstart(simple_db()) 

Beachten Sie, dass c.fetchall() sollte statt fetchone() verwendet werden.

Es gab auch einen Fehler in der Vorlage, in dem col nicht korrekt referenziert wird. Es sollte

 <td>${col}</td> 

nicht

 <td>{{col}}</td> 

Dies ist ein sehr einfaches Beispiel. Es kann bequemere Möglichkeiten geben, das Rendern Ihrer Vorlagen zu verarbeiten, z. Vorlagensuchen, so sollten Sie die Mako documentation lesen.

+0

Dank dieses löste mein Problem, können Sie erklären, was mit __name = '__ main__' gemeint ist? – Bhanukiran

+0

@ Bhanukiran: kein Problem. Sie können sich über '__main__' in der [Dokumentation] (https://docs.python.org/3/library/__main__.html#module-__main__) informieren. – mhawke