使用Python Requests库访问Canvas LMS遇权限验证问题求助
问题描述
使用Python的canvasapi库可正常与Canvas LMS进行程序化交互,但直接用requests库调用时,请求返回状态码200却得到Canvas登录页面内容。已尝试将API密钥直接写入代码、更换Canvas URL等操作,均无效;同校Windows环境下Python3.10/3.11的同事也存在相同问题,仅Ubuntu环境Python3.8可正常运行。API密钥在canvasapi中可正常使用,IT部门无法解释差异,建议改写canvasapi端点但该方案不合理。目前临时用selenium库通过浏览器操作,需手动二次验证,需明确批量处理数百课程时requests的效率优势及可行解决方案。
参考测试代码:
import config #-- my api key is in this file. import requests url = config.API_URL headers = {'Authorization' : 'Bearer ' + config.API_KEY} r = requests.get(url, headers = headers) print(r.status_code) print(r.text)
可行解决方案
确认API端点URL正确性
确保config.API_URL指向Canvas的API根路径(如https://your-institution.instructure.com/api/v1/),而非Canvas主站点首页。canvasapi内部会自动拼接正确的API路径,因此不会出现此类问题,而直接用requests时若误用首页URL,会被导向登录页面。添加浏览器User-Agent请求头
部分Canvas实例会拦截无标识的请求,模拟浏览器的User-Agent可绕过该限制。修改请求头如下:headers = { 'Authorization': 'Bearer ' + config.API_KEY, 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36' }排查隐式重定向问题
部分环境下请求会被隐式重定向到登录页(状态码仍返回200),可禁用重定向检查跳转目标:r = requests.get(url, headers=headers, allow_redirects=False) print(r.status_code, r.headers.get('Location'))若发现重定向,需确保请求直接命中正确的API端点,或手动跟进重定向路径并验证权限。
对齐requests库版本
Ubuntu环境Python3.8搭配的requests版本可能与Windows环境存在差异,导致请求行为不同。先检查两边的版本:pip show requests在Windows环境安装与Ubuntu一致的
requests版本测试,例如:pip install requests==2.25.1
效率对比
批量处理数百课程时,requests库的效率远高于selenium:
requests直接发送HTTP请求,无需页面渲染与浏览器启动,单请求响应时间通常仅为selenium的1/10甚至更短;- 解决
requests的权限问题后,无需手动二次验证,可完全自动化执行批量操作,避免selenium的交互等待与人工干预成本。
内容的提问来源于stack exchange,提问作者Brian at Work

