Microsoft Graph API,无法使用django检索个人资料图片

kq0g1dla  于 2023-08-08  发布在  Go
关注(0)|答案(2)|浏览(135)

我有一个问题,从Microsoft Graph API请求照片不会检索照片,实际上会返回404错误。
第一个月
我知道这是base64解码的jpeg,但我不能弄清楚如何使用它来实际显示一个图像在html页面。
下面是我的视图中创建请求的代码,它在我的initialize上下文视图中:

def initialize_context(request):
## non relevant code ##

        graph_photo_endpoint = 'https://graph.microsoft.com/beta/me/photo/$value'
        headers = {'Authorization': 'Bearer ' + token}
        photo_response = requests.get(graph_photo_endpoint, headers=headers)
        if photo_response.status_code == 200:
            context['photo_data'] = photo_response.content
            photo_response.headers['Content-Type'] = 'image/jpeg'

## non relevant code ##
    return context

字符串
它由需要加载照片的视图检索,用户需要登录才能访问照片:

@azure_ad_login_required
def profile(request):
    context = initialize_context(request)
    return render(request, 'profile.html', context)


下面是定义照片的html代码:

<img class="profile_pic" src="{{ photo_data }}" alt="Profile Picture" style="width:100%">


这就是我的graph_helper的样子:

import requests
import base64
from requests_oauthlib import OAuth2Session

graph_url = 'https://graph.microsoft.com/v1.0'

def get_user(token):
    # Send GET request to retrieve user information from Microsoft Graph API
    user = requests.get('{0}/me'.format(graph_url),
                        headers={'Authorization': 'Bearer {0}'.format(token)},
                        params={'$select': 'displayName,mail,mailboxSettings,userPrincipalName,givenName,companyName,surName,jobTitle'})
    user.headers['Content-Type'] = 'image/jpeg'
    return user.json()


我不知道我做错了什么,有人能帮我吗?

tez616oj

tez616oj1#

定位线路

context['photo_data'] = photo_response.content

字符串
initialize_context中,并尝试修改该行为:

context['photo_data'] = io.BytesIO(photo_response.content)


您需要在该文件的顶部导入IO:

import io


我通常创建一个抽象用户类,然后创建一个一对一的UserProfile类来保存/缓存图像。使用Django的ImageFile的方式类似:

from django.core.files.images import ImageFile
...    

profile_photo = io.BytesIO(photo_response.content)
# userprofile being the instance of userprofile previously set
userprofile.avatar = ImageFile(profile_photo, name='foo.jpg')


然后在一个模板文件中,我可以用途:

<img class="h-8 w-8 rounded-full" src="{{ request.user.userprofile.avatar.url }}" alt="Image of {{ request.user.displayname }}">


如果你没有存储图像,你可能需要在src中嵌入base64编码,但是,我不喜欢这样做,因为对于每个请求,你需要去查找图像(我认为这是不必要的)。
你可能会得到类似于here的描述:

<img src="data:image/jpeg;base64,{{ photo_data }}" />


但我不确定你是否有photo_data上下文中的b64数据。你可能需要测试一下。
不能保证任何这将工作-我有一个非常不同的设置比你在我如何检索这些图像,但也许这里有一些东西,将帮助你。

col17t5w

col17t5w2#

谢谢你的投入,这让我思考为什么我会这样做。这让我想到了这个解决方案:

token = get_token(request)
context = initialize_context(request)
graph_url = 'https://graph.microsoft.com/v1.0'
photo_endpoint = f"{graph_url}/me/photo/$value"
access_token = token

response = requests.get(photo_endpoint, headers={'Authorization': f'Bearer {access_token}'}, stream=True)

if response.ok:
    # Save the photo locally or process it as needed
    with open('static/assets/main/images/profile_photo.jpg', 'wb') as f:
        for chunk in response.iter_content(1024):
            f.write(chunk)
else:
    # Handle error if photo retrieval fails
    print(f"Failed to retrieve profile photo: {response.status_code} - {response.text}")

字符串
对于HTML端:

<img src="{{ STATIC_URL }}assets/main/images/profile_photo.jpg" alt="Profile Picture" style="width:100%">

相关问题