Authentication Backend
Django はデフォルトでユーザー名を大文字と小文字を区別するように実装していますが、認証のために、認証中に大文字と小文字を区別しないユーザー名を処理するために独自に作成しました。
に示すように: http://blog.shopfiber.com/?p=220
さて、問題は次のとおりです。
いくつかのスティングと比較して、さまざまなビューとユーティリティメソッドがありますusername
。
すなわち
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
ことはできません。これを使用するには、すべてのコードをリファクタリングする必要があるためです。コードに対して一度だけ実行できますが、サードパーティの 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
は呼ばれていないと思います。
これにより、サードパーティのアプリで大文字と小文字が区別されなくなり、リファクタリングが不要になります。
User
コアにパッチを適用します。__init__.py
これを最初のに追加しますINSTALLED_APP
私は何を間違っていますか?