【问题标题】:QuerySelectField works on one server, breaks on another with same codeQuerySelectField 在一台服务器上工作,在另一台服务器上使用相同的代码中断
【发布时间】:2011-04-11 17:13:17
【问题描述】:

我正在设置我当前 Python/Django 项目的测试安装。在我的开发服务器上一切正常,但我们最近为项目的测试和最终生产副本设置了一个新 VM。我使用 Python、Django、SqlAlchemy(带有 MSSQL 后端)和 WTForms 作为我的主要包。

我的测试服务器运行不正常时遇到问题。我没有亲自在任一服务器上设置或安装这些软件包(这是由现在已经离开的人完成的),所以我并不真正了解这一切,但我知道在我的测试服务器上我一直有很多我在开发服务器上没有的问题。例如,当我在模板中使用方法时,Django 没有正确解析方法(它会返回'bound method UserForm.action of ... etc'而不是返回值),现在它似乎将许多东西类型转换为当它们从未被声明为整数时。 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(sqlalch 表定义):

#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 转换为整数。有没有我想念的地方?我能够解决方法问题,但这并不是我现在可以忽略和解决的问题。谢谢!可应要求提供任何其他代码/信息。此外,还有很多其他领域,但为了简洁起见,我将其省略了。

【问题讨论】:

  • Django 究竟在哪里发挥作用?
  • 如果您使用 SQLalchemy 和 WTForms,那么使用 Django 似乎不值得:)
  • 我认为如果你删除 django(因为像 @AndreBossard 我看不到它在哪里使用)并使用轻量级的东西——比如支持 WTForms 和 SQLAlchemy 的 Flask,你可以消除很多问题。
  • 您的问题中缺少的最重要的部分是回溯。它将回答谁试图将OrgID 转换为整数。此外,在开发和测试服务器上指定 WTForms 的版本会很有用(我看到您使用了已弃用的 pk_attr 参数,甚至可能在最新版本中不起作用)。

标签: python django sqlalchemy


【解决方案1】:

这似乎是一个部署问题。

部署django基本上有三种方式:

  1. 系统范围的安装
  2. 使用您的代码部署扩展的 django 目录,使用相对路径导入
  3. 使用 virtualenv

我的方法是选择这些选项之一(可能是 2 或 3,也取决于您如何安装其他依赖项,如 SqlAlchemy);然后检查是否与其他部署没有冲突。

【讨论】:

    猜你喜欢
    • 2015-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-24
    • 1970-01-01
    • 2016-10-09
    • 1970-01-01
    相关资源
    最近更新 更多