【问题标题】:Run a python module in a flask HTML template [duplicate]在烧瓶 HTML 模板中运行 python 模块[重复]
【发布时间】:2020-03-11 20:01:00
【问题描述】:

我正在尝试将数据库中的输出从 base64 解码为文本。这是我的代码片段:

from flask import Flask,render_template, request, json
from flask_mysqldb import MySQL
import base64

app = Flask(__name__)
app.config['MYSQL_HOST'] = 'localhost'
app.config['MYSQL_USER'] = 'example'
app.config['MYSQL_PASSWORD'] = 'example'
app.config['MYSQL_DB'] = 'products_db'

mysql = MySQL(app)

@app.route("/")
def main():
    cur = mysql.connection.cursor()
    cur.execute("select * from products;", mysql.connection.commit())
    data = cur.fetchall()
    return render_template('products.html', data=data)

我的html页面:

<!DOCTYPE html>
<html lang="en">
<head>
</head>
<body>
<table border = 1>
    {% for product in data %}
    <tr>
        <td> {{product[0]}}</td>
        <td> {{product[2]}}</td>
        <td> {{base64.b64decode(product[3])}}</td>
    </tr>
    {% endfor %}
</table>
  </body>
</html>

我正在尝试解码产品 [3] 但我失败了,如何在烧瓶上进行解码?我怎样才能导入其他模块?

谢谢

【问题讨论】:

  • @CDJB 我是 FLASK 的新手,不明白如何在我的代码中实现该解决方案。我还在学习 FLASK 的工作原理

标签: python mysql python-2.7 flask jinja2


【解决方案1】:

您不能使用 jinja 模板语言进行 base64 解码。 jinja 不支持 base64.b64decode。您可以在服务器端执行此操作并将数据传递给模板。

from flask import Flask,render_template, request, json
from flask_mysqldb import MySQL
import base64

app = Flask(__name__)
app.config['MYSQL_HOST'] = 'localhost'
app.config['MYSQL_USER'] = 'example'
app.config['MYSQL_PASSWORD'] = 'example'
app.config['MYSQL_DB'] = 'products_db'

mysql = MySQL(app)

@app.route("/")
def main():
    cur = mysql.connection.cursor()
    cur.execute("select * from products;", mysql.connection.commit())
    data = cur.fetchall()
    modified_data = []
    for item in data:
        modified_item = []
        modified_item.append(item[0])
        modified_item.append(item[1])
        modified_item.append(base64.b64decode(item[3])
        modified_data.append(modified_item)
    return render_template('products.html', data=modified_data)

模板索引.html

<!DOCTYPE html>
<html lang="en">
<head>
</head>
<body>
<table border = 1>
    {% for item in data %}
    <tr>
        <td> {{item[0]}}</td>
        <td> {{item[2]}}</td>
        <td> {{item[3]}}</td>
    </tr>
    {% endfor %}
</table>
  </body>
</html>

【讨论】:

  • 感谢您的帮助。当我运行代码时,出现以下错误:TypeError: 'tuple' object does not support item assignment
  • 我做了一些修复这个错误。
  • 感谢您的努力。您的代码只返回一条记录,有没有办法显示整个表格?第一列:ID 第二列:名称第三列:DECODED_BASE64('dGVzdAo=')
  • 你的数据库有多少条记录?
  • 我试图包含有限制的分页。每页有5条记录。总计:468 条记录。
【解决方案2】:

您可以在将返回的数据库内容传递给render_template之前将该函数应用于目标数据值:

@app.route("/")
def main():
   cur = mysql.connection.cursor()
   cur.execute("select * from products;", mysql.connection.commit())
   data = [[*a, base64.b64decode(b)] for *a, b in cur.fetchall()]
   return render_template('products.html', data=data)

现在,在您的模板中:

{% for product in data %}
  <tr>
    <td> {{product[0]}}</td>
    <td> {{product[2]}}</td>
    <td> {{product[3]}}</td>
  </tr>
{% endfor %}

编辑:Python2 解决方案:

data = [i[:3]+[base64.b64decode(i[3])]+i[4:] for i in cur.fetchall()]

【讨论】:

  • 谢谢。它给了我一个关于数据变量中字符“a”之前的星号的错误。
  • @xiholac761 没问题,请参阅我最近的编辑。 * 可用于解包,仅在 Python3 中可用。我为 Python2 添加了一个解决方案。
  • 非常感谢。烧瓶给我一个错误: ValueError: too many values to unpack 可能是因为太多字母吗?如果我可以问,这些字母代表什么?
  • @xiholac761 在for 循环中使用多个逗号分隔变量称为解包。我已经更新了 Python2 解决方案,以更好地反映您的数据库内容结构。
猜你喜欢
  • 2018-03-25
  • 2016-01-28
  • 1970-01-01
  • 1970-01-01
  • 2021-12-09
  • 1970-01-01
  • 2017-07-25
  • 1970-01-01
  • 2016-05-14
相关资源
最近更新 更多