VSCode运行create_person.py遇401错误,求解决方案
在VSCode中运行人脸识别相关脚本,add_student.py可正常执行,但create_person.py调用Cognitive Face API时抛出401权限错误,错误栈如下:
Traceback (most recent call last): File "C:\xampp\htdocs\Face Recognition and RFID\create_person.py", line 13, in <module> res = CF.person.create(personGroupId, str(sys.argv[1])) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\vkurt\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\LocalCache\local-packages\Python311\site-packages\cognitive_face\person.py", line 71, in create return util.request('POST', url, json=json) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\vkurt\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\LocalCache\local-packages\Python311\site-packages\cognitive_face\util.py", line 103, in request raise CognitiveFaceException(response.status_code, cognitive_face.util.CognitiveFaceException: Error when calling Cognitive Face API: status_code: 401 code: 401 message: Access denied due to invalid subscription key or wrong API endpoint. Make sure to provide a valid key for an active subscription and use a correct regional API endpoint for your resource.
以下是create_person.py的代码:
import sys import cognitive_face as CF from global_variables import personGroupId, Key, endpoint import sqlite3 personGroupId = 'user' CF.BaseUrl.set(endpoint) CF.Key.set(Key) if len(sys.argv) != 1: res = CF.person.create(personGroupId, str(sys.argv[1])) print(res) extractId = str(sys.argv[1])[-2:] connect = sqlite3.connect("Face-DataBase") cmd = "SELECT * FROM Students WHERE ID = " + extractId cursor = connect.execute(cmd) isRecordExist = 0 for row in cursor: isRecordExist = 1 if isRecordExist == 1: connect.execute("UPDATE Students SET personID = ? WHERE ID = ?",(res['personId'], extractId)) connect.commit() connect.close() print("Person ID successfully added to the database")
针对401错误提示(无效订阅密钥或错误API端点),结合代码逐一排查:
验证订阅密钥有效性
确认global_variables.py中的Key是Azure Cognitive Face服务的有效密钥,且对应订阅处于活跃状态。可登录Azure门户,进入Face资源页面查看密钥和订阅状态。检查API端点正确性
确保endpoint是对应Face资源的区域端点,格式需严格匹配(例如中国区端点为https://chinaeast2.api.cognitive.azure.cn/face/v1.0/),注意不要遗漏末尾的斜杠,也不要混用不同区域的端点。确认配置未被错误覆盖
代码中导入personGroupId后又重新赋值为'user',如果实际使用的personGroupId是global_variables中定义的值,这会导致API调用时使用错误的分组ID,建议删除该行赋值,或确认'user'是正确的personGroupId。排查密钥与端点的设置逻辑
确保在调用CF.person.create前,已正确执行CF.BaseUrl.set(endpoint)和CF.Key.set(Key),代码当前顺序无误,但需确认global_variables中的变量确实被正确导入(可通过打印Key和endpoint的值验证)。修复SQL注入风险(额外优化)
代码中cmd = "SELECT * FROM Students WHERE ID = " + extractId存在SQL注入风险,建议替换为参数化查询:cursor = connect.execute("SELECT * FROM Students WHERE ID = ?", (extractId,))
内容的提问来源于stack exchange,提问作者Uni Versal

