Python 通过烧瓶URL传递对象

Python 通过烧瓶URL传递对象,python,html,web,flask,Python,Html,Web,Flask,我在一个使用Flask的站点上工作,它从API中提取数据,将其处理为JSON,然后根据需要在整个站点中动态加载数据。在有效加载所需数据的同时,我遇到了适当匹配URL的问题 这是我的主要文件: import requests from flask import Flask, render_template app = Flask(__name__) url = 'https://omgvamp-hearthstone-v1.p.mashape.com/cards' myHeaders={

我在一个使用Flask的站点上工作,它从API中提取数据,将其处理为JSON,然后根据需要在整个站点中动态加载数据。在有效加载所需数据的同时,我遇到了适当匹配URL的问题

这是我的主要文件:

import requests
from flask import Flask, render_template

app = Flask(__name__)

url = 'https://omgvamp-hearthstone-v1.p.mashape.com/cards'
myHeaders={
  "X-Mashape-Key": 'key-here',
  "Accept": "application/json"
}
r = requests.get(url, headers=myHeaders)
cards = r.json()
badSets = ['Promo', 'Hall of Fame', 'Tavern Brawl', 'Hero Skins', '    Missions', 'Credits', 'System', 'Debug']

@app.route('/')
def index():
    return render_template('index.html', cards=cards, badSets=badSets)


@app.route('/<setName>', methods=['GET'])
def set(setName):
    return render_template('set.html', cards=cards, setName=setName, badSets=badSets)


@app.route('/<setName>/<cardName>', methods=['GET'])
def individualCard(setName, cardName):
    return render_template('card.html', cards=cards, setName=setName, cardName=cardName, badSets=badSets)
这是如何实现的,而且不必在我的所有数据中使用for循环,这是可能的吗


如果需要,我很乐意加载我的html页面。

假设您解析的json数据的基本结构如下所示:一个包含字典列表的字典:

{
  "Basic": [{"cardId": 4711, ...}, {"cardId": 4712, ...}, ...],
  "Fancy": [...],
  ...
}
你可以重写:

@app.route('/<setName>', methods=['GET'])
def set(setName):
    cardset = cards.get(setName)
    return render_template('set.html', cardset=cardset)
这用于从所选卡片集中提取与具有我们正在查找的cardId的所有内容相匹配的列表,并且应该是一个包含单个元素的列表。我们将第一个元素返回模板进行渲染

现在,这显然不进行任何错误检查,例如,我们传递的字典键可能错误且未找到,可能未找到cardId,或者更有趣的是,对于我们传递的cardId,可能有多个结果

但这将是如何处理这一问题的总体思路

还请注意,为了清晰起见,我在示例中省略了坏集,我假设这是禁止使用的卡集,或者是出于测试目的

在这种情况下,您需要在查找集合之前先检查字典键,并显示错误页或其他内容,可能是:

@app.route('/<setName>', methods=['GET'])
def set(setName):
    if setName in badSets:
        return render_template('error.html')
    cardset = cards.get(setName)
    return render_template('set.html', cardset=cardset)

免责声明:这纯粹是内存造成的,而且已经很晚了,因此可能会在这里或那里出现错误……

您能否举例说明您处理的JSON是什么样子的,并简要说明您的工作流程,例如,您的路由用于什么?也许只是我,但我很难理解你的问题所在。@bgse我感谢你的评论。JSON的格式是这样的:打印卡['Basic'][0]给我{'cardd':'GAME_004','dbfId':'1740','name':'AFK','cardSet':'Basic','type':'enchanment','text':'Your turns is shorter','playerClass':'Neutral','locale':'enUS'}其中['Basic']是当索引从包含在basic中的子字典中取出单个卡片时,我试图遍历的集合。该网站的目标是像Mythicspoiler.com一样,但以在线纸牌游戏Hearthstone为基础。显示集合和卡片的位置。这是我从中提取API的站点:如果这有助于解释有关我尝试执行的操作的更多信息……那么您的应用程序或多或少是一个卡片浏览器,用户可以从集合列表中选择一组卡片,然后从我选择的集合中选择一个特定的卡片?您希望避免将individualCard中的所有json数据传递给模板,以便在模板中查找卡片,而只传递通过参数提取的单个卡片。这是正确的吗?是的,这或多或少就是我想要做的。谢谢你的回答。我自己也有点累了,但我一定会在早上读一遍并测试一下。我很好奇为什么你用cardId而不是cardName。所以,我能让它与cardName一起工作。我想用户可以更方便地输入他们想要查看的卡片的URL。我很好奇你是否能帮我为我的模板构建href。目前,它是{%forcardset%}{%if'img'在cardset%}{%if'collectible'在cardset%}{{card['name']}}但是在这条线上的某个地方,我想我在链接时丢失了集合名。
@app.route('/<setName>/<cardId>', methods=['GET'])
def individualCard(setName, cardId):
    cardset = cards.get(setName)
    matches = [x for x in cardset if x['cardId'] == cardId]
    card = matches[0]
    return render_template('card.html', card=card)
@app.route('/<setName>', methods=['GET'])
def set(setName):
    if setName in badSets:
        return render_template('error.html')
    cardset = cards.get(setName)
    return render_template('set.html', cardset=cardset)