【问题标题】:Python Flask - Returning values that has the same variablePython Flask - 返回具有相同变量的值
【发布时间】:2020-05-20 11:41:34
【问题描述】:

所以我的代码有问题,我试图从 python 将值返回到我的 HTML。现在我正在使用一个包含 190 多种产品的 API,它们都存储在 itemName、buyPrice、sellPrice 等变量中。

例如,如果我用 HTML 编写:

{{ itemName }}

我写了很多次,然后使用: return ("index.html", itemName=itemName)

它当然会一遍又一遍地返回相同的名称,现在我希望它返回第一个名称,然后是第二个名称,然后是第三个名称,依此类推,买入和卖出价格相同。

名称位于名为“产品”的数组中,价格等位于我使用 request.get(...) 的 API 中。我的代码在下面

import requests
import time
import datetime
from flask import Flask, render_template, redirect, url_for

app = Flask(__name__)


product = [
    "BROWN_MUSHROOM",
    "INK_SACK:3",  # cocao beans
    "INK_SACK:4",  # lapis lazuli
    "TARANTULA_WEB",
    "CARROT_ITEM",
    "ENCHANTED_POTATO",
    "ENCHANTED_SLIME_BALL",
    "ENCHANTED_GOLDEN_CARROT",
    "ENCHANTED_RED_MUSHROOM",
    "ENCHANTED_RABBIT_HIDE",
    "ENCHANTED_BIRCH_LOG",
    "ENCHANTED_GUNPOWDER",
    "ENCHANTED_MELON",
    "ENCHANTED_SUGAR",
    "CACTUS",
    "ENCHANTED_BLAZE_ROD",
    "ENCHANTED_CAKE",
    "PUMPKIN",
    "ENCHANTED_BROWN_MUSHROOM",
    "WHEAT",
    "ENCHANTED_RAW_SALMON",
    "ENCHANTED_GLISTERING_MELON",
    "PRISMARINE_SHARD",
    "PROTECTOR_FRAGMENT",
    "ENCHANTED_EMERALD",
    "ENCHANTED_SPIDER_EYE",
    "RED_MUSHROOM",
    "MUTTON",
    "ENCHANTED_MELON_BLOCK",
    "DIAMOND",
    "WISE_FRAGMENT",
    "COBBLESTONE",
    "SPIDER_EYE",
    "RAW_FISH",
    "ENCHANTED_PUFFERFISH",
    "POTATO_ITEM",
    "ENCHANTED_HUGE_MUSHROOM_1",  # enchanted brown mushroom block
    "ENCHANTED_COBBLESTONE",
    "ENCHANTED_HUGE_MUSHROOM_2",  # enchanted red mushroom block
    "PORK",
    "PRISMARINE_CRYSTALS",
    "ICE",
    "HUGE_MUSHROOM_1",  # brown mushroom block
    "HUGE_MUSHROOM_2",  # red mushroom block
    "LOG_2:1",  # dark oak
    "ENCHANTED_SNOW_BLOCK",
    "GOLDEN_TOOTH",
    "STRING",
    "RABBIT_FOOT",
    "REDSTONE",
    "ENCHANTED_CACTUS_GREEN",
    "ENCHANTED_CARROT_STICK",
    "ENCHANTED_LAPIS_LAZULI_BLOCK",
    "ENCHANTED_COOKIE",
    "ENCHANTED_ENDSTONE",
    "ENCHANTED_SAND",
    "ENCHANTED_STRING",
    "STRONG_FRAGMENT",
    "SLIME_BALL",
    "ENCHANTED_ACACIA_LOG",
    "SNOW_BALL",
    "ENCHANTED_EGG",
    "SAND",
    "RAW_CHICKEN",
    "ENCHANTED_LAPIS_LAZULI",
    "ENCHANTED_GHAST_TEAR",
    "ENCHANTED_COCOA",
    "SEEDS",
    "ENCHANTED_LEATHER",
    "ENCHANTED_SPONGE",
    "HAY_BLOCK",
    "FLINT",
    "INK_SACK",
    "WOLF_TOOTH",
    "ENCHANTED_SPRUCE_LOG",
    "ENCHANTED_ROTTEN_FLESH",
    "ENCHANTED_GRILLED_PORK",
    "ENCHANTED_NETHER_STALK",
    "ENCHANTED_REDSTONE_BLOCK",
    "ENCHANTED_QUARTZ_BLOCK",
    "GREEN_CANDY",
    "ENCHANTED_REDSTONE",
    "ENCHANTED_REDSTONE_LAMP",
    "GRAVEL",
    "MELON",
    "ENCHANTED_LAVA_BUCKET",
    "ENCHANTED_PACKED_ICE",
    "RAW_FISH:3",  # pufferfish
    "ENCHANTED_PRISMARINE_SHARD",
    "ENCHANTED_CARROT_STICK",
    "ENCHANTED_IRON_BLOCK",
    "BONE",
    "RAW_FISH:2",  # clownfish
    "RAW_FISH:1",  # raw salmon
    "REVENANT_FLESH",
    "ENCHANTED_PORK",
    "ENCHANTED_GLOWSTONE",
    "FEATHER",
    "NETHERRACK",
    "SPONGE",
    "BLAZE_ROD",
    "ENCHANTED_DARK_OAK_LOG",
    "YOUNG_FRAGMENT",
    "ENCHANTED_CLOWNFISH",
    "ENCHANTED_GOLD",
    "ENCHANTED_RAW_CHICKEN",
    "ENCHANTED_WATER_LILY",
    "LOG:1",  # spruce
    "CATALYST",
    "LOG:3",  # jungle
    "LOG:2",  # birch
    "ENCHANTED_GLOWSTONE_DUST",
    "ENCHANTED_INK_SACK",
    "ENCHANTED_CACTUS",
    "ENCHANTED_SUGAR_CANE",
    "ENCHANTED_COOKED_SALMON",
    "ENCHANTED_SEEDS",
    "LOG",  # oak
    "GHAST_TEAR",
    "ENCHANTED_ENDER_PEARL",
    "UNSTABLE_FRAGMENT",
    "PURPLE_CANDY",
    "ENCHANTED_FERMENTED_SPIDER_EYE",
    "ENCHANTED_GOLD_BLOCK",
    "ENCHANTED_JUNGLE_LOG",
    "ENCHANTED_FLINT",
    "IRON_INGOT",
    "ENCHANTED_EMERALD_BLOCK",
    "ENCHANTED_CLAY_BALL",
    "GLOWSTONE_DUST",
    "GOLD_INGOT",
    "REVENANT_VISCERA",
    "TARANTULA_SILK",
    "ENCHANTED_MUTTON",
    "SUPER_EGG",
    "SUPER_COMPACTOR_3000",
    "ENCHANTED_IRON",
    "STOCK_OF_STONKS",
    "ENCHANTED_HAY_BLOCK",
    "ENCHANTED_BONE",
    "ENCHANTED_PAPER",
    "ENCHANTED_DIAMOND_BLOCK",
    "SUPERIOR_FRAGMENT",
    "EMERALD",
    "ENCHANTED_RABBIT_FOOT",
    "ENCHANTED_ICE",
    "HOT_POTATO_BOOK",
    "CLAY_BALL",
    "OLD_FRAGMENT",
    "GREEN_GIFT",
    "PACKED_ICE",
    "WATER_LILY",  # lily pad
    "LOG_2",  # acacia
    "HAMSTER_WHEEL",
    "ENCHANTED_OBSIDIAN",
    "ENCHANTED_COAL",
    "ENCHANTED_QUARTZ",
    "COAL",
    "ENDER_PEARL",
    "ENCHANTED_COAL_BLOCK",
    "ENCHANTED_PRISMARINE_CRYSTALS",
    "ENCHANTED_WET_SPONGE",
    "ENDER_STONE",  # end stone
    "ENCHANTED_RAW_FISH",
    "QUARTZ",
    "FOUL_FLESH",
    "RAW_BEEF",
    "ENCHANTED_EYE_OF_ENDER",
    "SUGAR_CANE",
    "MAGMA_CREAM",
    "RED_GIFT",
    "ENCHANTED_RAW_BEEF",
    "ENCHANTED_SLIME_BLOCK",
    "ENCHANTED_FEATHER",
    "ENCHANTED_OAK_LOG",
    "RABBIT_HIDE",
    "WHITE_GIFT",
    "RABBIT",
    "NETHER_STALK",
    "SULPHUR",
    "ENCHANTED_CARROT",
    "ENCHANTED_PUMPKIN",
    "ROTTEN_FLESH",
    "ENCHANTED_COOKED_FISH",
    "OBSIDIAN",
    "ENCHANTED_MAGMA_CREAM",
    "ENCHANTED_FIREWORK_ROCKET",
    "LEATHER",
    "ENCHANTED_COOKED_MUTTON",
    "ENCHANTED_RABBIT",
    "ENCHANTED_BREAD",
    "ENCHANTED_CHARCOAL",
    "ENCHANTED_BLAZE_POWDER",
    "SUMMONING_EYE",
    "SNOW_BLOCK",
    "ENCHANTED_BAKED_POTATO",
    "COMPACTOR",
    "ENCHANTED_DIAMOND"
]

for x in product:
    f = requests.get(
        "https://api.hypixel.net/skyblock/bazaar/product?key=[key supposed to be secret]&productId=" + x).json()

    # Item Name
    itemName = f["product_info"]["product_id"]
    # TimeStamp
    timestamp = f["product_info"]["week_historic"][0]["timestamp"]

    unixTimestamp = timestamp / 1000.0

    # Buy Price
    buyPrice = f["product_info"]["buy_summary"][0]["pricePerUnit"]
    # Buy Amount
    buyAmount = f["product_info"]["buy_summary"][0]["amount"]
    # Buy Orders
    buyOrders = f["product_info"]["buy_summary"][0]["orders"]

    # Sell Price
    sellPrice = f["product_info"]["sell_summary"][0]["pricePerUnit"]
    # Sell Amount
    sellAmount = f["product_info"]["sell_summary"][0]["amount"]
    # Sell Orders
    sellOrders = f["product_info"]["sell_summary"][0]["orders"]

    # Week History
    # Buys
    buys = f["product_info"]["week_historic"][0]["buys"]
    # Buy Volume
    buyVolume = f["product_info"]["week_historic"][0]["buyVolume"]
    # Sells
    sells = f["product_info"]["week_historic"][0]["sells"]
    # Sell Volume
    sellVolume = f["product_info"]["week_historic"][0]["sellVolume"]

    @app.route("/")
    def index():
        return render_template("index.html", itemName=itemName)

    if __name__ == "__main__":
        app.run(debug=True)

【问题讨论】:

  • 你必须在你的 index.html 中做。你能显示html文件吗?
  • 我没有和以前一样的 HTML,尝试进行更改但没有运气,这就是它在正文标签内部的样子。 pastebin.com/eufThtLW(在那里更容易阅读)顺便说一句,如果有帮助,我会使用 Jinja。

标签: python flask


【解决方案1】:

要达到你需要的要求,循环应该在html文件中。 这是documentation from Jinja

以下是您可以执行的操作示例,基于您对 @app.route("/") 的当前配置

@app.route("/")
def index():
    return render_template("index.html", product=product)

刚刚将模板变量更改为product。 更改之后,您只需要在 html 文件中对其进行迭代。 这是您需要做的更改的最小示例。

index.html

<!DOCTYPE html>
<html>

<head>
  <meta charset="utf-8">
  <title>Example</title>
</head>

<body>
    {% for item in product %}
     <h1>{{ item }}</h1>
     {% endfor %}
  </div>
</body>

</html>

要使用 api 中的值,您必须创建一个新列表,并将其传递给模板...只需迭代并将数据放入新列表中。之后将新列表传递给视图。

full_list = list()
for x in product:
    row = list()
    row.append(x)
    f = requests.get(
    "https://api.hypixel.net/skyblock/bazaar/product?key=[key supposed to be secret]&productId=" + x).json()

    # Item Name
    itemName = f["product_info"]["product_id"]
    row.append(itemName)
    # TimeStamp
    timestamp = f["product_info"]["week_historic"][0]["timestamp"]
    row.append(timestamp)
    unixTimestamp = timestamp / 1000.0

    # Buy Price
    buyPrice = f["product_info"]["buy_summary"][0]["pricePerUnit"]
    row.append(buyPrice)
    # Buy Amount
    buyAmount = f["product_info"]["buy_summary"][0]["amount"]
    row.append(buyAmount)
    #and so on with every information you need in html.
    #...
    full_list.append(row)

现在只需将您的@app.route("/")index.html 更改为您的新模板变量名称:

@app.route("/")
def index():
    return render_template("index.html", full_list=full_list)

【讨论】:

  • 这也适用于 - buyPrice、sellPrice 等吗?当我尝试启动代码时,我从 API 获取这些值,但它不起作用。
【解决方案2】:

我过去通过将响应返回到列表然后将列表传递给视图函数来完成此操作

itemNameList = []

for x in product:
    itemName = f["product_info"]["product_id"]
    itemNameList = itemNameList.append(itemName)

【讨论】:

  • 您的意思是将所有值存储到一个新数组中,甚至可能是一个 JSON 文件,然后将数据从 JSON 导出到我的 html 中?
  • 是的,将其保存到一个新数组中,我将在 HTML 中使用 jinja 进行迭代。正如另一个答案在这里建议的那样,您也可以将产品数组传递给视图函数。这在一定程度上取决于您的 HTML 是如何构建的,以及您是否需要分离出产品中的各个属性(如 itemNames)并运行单独的循环。
猜你喜欢
  • 1970-01-01
  • 2012-03-13
  • 1970-01-01
  • 1970-01-01
  • 2021-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-05
相关资源
最近更新 更多