如何通过Jinja2访问JSON中的特定元素

时间:2018-07-13 21:10:19

标签: python json flask jinja2

我目前正在使用python通过Microsoft Graph API从Azure Active Directory检索数据:

结果

enter image description here

现在我需要做的是,使用此数据以更好的方式(更易读)显示它,例如以一种简洁的方式显示每个活动目录对象的每个属性,就像这样:

enter image description here

您将在我的代码中看到为我提供json数据的函数是:

graph_data = requests.get(endpoint, headers=http_headers, stream=False).json()

代码

config.py

RESOURCE = "https://graph.microsoft.com"  # Add the resource you want the access token for
TENANT = "joanperez5hotmail.onmicrosoft.com";
AUTHORITY_HOST_URL = "https://login.microsoftonline.com"
CLIENT_ID = "HERE I WROTE MY CLIENT ID";
CLIENT_SECRET = "HERE I WROTE MY CLIENT SECRET";

# These settings are for the Microsoft Graph API Call
API_VERSION = 'v1.0'

app.py

import adal
import flask #web framework
import uuid
import requests

import config

app = flask.Flask(__name__)
app.debug = True
app.secret_key = 'development'

PORT = 5000  # A flask app by default runs on PORT 5000
AUTHORITY_URL = config.AUTHORITY_HOST_URL + '/' + config.TENANT
REDIRECT_URI = 'http://localhost:{}/getAToken'.format(PORT)
TEMPLATE_AUTHZ_URL = ('https://login.microsoftonline.com/{}/oauth2/authorize?' +
                      'response_type=code&client_id={}&redirect_uri={}&' +
                      'state={}&resource={}')


@app.route("/")
def main():
    login_url = 'http://localhost:{}/login'.format(PORT)
    resp = flask.Response(status=307)
    resp.headers['location'] = login_url
    return resp


@app.route("/login")
def login():
    auth_state = str(uuid.uuid4())
    flask.session['state'] = auth_state
    authorization_url = TEMPLATE_AUTHZ_URL.format(
        config.TENANT,
        config.CLIENT_ID,
        REDIRECT_URI,
        auth_state,
        config.RESOURCE)
    resp = flask.Response(status=307)
    resp.headers['location'] = authorization_url
    return resp


@app.route("/getAToken")
def main_logic():
    code = flask.request.args['code']
    state = flask.request.args['state']
    if state != flask.session['state']:
        raise ValueError("State does not match")
    auth_context = adal.AuthenticationContext(AUTHORITY_URL)
    token_response = auth_context.acquire_token_with_authorization_code(code, REDIRECT_URI, config.RESOURCE,
                                                                        config.CLIENT_ID, config.CLIENT_SECRET)
    # It is recommended to save this to a database when using a production app.
    flask.session['access_token'] = token_response['accessToken']

    return flask.redirect('/graphcall')


@app.route('/graphcall')
def graphcall():
    if 'access_token' not in flask.session:
        return flask.redirect(flask.url_for('login'))
    endpoint = config.RESOURCE + '/' + config.API_VERSION + '/groups/' #https://graph.microsoft.com/v1.0/groups/
    http_headers = {'Authorization': flask.session.get('access_token'),
                    'User-Agent': 'adal-python-sample',
                    'Accept': 'application/json',
                    'Content-Type': 'application/json',
                    'client-request-id': str(uuid.uuid4())}
    graph_data = requests.get(endpoint, headers=http_headers, stream=False).json()
    return flask.render_template('homePage.html', graph_data=graph_data)


if __name__ == "__main__":
    app.run()

编辑

在评论中添加问题:如何访问Jinja中的每个特定元素?

1 个答案:

答案 0 :(得分:0)

要回答您的评论问题“我将如何访问每个特定元素”,您可以执行以下操作作为示例。

my_data = [{'id': 1, 'name': 'Frank'}, {'id': 2, 'name': 'Rakesh'}]

然后将其返回到烧瓶中的render_template中(通过您的代码可以看到,您已经在这样做了)

在Jinja模板中,您将执行以下操作:

<table>
    {% for md in my_data %}
        <tr>
            <td>{{ md.id }}</td><td>{{ md.name }}</td>
        </tr>
    {% endfor %}
</table>

这应该使您朝正确的方向前进。除此之外,您将需要对Jinja2及其工作方式进行一些研究。