使用Django调用Microsoft Graph API无法获取并显示头像求助
问题分析与解决方案
一、API返回404的原因及修复
端点版本问题:你当前使用beta版本端点
https://graph.microsoft.com/beta/me/photo/$value,beta版本存在不稳定或权限差异风险,建议切换到稳定的v1.0端点:https://graph.microsoft.com/v1.0/me/photo/$value用户无头像:若用户未在Microsoft 365中设置头像,调用
$value端点会直接返回404。可先调用https://graph.microsoft.com/v1.0/me/photo(不带$value)查看元数据,若返回404则确认是无头像场景,需添加默认头像兜底逻辑。权限不足:确保Azure AD应用已配置Delegated权限中的
User.Read(或User.ReadBasic.All),且用户已同意该权限。
二、图片无法显示的修复
当前代码直接将二进制图片数据传给HTML模板,img标签的src无法识别原始二进制,需转换为Data URI格式:
修改initialize_context函数:
def initialize_context(request): ## 无关代码 ## graph_photo_endpoint = 'https://graph.microsoft.com/v1.0/me/photo/$value' headers = {'Authorization': 'Bearer ' + token} photo_response = requests.get(graph_photo_endpoint, headers=headers) if photo_response.status_code == 200: # 二进制数据转base64编码,拼接Data URI前缀 import base64 photo_base64 = base64.b64encode(photo_response.content).decode('utf-8') context['photo_data'] = f'data:image/jpeg;base64,{photo_base64}' else: # 404时设置默认头像(替换为你的默认图片路径) context['photo_data'] = '/static/images/default-avatar.jpg' ## 无关代码 ## return context
HTML部分无需修改:
<img class="profile_pic" src="{{ photo_data }}" alt="Profile Picture" style="width:100%">
三、冗余代码清理
graph_helper.py中get_user函数里的user.headers['Content-Type'] = 'image/jpeg'完全无用(该接口返回JSON格式的用户信息,并非图片),直接删除即可:
def get_user(token): 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()
内容的提问来源于stack exchange,提问作者MV-PDM
相关产品推荐
相关产品推荐

