如何在没有最后 4 个字符的情况下将变量作为字符串传递到 HTML 中

How to pass a variable as a string into HTML without the last 4 characters

提问人:JoseGonzales 提问时间:10/31/2023 更新时间:11/10/2023 访问量:37

问:

我正在尝试使用 flask 在我的网站上显示图像。我有一个for循环,可以遍历在我的“static”目录中找到的图像,但我也想在图像底部显示图像的名称。目前,图像的名称显示为“image.jpg”,但我希望删除“.jpg”。知道我该怎么做吗?

这是我 app.py

from flask import Flask, render_template, flash, url_for
import os

app = Flask(__name__)


@app.route('/')
def hello_world():
    return render_template("home.html")

@app.route('/select.html')
def select():
  imagelist = os.listdir(os.path.join(app.static_folder,"images"))
  return render_template("select.html", imagelist=imagelist)
  
@app.route('/versus.html')
def versus():
  return render_template("versus.html")
  
if __name__ == '__main__':
    app.run(host='0.0.0.0',debug=True)

这是我有for循环的html模板

<!DOCTYPE html>
<html>
  <head>
    <title>Disney Favorites</title>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-T3c6CoIi6uLrA9TneNEoa7RxnatzjcDSCmG1MXxSR1GAsXEV/Dwwykc2MPK8M2HN" crossorigin="anonymous">
    <style>
      .center {
        display: block;
        margin-left: auto;
        margin-right: auto;
        width: 50%;
      }
      .centre {
        text-align: center;
      }
    </style>
  </head>
  <body>
      <h1 style= "font-size: 25px" class="text-center">Click on your favorite animated Disney canon movie</h1>
      <section>
        {% for image in imagelist %}
        <div class="centre">
          <button type="submit">
          <img class="center" src="{{ url_for('static', filename='images/' + image) }}">
          </img>
          <p>{{image}}</p>
          </button>
        </div>
        {% endfor %}
      </section>
Python HTML Flask 变量

评论

0赞 Lenntror 10/31/2023
是否在 html 中工作或这会引发错误?image.replace(".jpg", "")
0赞 BlackJack 11/10/2023
@Lenntror 这不是删除最后四个字符,而是替换 中的任何位置.jpgimage

答:

0赞 rioV8 10/31/2023 #1

您必须使用过滤器:

<p>{{image|replace(".jpg", "")}}</p>

评论

0赞 BlackJack 11/10/2023
这是在另一个字符串中替换一个字符串,并且只有在末尾时才巧合地删除它。
0赞 rioV8 11/10/2023
@BlackJack 如果你的图像或文件只是放弃最后 4 个字符会得到错误的输出,如果图像不是存储在服务器上而是生成并且没有扩展名作为 URL,但类型是响应的一部分,总是删除 4 个字符是错误的.tiff.webp
0赞 BlackJack 11/10/2023
这就是为什么更好的解决方案是用于获取没有扩展名的文件名。还解决了问题中的代码使用硬编码分隔符和 .pathlib.Path+
0赞 BlackJack 11/10/2023 #2

这是一个懒惰的问题。字符串是一种基本数据类型,使用字符串切片 () 和字符串方法删除固定数量的字符,例如通常是初学者教程的一部分,或者至少通过查看文档很容易发现。filename[:-4]filename.remove_suffix(".jpg")

这甚至与 Flask 或 Web 编程无关:

>>> import jinja2
>>> jinja2.Template("{{filename[:-4]}}").render(filename="test.jpg")
'test'

评论

0赞 rioV8 11/10/2023
它是 Flask,因为 Jinja2 是 Flask 的默认模板引擎
0赞 rioV8 11/10/2023
如果模板引擎不支持您建议的构造,则说明您有问题
0赞 BlackJack 11/10/2023
@rioV8 但这无关紧要,问题是关于 Python 类型的。这不会改变其 API 或 Web 应用程序或 Jinja 模板中的行为。str
0赞 BlackJack 11/10/2023
更好的解决方案是放弃用于路径的普通字符串,并使用标准库中的属性来获取不带扩展名的文件名。pahtlib.Pathstem
0赞 rioV8 11/10/2023
因此,如果我在 Python 脚本中读取文本文件,则会计算所有表达式? 不是一个有效的 Python 结构,但它做了一些有用的事情{{x|y}}
0赞 Diego E. Maidana 11/10/2023 #3

您可以使用带有负数的方法 slice 从字符串末尾开始计数。

image = "myImage.jpg"
pureImageName = image[:-4]
    
print(pureImageName) // myImage

评论

0赞 rioV8 11/10/2023
OP 需要 Jinja2 模板中的解决方案,他需要文件名和没有可能扩展名的文件名