默认情况下,Django 将用户名实现为区分大小写,现在为了进行身份验证,我编写了自己的Authentication Backend
来处理身份验证时不区分大小写的用户名。
如图: http: //blog.shopfiber.com/ ?p=220
现在,问题是:
我有各种观点和实用方法,与username
一些刺痛相比。
IE
request.user.username == username_from_some_other_system_as_str
现在,如果用户名是yugal
那么:
request.user.username == 'Yugal' # Returns False
现在,它应该返回True
[我想要实现的目标]
为此,我记得从C++
几天开始,Operator Overloading
。但我认为简单地为 django 这样做并不是auth user
一个好主意,因为auth user
它与django
. 此外,重载==
将使整个类不区分大小写,而不仅仅是username
字段。
所以,即使在整个比较时,我应该如何处理这种username
不区分大小写的问题。
笔记:
创建一个
get_username
总是返回小写用户名的方法是不可能的,因为它需要重构所有代码才能使用它。您可以一次性为您的代码执行此操作,但如果您使用的是 3rd 方 django 应用程序,则不可能。我知道这
user.username.lower() = something.lower()
是可能的,但容易出错,而不是多开发人员设置中经常使用的东西的编写解决方案。我用过
SomeModel.objects.filter(username__iexact=username)
,只要有可能。但这仍然使系统容易受到任何不知情的开发人员的错误影响。
=======================================
从概念上想出解决方案,但无法使其工作(帮助):
####### Custom CharField for username case-insensitivity #######
from django.db.models.fields import CharField
class iUnicode:
def __init__(self, value):
self.value = value
def __eq__(self, other):
if isinstance(other, str) or isinstance(other, unicode):
return self.value.lower() == other.lower()
if isinstance(other, self.__class__):
return other == self.value
def __unicode__(self):
return unicode(self.value)
def __str__(self):
return self.__unicode__()
class UsernameCharField(CharField):
def to_python(self, value): # Its not getting called
unicode_val = super(CharField, self).to_python(value)
return iUnicode(unicode_val)
if User._meta.local_fields[1].name == 'username':
User._meta.local_fields[1] = UsernameCharField(max_length=30)
User._meta.local_fields[1].model = User
################################################################
我假设to_python
用于将从数据库接收到的值转换为unicode
python 中的值。但是,我想我to_python
的没有被调用。
这也将确保第 3 方应用程序不区分大小写,并且不需要任何重构。它将修补
User
其核心。我将把这个添加到__init__.py
我的第一个INSTALLED_APP
我究竟做错了什么 ?