DjangoRestフレームワークでカスタムトークンモデルを使用する方法

Source python django rest django-rest-framework

Django Rest Framework authを使用したいのですが、1人のユーザーに複数のトークンが必要です。これを行うには、独自のトークンモデルを実装する必要があります。これは、トークン認証クラスで見つかりました。
class TokenAuthentication(BaseAuthentication):
    """
    Simple token based authentication.
    ...
    """

    model = Token
    """
    A custom token model may be used, but must have the following properties.

    * key -- The string identifying the token
    * user -- The user to which the token belongs
    """

しかし、このモデルをどのように指定できるかわかりません。 TokenAuthenticationをサブクラス化する必要がありますか?
推奨答え
そのメッセージが言っているのは、モデルTokenは、プロパティkeyuserを持っている限り、他のモデルと交換できるということです。そうすれば、たとえば、トークンキーを生成するためのより複雑な方法が必要な場合は、独自のモデルを定義できます。

したがって、カスタムトークンモデルが必要な場合は、次のようにする必要があります。
  • rest_framework.authtoken.modelsからトークンモデルをサブクラス化します。ここに必要なカスタム動作を追加しますが、keyプロパティとuserプロパティがあることを確認してください。
  • rest_framework.authenticationからTokenAuthenticationクラスをサブクラス化します。そのmodelプロパティを新しいトークンモデルに設定します。
  • 必要なビューで、必ず新しい認証クラスを参照してください。
  • その他答え #1
    settings.pyで独自の認証方法を定義します。
    REST_FRAMEWORK = {
        'DEFAULT_AUTHENTICATION_CLASSES': (
            'my_project.my_app.authentication.MyOwnTokenAuthentication',
         ),
    }
    
    authentication.pyで:
    from rest_framework.authentication import TokenAuthentication
    from my_project.my_app.models.token import MyOwnToken
    
    class MyOwnTokenAuthentication(TokenAuthentication):
        model = MyOwnToken
    
    models.pyで:
    import binascii
    import os
    
    from django.db import models
    from django.utils.translation import ugettext_lazy as _
    from my_project.companies.models import Company
    
    
    class MyOwnToken(models.Model):
        """
        The default authorization token model.
        """
        key = models.CharField(_("Key"), max_length=40, primary_key=True)
    
        company = models.OneToOneField(
            Company, related_name='auth_token',
            on_delete=models.CASCADE, verbose_name="Company"
        )
        created = models.DateTimeField(_("Created"), auto_now_add=True)
    
        class Meta:
            verbose_name = _("Token")
            verbose_name_plural = _("Tokens")
    
        def save(self, *args, **kwargs):
            if not self.key:
                self.key = self.generate_key()
            return super(MyOwnToken, self).save(*args, **kwargs)
    
        def generate_key(self):
            return binascii.hexlify(os.urandom(20)).decode()
    
        def __str__(self):
            return self.key
    

    関連記事

    Linux OS(Ubuntu)でリリースキーhashを生成する:Android Facebook SDK
    IComparableでSortingを逆にします
    numpyの2つの1Dベクトルの内積
    Telegramボット “chat not found”
    pythonに複数の空白行を印刷する