Django: coincidencia de mayúsculas y minúsculas de un nombre de usuario de usuario de autenticación?

Django por defecto implementa el nombre de usuario como sensible a las mayúsculas y minúsculas, ahora para la autenticación, he escrito el míoAuthentication Backend para manejar nombres de usuario que no distinguen entre mayúsculas y minúsculas durante la autenticación.

Como se muestra en :http://blog.shopfiber.com/?p=220

Ahora, el problema es:

Tengo varios puntos de vista y métodos útiles que comparausername a algunas picaduras.

es decir

request.user.username == username_from_some_other_system_as_str

Ahora, si el nombre de usuario esyugal entonces:

request.user.username == 'Yugal' # Returns False

Ahora, debería volverTrue [Lo que quería lograr]

Para eso me acuerdo deC++ dias,Operator Overloading. Pero no creo que simplemente hacer eso para Djangoauth user Sería una buena idea, ya queauth user está estrechamente vinculado condjango. Además, la sobrecarga== hará que sea insensible a mayúsculas y minúsculas para toda la clase, no solo para elusername campo.

Entonces, ¿cómo debo hacer estousername Insensibilidad a los casos incluso cuando se compara en todo.

Nota:

Creando unget_username El método que devuelve un nombre de usuario en minúsculas no siempre es posible, ya que requeriría que todo el código se vuelva a factorizar para usarlo. Puede hacerlo para su código por una vez, pero no es posible si está utilizando aplicaciones de terceros de Django.

Lo séuser.username.lower() = something.lower() es posible, pero es propenso a errores y no es la solución de escritura para algo que se usa tan a menudo en una configuración de múltiples desarrolladores.

he utilizadoSomeModel.objects.filter(username__iexact=username), donde sea posible. Pero eso aún deja al sistema vulnerable a un error por parte de cualquiera de los desarrolladores desconocidos.

======================================

Descubrió la solución conceptualmente, pero no pudo hacerla funcionar (Ayuda):

####### 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
################################################################

Asumoto_python se utiliza para convertir el valor recibido de la base de datos aunicode en pitón. Pero, supongo que mito_python no está siendo llamado.

Esto también asegurará la insensibilidad a las mayúsculas y minúsculas en aplicaciones de terceros y no requerirá ninguna re-factorización. Parcheará elUser en su centro. Voy a agregar esto a__init__.py de mi primeraINSTALLED_APP

Qué estoy haciendo mal ?

Respuestas a la pregunta(6)

Su respuesta a la pregunta