В настоящее время я использую python для получения данных из Azure Active Directory через Microsoft Graph API:
Результат
Теперь мне нужно использовать эти данные, чтобы отобразить их лучше (более читабельно), например, аккуратно отобразить каждый атрибут каждого объекта активного каталога, примерно так:
В моем коде вы увидите, что функция, которая дает мне данные 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?
@CodeLikeBeaker хм да! Но дело в том, что я не знаю, как мне получить доступ к каждой части данных, например, для отображаемого имени столбца, мне нужно было бы видеть только сотрудников и стажеров. Как мне получить доступ к этой специальной части, чтобы отобразить ее для каждой строки в таблице html
Взгляните на jinja2: realpython.com/primer-on-jinja-templating
@CodeLikeBeaker, вот как я встраиваю Python в html?
Это в одну сторону. Их несколько, но я лично использую jinja2
@CodeLikeBreaker о, отлично, хм, но я все еще сомневаюсь, как мне получить доступ к каждому конкретному элементу, например, если я просто хочу получить отображаемое имя вместо всей этой кучи кода.






Чтобы ответить на ваш вопрос-комментарий «Как мне получить доступ к каждому конкретному элементу», вы можете сделать что-то вроде этого в качестве примера.
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 и то, как он работает.
Итак, вы хотите отформатировать его как второе изображение? Создайте свой html, и он сделает это за вас.