首页 > 解决方案 > Python Flask - 返回具有相同变量的值

问题描述

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

例如,如果我用我的 HTML 编写:

{{ 项目名 }}

我写了很多次,并使用返回: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)

标签: pythonflask

解决方案


为了达到您需要的要求,循环应该在 html 文件中。这是Jinja 的文档

这是您可以根据当前配置执行的操作的示例 @app.route("/")

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

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

索引.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)

推荐阅读