通过Flask URL

时间:2017-11-07 23:28:11

标签: 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={
  "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页面。

1 个答案:

答案 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

免责声明:这完全来自内存,而且已经很晚了,所以这里或那里可能会有错误......