Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从Flask模板中访问特定字典密钥_Python_Json_Flask - Fatal编程技术网

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

我正在使用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_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',不确定这个错误吗?也许我误解了数据结构……这在我对示例数据运行的测试用例中起到了作用。不管怎样,看来你已经解决了