Python 从Flask模板中访问特定字典密钥
我正在使用Python和Flask建立我的个人网站。对于博客部分,我从一个Python 从Flask模板中访问特定字典密钥,python,json,flask,Python,Json,Flask,我正在使用Python和Flask建立我的个人网站。对于博客部分,我从一个json文件中阅读我的博客文章,然后通过。模板。我正在用python读取文件,如下所示: @app.route('/blog') def renderblog(): filename = os.path.join(app.static_folder, 'blogs.json') with open(filename) as blog_file: data = json.load(blog_f
json
文件中阅读我的博客文章,然后通过。模板。我正在用python读取文件,如下所示:
@app.route('/blog')
def renderblog():
filename = os.path.join(app.static_folder, 'blogs.json')
with open(filename) as blog_file:
data = json.load(blog_file)
return render_template("blog.html", posts=data['posts'])
json
文件的内容是:
{
"posts": {
"1": {
"title": "Welcome",
"author": "mikeres0",
"date": "",
"tags": "welcome,intro,outline",
"content": "<p>Test content</p>",
"hidden": "0"
},
"2": {
"title": "Welcome",
"author": "mikeres0",
"date": "",
"tags": "",
"content": "<p>Test content</p>",
"hidden": "1"
}
}
}
我遇到的问题是,尽管json
的格式是我想要的,但当文件被读入字典时,它并没有保持它的顺序。在这种特定情况下,如何访问某些键、值对?请在下面找到一个截图。
因此,根据您的示例,假设您的字典“键”是以字符串形式存储的整数值,您可以这样做:
@app.route('/blog')
def renderblog():
filename = os.path.join(app.static_folder, 'blogs.json')
with open(filename) as blog_file:
data = json.load(blog_file)
order = [x for x in data['posts']]
order.sort(key=lambda x: int(x))
return render_template("blog.html", posts=data['posts'], order=order)
然后,在Jinja2模板中:
{% if posts %}
{% for key in order %}
{% for blogKey, blogValue in posts.key.items() %}
{% if blogKey == 'title' %}
{{ blogValue }}
{% endif %}
{% if blogKey == 'content' %}
{{ blogValue|safe }}
{% endif %}
{% endfor %}
{% endfor %}
{% endif %}
在我看来,我使用的最佳实践(请就此向我提出质疑)是使用字典列表,而不是重复使用没有顺序的字典。因此,更理想的JSON结构如下:
{
"posts": [
{
"order": 1
"title": "Welcome",
"author": "mikeres0",
"date": "",
"tags": "welcome,intro,outline",
"content": "<p>Test content</p>",
"hidden": "0"
},
{
"order": 2
"title": "Welcome",
"author": "mikeres0",
"date": "",
"tags": "",
"content": "<p>Test content</p>",
"hidden": "1"
}
]
}
from operator import attrgetter
data['posts'].sort(key=attrgetter('order'))
因此,假设根据您的示例,您的字典“键”是存储为字符串的整数值,您可以这样做:
@app.route('/blog')
def renderblog():
filename = os.path.join(app.static_folder, 'blogs.json')
with open(filename) as blog_file:
data = json.load(blog_file)
order = [x for x in data['posts']]
order.sort(key=lambda x: int(x))
return render_template("blog.html", posts=data['posts'], order=order)
然后,在Jinja2模板中:
{% if posts %}
{% for key in order %}
{% for blogKey, blogValue in posts.key.items() %}
{% if blogKey == 'title' %}
{{ blogValue }}
{% endif %}
{% if blogKey == 'content' %}
{{ blogValue|safe }}
{% endif %}
{% endfor %}
{% endfor %}
{% endif %}
在我看来,我使用的最佳实践(请就此向我提出质疑)是使用字典列表,而不是重复使用没有顺序的字典。因此,更理想的JSON结构如下:
{
"posts": [
{
"order": 1
"title": "Welcome",
"author": "mikeres0",
"date": "",
"tags": "welcome,intro,outline",
"content": "<p>Test content</p>",
"hidden": "0"
},
{
"order": 2
"title": "Welcome",
"author": "mikeres0",
"date": "",
"tags": "",
"content": "<p>Test content</p>",
"hidden": "1"
}
]
}
from operator import attrgetter
data['posts'].sort(key=attrgetter('order'))
我对@PJ Santoro的答案有点胡思乱想,但我决定采用另一种方法,将
json
加载到OrderedICT
:
import collections
@app.route('/blog')
def renderblog():
filename = os.path.join(app.static_folder, 'blogs.json')
with open(filename) as blog_file:
data = json.load(blog_file, object_pairs_hook=collections.OrderedDict)
return render_template("blog.html", posts=data['posts'])
我对@PJ Santoro的答案有点胡思乱想,但我决定采用另一种方法,将
json
加载到OrderedICT
:
import collections
@app.route('/blog')
def renderblog():
filename = os.path.join(app.static_folder, 'blogs.json')
with open(filename) as blog_file:
data = json.load(blog_file, object_pairs_hook=collections.OrderedDict)
return render_template("blog.html", posts=data['posts'])
例如,post“2”将显示在post“1”之前?(帖子出现了,但没有顺序?)我应该说得更清楚,我会更新我的问题,因为我不知道如何访问特定的值,博客帖子的字段以错误的顺序出现。你能看到像这样的东西吗,
{value[“title”].item}
在第一个for
循环之后直接工作吗?(可能不完全是这样,试着玩一下,看看类似的东西是否有效)因此,例如,post“2”将显示在post“1”之前?(帖子出现了,但没有顺序?)我应该说得更清楚,我会更新我的问题,因为我不知道如何访问特定的值,博客帖子的字段以错误的顺序出现。你能看到像这样的东西吗,{value[“title”].item}
在第一个for
循环之后直接工作吗?(可能不是那样,试着用它看看类似的东西是否有效)`File/home/mike/a.co.uk/main.py',第22行,顺序为.sort(key=lambda x:int(x))TypeError:int()参数必须是字符串、类似字节的对象或数字,而不是'dict',不确定这个错误?可能我误解了数据结构…这在我对示例数据运行的测试用例中起作用。不管怎样,看起来你已经把它整理好了'File/home/mike/a.co.uk/main.py',第22行,按顺序排列。sort(key=lambda x:int(x))TypeError:int()参数必须是字符串、类似对象的字节或数字,而不是'dict',不确定这个错误吗?也许我误解了数据结构……这在我对示例数据运行的测试用例中起到了作用。不管怎样,看来你已经解决了