如何在 cherrypy 框架中使用 html 文件中的 python 代码?

How to use python code inside html file in cherrypy framework?

我正在为我的 python 学习 cherrypy 框架 development.I 创建了一个数据库,插入了一些数据,现在我想检索它并在 browser.Data 中创建它sqlite 数据库,但在显示数据时它只是显示 for 循环,而不是在浏览器中打印数据。

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())

我的 html 文件,

    <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

您的 HTML 文件实际上是一个需要渲染的模板(看起来您正在使用 Mako)。

目前您的代码只是打开模板文件并 returning 文件对象。这会导致 cherrypy 逐字 return 该文件的内容。

假设你已经安装了 mako 渲染模板的最简单方法是这样的:

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())

请注意,应使用 c.fetchall() 而不是 fetchone()

模板中还存在错误,未正确引用 col。应该是

        <td>${col}</td>

没有

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

这是一个非常简单的例子。可能有更方便的方法来处理模板的呈现,例如模板查找,所以你应该阅读 Mako documentation.