You need to enable JavaScript to run this app. 运行基于blacksheep的Python后端服务时出现语法错误,无可见语法问题求助
优惠活动
大模型
产品
解决方案
定价
更多

运行基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.18 10:18:16