QuerySelectField在一台服务器上正常,但在另一台服务器上出错,代码相同

10 投票
1 回答
582 浏览
提问于 2025-04-16 04:05

我正在为我当前的Python/Django项目设置一个测试环境。我的开发服务器上运行得很好,但我们最近为测试和将来的生产版本设置了一个新的虚拟机。我主要使用的包有Python、Django、SqlAlchemy(配合MSSQL数据库)和WTForms。

我在测试服务器上遇到了一些问题,表现得不太正常。我并不是亲自设置或安装这些包的(那是之前一个已经离开的人做的),所以我对这些东西并不是特别了解,但我知道在我的测试服务器上遇到了很多在开发服务器上没有的问题。例如,当我在模板中使用Django的方法时,它没有正确解析这些方法(返回的是'bound method UserForm.action of...等',而不是返回值),现在似乎还把一些东西强制转换成整数,尽管它们从来没有被声明为整数。所有服务器上的Python、Django、WTForms和SqlAlchemy的版本都是一样的。以下是开发服务器上运行良好的示例代码,但在测试服务器上出错了(还有错误信息):

forms.py:

class NewPracticeForm(wtforms.Form):
    Name = wtforms.TextField("Practice Name", [wtforms.validators.Required()])
    OrgID = safields.QuerySelectField("Organization", pk_attr='OrgID')
    action = '/Admin/H/newpractice/'

pulsedb.py(sqlalchemy表定义):

#engine created here, can include that if necessary but its just a standard engine=create_engine() using pymssql
Base = declarative_base()
metadata = Base.metadata

class Practice(Base):
    __tablename__ = 'Practice'
    Name        = Column(String(256) , nullable=False)
    OrgID       = Column(String(30) , ForeignKey('dbo.Orglist.OrgID') , nullable=False)

views.py:

def partNewPractice(request):
    context = Context()
    frm = forms.NewPracticeForm()
    frm.OrgID.query = pwdb.session.query(pwdb.OrglistMap)
    context['form'] = frm
    #Return the response here using a method which just tacks a couple things on before returning a normal response

所以,我从选择框中选择一个组织,这时会发送'OrgID=Z55'(因为OrgID表使用3个字符的字符串作为ID列),但在某个环节,这就出现了问题。表单指向一个处理程序,它执行:

services.py

def HandlerAddPractice(request):
    prac = pdb.Practice()
    frm = forms.NewPracticeForm(request.POST, obj=prac)
    frm.OrgID.query = pwdb.session.query(pwdb.OrglistMap)

但程序到这里就出错了:

invalid literal for int() with base 10: 'Z55'

我发现类似的字段在使用QuerySelectField时也会出现这种情况,它试图把UUID转换成整数,不知道为什么。难道我遗漏了什么设置吗?我已经找到了解决方法来处理方法的问题,但现在这个问题我真的不能忽视,也无法绕过。谢谢!如果需要其他代码或信息,请告诉我。此外,还有很多其他字段,但为了简洁起见,我没有列出。

1 个回答

1

这看起来像是一个部署的问题。

基本上,有三种方式可以部署Django:

  1. 全系统安装
  2. 把扩展的Django目录和你的代码一起部署,使用相对路径导入
  3. 使用虚拟环境

我的建议是选择其中一个选项(可能是第二或第三种,具体还要看你是怎么安装其他依赖的,比如SqlAlchemy);然后检查一下是否和其他部署没有冲突。

撰写回答