2016-10-14 12 views
-1

変数に基づいてPythonとJSONのループに問題があります。私がしようとしているのは、渡された1つの変数に基づいてJSONデータの1行だけを出力することです。Pythonとフラスコ、変数に基づいてデータをループして印刷する

相続人

のpythonファイルのコード:

@app.route('/<artist_name>/') 
def artist(artist_name): 
    list = [ 
     {'artist_name': 'Nirvana', 'album_name': 'Nevermind', 'date_of_release': '1993', 'img': 'https://upload.wikimedia.org/wikipedia/en/b/b7/NirvanaNevermindalbumcover.jpg'}, 
     {'artist_name': 'Eminem', 'album_name': 'Marshal Mathers LP', 'date_of_release': '2000', 'img': 'http://e.snmc.io/lk/f/l/6b09725acea3aefbafbf503a76885d0c/1612455.jpg'}, 
     {'artist_name': 'System of a Down', 'album_name': 'Toxicity', 'date_of_release': '2001', 'img': 'http://loudwire.com/files/2015/09/System-of-a-Down-Toxicity.png'}, 
     {'artist_name': 'Korn', 'album_name': 'Life is Peachy', 'date_of_release': '1996', 'img': 'http://loudwire.com/files/2014/01/Life-is-Peachy.jpg'} 
    ] 
    return render_template("artist.html", results=list, artist_name=artist_name)  

そして、これは私のartist.htmlテンプレートです:

{% if results %} 
<ul> 
{% for item in results if item.artist_name == item.artist_name %} 
    <li>{{ item.artist_name }}</li> 
    <li>{{ item.date_of_release}}</li> 
{% endfor %} 
</ul> 
{% endif %} 
「ARTIST_NAME」変数があるときは、されていることは何イム達成しようとして

"artist_name"変数と "date_of_release"変数を出力することができますが、代わりに "artist_name"という変数に基づいて4つのレコードすべてを印刷します。誰も私にこれを助けることができますか?ありがとうございました。

+2

これはおそらく 'item.artist_name == item.artist_name'ですか? – hjpotter92

+0

item.artist_name ==結果など、さまざまなバリエーションを試しましたが、正しく実行する方法がわかりません。 – Animalovsky

+2

試してくださいitem.artist_name == artist_name –

答えて

0

私の解決策はそれほど複雑であり、作業:)

from flask import Flask,render_template,url_for 
import json 
app = Flask(__name__) 
app.debug = False 

@app.route('/<artist_name>/') 
def artist(artist_name): 
    list = [ 
     {'artist_name': 'Nirvana', 'album_name': 'Nevermind', 'date_of_release': '1993', 'img': 'https://upload.wikimedia.org/wikipedia/en/b/b7/NirvanaNevermindalbumcover.jpg'}, 
     {'artist_name': 'Eminem', 'album_name': 'Marshal Mathers LP', 'date_of_release': '2000', 'img': 'http://e.snmc.io/lk/f/l/6b09725acea3aefbafbf503a76885d0c/1612455.jpg'}, 
     {'artist_name': 'System of a Down', 'album_name': 'Toxicity', 'date_of_release': '2001', 'img': 'http://loudwire.com/files/2015/09/System-of-a-Down-Toxicity.png'}, 
     {'artist_name': 'Korn', 'album_name': 'Life is Peachy', 'date_of_release': '1996', 'img': 'http://loudwire.com/files/2014/01/Life-is-Peachy.jpg'} 
    ] 
    res = "" 
    for i in list: 
     if i.get('artist_name') == artist_name: 
      res = i 
    return render_template("artist.html", results=list, artist_name=res)  

if __name__ == '__main__': 
    app.run(host='0.0.0.0') 

テンプレート:

{% if results %} 
<ul> 

    <li>{{ artist_name["artist_name"] }}</li> 
    <li>{{ artist_name["date_of_release"]}}</li> 

</ul> 
{% endif %} 

+1

ありがとうございます。スペースを含む変数を除いて、 "Markus K"によって与えられた答え。 – Animalovsky

0
コメントで

、HJポッターとマルクス(URL内のARTIST_NAMEは大文字と小文字が区別され)それが正しい:しかし私はあなたのURLのエンコードURLとアーティスト名のcapitlisationを強制することに非常に注意しています: 「Down」は「System of a Down」と同じですが、フラスコは常に正しくデコードされますか?

{% if results %} 
<ul> 
{% for item in results if item.artist_name == artist_name %} 
    <li>{{ item.artist_name }}</li> 
    <li>{{ item.date_of_release}}</li> 
{% endfor %} 
</ul> 
{% endif %} 

Is a URL allowed to contain a space? TLDRをご覧ください。 "短い答え:いいえ、あなたはスペースをエンコードする必要がありますが、スペースとして+をエンコードするのは正しいですが、クエリ文字列でのみ、パスでは%20を使用する必要があります。

さらに、コードの再構成を提案する - ビジネスロジックを維持する(つまり、すべてのデータを表示またはロードしないことを決定する)ことを、1つのファイル、 'python'、および表示ロジック(決定ロジック(テンプレート ')'の中に置くことができます

+1

ありがとう、私はそれを見ます。 – Animalovsky