我正在使用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)
首先,我宁愿不必将每个html页面都传递给我的所有数据。有没有办法只拉动所需要的东西而忽略其余的东西?
其次,我想传递字典对象,即
if card['name'] == card[setName][--index--][cardName]:
pass card object to html page here
如何实现这一点,是否可以在不必使用for循环遍历所有数据的情况下进行?
如果需要,我很乐意加载我的html页面。
答案 0 :(得分:1)
假设您解析的json数据的基本结构如下所示(带字典列表的字典):
class foo:
def __init__(self,p1,p2):
self.a1 = p1
self.a2 = p2
def __eq__(self, another):
return self.a1 == another.a1 and self.a2 == another.a2
def main():
o1=foo("lucy","jack")
o2=foo('lucy','jack')
print(o1==o2)
main()
你可以改写:
{
"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)
,传递cardName
并重写另一条路线:
cardId
这使用list comprehension从我们选择的@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)
中提取matches
(包含我们正在寻找的cardId的所有内容)的列表,并且应该是包含单个元素的列表。我们将第一个元素返回到模板进行渲染。
现在这显然没有进行任何错误检查,例如我们传递的字典键可能是错误的而且找不到,可能找不到cardId,或者更有趣的是我们通过的cardId可能有多个结果
但这就是如何处理这个问题的一般想法。
另请注意,为了清楚起见,我在示例中省略了cardset
,我假设这是禁止使用的卡片组,或用于测试目的。
对于这种情况,您需要在查找集合之前先检查字典键,然后显示错误页面或其他内容:
badSets
免责声明:这完全来自内存,而且已经很晚了,所以这里或那里可能会有错误......