詹戈。远程数据库上的身份验证模型出现Unicode错误

2024-04-25 16:34:23 发布

您现在位置:Python中文网/ 问答频道 /正文

首先,我不确定问题的题目应该是什么,我接受建议。你知道吗

当我在django admin上从一个模型中得到一个Unicode错误时,我注意到了这个错误。由于它是在生产环境(Heroku)中,我尝试在本地复制它,在本地输入相同的数据,我发现了问题:不知何故,我最终得到了一个用户名为José的用户。。。你知道吗

如果您尝试在admin中创建一个用户,并在用户名中写入José,它将给您一个错误,并且不允许您创建用户(至少在本地发生这种情况)。。。我怎么会在生产中遇到一个用户名为José的用户呢?你知道吗

Unicode错误来自另一个使用用户用户名作为表示的模型上的__unicode__方法。你知道吗

我使用的是Python社会认证,用户使用Facebook登录。你知道吗

编辑

def __unicode__(self):
    return "Notificacion: %s - %s - %s" % (self.perfil_actor, self.tipo, self.libro.titulo)

self.perfil_actor是我的“Perfil”模型的FK,它有一个unicode方法,如下所示:

def __unicode__(self):
    return "Perfil: %s" % (self.usuario.username)

当我说“我不能创建一个名为José的用户名”时,我指的是管理员,这是:

enter image description here


Tags: 方法用户模型selfreturnadmindef错误
1条回答
网友
1楼 · 发布于 2024-04-25 16:34:23

return "Notificacion: %s - %s - %s" % (self.perfil_actor, self.tipo, self.libro.titulo)

所以我尽我所能不留痕迹,但是:

字节格式字符串上的%运算符尝试使用__str__将其非基字符串参数转换为字节字符串。你知道吗

Django的base Model提供了一个__str__实现,它调用__unicode__,并将结果编码到UTF-8。因此%运算符使用的self.perfil_actor值最终是字节字符串'Jos\xc3\xa9'。(Django的设计有点可疑。)

self.tipoself.libro.titulo中至少有一个可能是Unicode字符串。%对于unicode有一个特殊情况,即如果任何参数是unicode字符串,它将整个字符串升级为Unicode。你知道吗

但是!当这种情况发生时,它不会切换到对其非basestring参数调用__unicode__,因为如果您首先使用Unicode格式的字符串,它会这样做。(对于Python来说,这是一个值得怀疑的设计。)

所以现在有一个字节字符串'Jos\xc3\xa9'被连接成一个Unicode字符串。为此,必须将字节再次解码回Unicode。这不起作用,因为Python使用的隐式“默认编码”是ASCII,而0xC3和0xA9是ASCII中的无效字节。Boom Unicode错误!你知道吗

总之,在python2中自动进行字节字符串/unicode字符串转换是一件非常痛苦的事情。(Python3帮助您摆脱它们,以便更快地失败。)

通过将字符串保留为所有字节或所有Unicode来避免自动转换。由于self.tipoself.libro.titulo似乎是Unicode,并且您希望__unicode__呈现self.perfil_actor,因此用于将它们放在一起的格式字符串也应该是Unicode:

return u"Notificacion: %s - %s - %s" % (self.perfil_actor, self.tipo, self.libro.titulo)

how could I have ended up with a user with a username José on production?

默认的Django用户模型有一个带有RegexValidator的username字段,该字段不允许使用非ASCII字符。这是一个值得怀疑的设计决策。你知道吗

这就是为什么管理接口阻止进入José。但是,这只是表单级别的限制,而不是数据库限制。用户名可以通过其他方式进入数据库。。。特别是,如果您有一个修改UserCreationForm(或者根本不使用它)的自定义注册表单,那么它可能会绕过默认验证而忽略RegexValidator。你知道吗

如果您也需要允许在admin中输入非ASCII用户名,您可以使用更宽容的验证器use a custom user model,或者use a custom admin form。你知道吗

相关问题 更多 >