Как получить доступ к определенным элементам в JSON через Jinja2

В настоящее время я использую python для получения данных из Azure Active Directory через Microsoft Graph API:

Результат

Как получить доступ к определенным элементам в JSON через Jinja2

Теперь мне нужно использовать эти данные, чтобы отобразить их лучше (более читабельно), например, аккуратно отобразить каждый атрибут каждого объекта активного каталога, примерно так:

Как получить доступ к определенным элементам в JSON через Jinja2

В моем коде вы увидите, что функция, которая дает мне данные 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?

Итак, вы хотите отформатировать его как второе изображение? Создайте свой html, и он сделает это за вас.

CodeLikeBeaker 13.07.2018 23:24

@CodeLikeBeaker хм да! Но дело в том, что я не знаю, как мне получить доступ к каждой части данных, например, для отображаемого имени столбца, мне нужно было бы видеть только сотрудников и стажеров. Как мне получить доступ к этой специальной части, чтобы отобразить ее для каждой строки в таблице html

Jplaudir8 14.07.2018 12:58

Взгляните на jinja2: realpython.com/primer-on-jinja-templating

CodeLikeBeaker 16.07.2018 15:23

@CodeLikeBeaker, вот как я встраиваю Python в html?

Jplaudir8 16.07.2018 16:41

Это в одну сторону. Их несколько, но я лично использую jinja2

CodeLikeBeaker 16.07.2018 17:54

@CodeLikeBreaker о, отлично, хм, но я все еще сомневаюсь, как мне получить доступ к каждому конкретному элементу, например, если я просто хочу получить отображаемое имя вместо всей этой кучи кода.

Jplaudir8 16.07.2018 18:53
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
6
2 657
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Чтобы ответить на ваш вопрос-комментарий «Как мне получить доступ к каждому конкретному элементу», вы можете сделать что-то вроде этого в качестве примера.

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 и то, как он работает.

Другие вопросы по теме