运行基于blacksheep的Python后端服务时出现语法错误,无可见语法问题求助
问题排查与修复方案
以下是代码中存在的问题及修复方案:
存在的问题
- 代码残留HTML转义字符:所有
"是HTML编码后的双引号,Python语法不识别该符号,需替换为普通双引号" - 命名冲突:定义的控制器类名为
Patients,方法中patients = Patients.select()会优先将Patients识别为当前控制器类,而非ORM模型,导致调用不存在的select方法报错 - Pony ORM 缺失必要上下文:所有数据库操作必须在
db_session装饰器/上下文管理器中执行,否则运行时会抛出无数据库会话的错误 - 数据库查询语法错误:
Doctors.exists(login)写法不符合Pony ORM规范,需要明确指定筛选字段为Doctors.exists(login=login) - Cookie值类型错误:Cookie值要求为字符串类型,传入布尔值
True会触发类型错误,需要改为字符串格式的"True" - 返回值格式不规范:返回的单引号包裹类JSON字符串不符合JSON规范,建议直接返回字典由框架自动序列化
- 方法名冲突风险:控制器下的接口方法命名为
patients,和类名、查询结果变量名过于接近,易引发后续逻辑错误
修复后代码
from blacksheep.server.application import Application from blacksheep.server.controllers import Controller, get, post from blacksheep.cookies import Cookie from blacksheep.messages import Response from easy_cryptography.hash.hash_funct import compare_hash from app.configuration import AUTHORIZED from models import Doctors, Patients as PatientsModel # 别名解决命名冲突 from pony.orm import db_session, select # 避免通配符导入引发的命名冲突 class Home(Controller): @get("/") def index(self): return self.view() class PatientsController(Controller): # 修改控制器类名避免冲突 @post("/patients") @db_session # 加数据库会话装饰器 def get_patients(self, login: str, password: str): if Doctors.exists(login=login) and compare_hash(password, Doctors.get_for_update(login=login).password): patients = PatientsModel.select() # 使用别名调用ORM模型 response = self.view(patients=patients) response.set_cookie(Cookie(AUTHORIZED, "True")) # Cookie值改为字符串 return response else: # 直接返回字典,框架会自动序列化为标准JSON return {"message": "Неверный логин или пароль"}
内容的提问来源于stack exchange,提问作者NewDay13
相关产品推荐
相关产品推荐

