あなたのDjangoアプリケーションのユーザーのための複数のセッションを防ぐ


私の最初のチュートリアルへようこそ.この1つでは、ユーザーアカウントを同時に複数のセッションを持つのを防ぐ方法を示します.
ユーザーがログインするたびに前のセッションが削除されます.
このアプローチは、購読ユーザーのための単一のアクセスを必要とするサブスクリプションベースのアプリケーションで有用です.

アプローチ
このチュートリアルでは、Django 2.0.4とそのミドルウェアフレームワークを使用します.
ミドルウェアは、単にジャンゴの要求/応答処理の間の中間のガイまたは女性です.Jangoはすでにデフォルトで我々のプロジェクトで使用するミドルウェアを持っています.
ミドルウェアフレームワークは、ユーザーが要求を行うたびに、ユーザーが既存のセッションを持っているかどうかを確認するために使用するものです.
セッションが存在する場合、それを削除し、リクエストから新しいセッションを現在のセッションとして割り当てます.
注意:「djangoloss session」テーブルのDjangoストアセッションデータは、データベースからユーザのセッションを削除することは、ユーザーをロギングするのと同じ効果を持ちます

コードタイム
あまりにも多くの話、右?OKはコードです.
エルム.もう一つ.以下のすべてのコードを1つのアプリケーションに格納する必要があります.私はあなたがこれを知っていると信じていますが、明らかに時々明らかにすることに危害がありません.
あなたのdjangoプロジェクトのアカウントを作成し、このチュートリアルに従ってください.

モデル.パイ
我々は我々のアプリに現在ログインしているユーザーのリストを格納するモデルを作成する必要があります
from django.conf import settings

User = settings.AUTH_USER_MODEL

# Model to store the list of logged in users
class LoggedInUser(models.Model):
    user = models.OneToOneField(User, related_name='logged_in_user')
    # Session keys are 32 characters long
    session_key = models.CharField(max_length=32, null=True, blank=True)

    def __str__(self):
        return self.user.username
私たちはuser AとフィールドOneToOneField それでuser テーブルのエントリを一つだけ持つことができます.簡単に言えば、これはテーブル内のユーザを一意に識別する.より単純な用語において、テーブルのユーザーのための複製エントリは、ない.最も簡単な語で[ここであなたを挿入してください].The related_name 属性は、User モデルです.
The session_keysession_key . あなたがより単純な説明を期待していたならば、残念に思います.あの時代は過ぎている.

シグナルパイ
新しいファイルを作成するsignals.py あなたのアプリケーションディレクトリで.シグナルは、アクションが我々のアプリで発生するたびにイベントを放送するために使用されます.
我々のアプリのために、私たちは、ユーザーがログインし、ログをいつでも知っておく必要があります.シグナルの助けを借りて、私たちはこれを知って、いくつかの行動を実行することができます(ここで、ユーザーをloggedinuser表に挿入してください).
# Signals that fires when a user logs in and logs out

from django.contrib.auth import user_logged_in, user_logged_out
from django.dispatch import receiver
from accounts.models import LoggedInUser

@receiver(user_logged_in)
def on_user_logged_in(sender, request, **kwargs):
    LoggedInUser.objects.get_or_create(user=kwargs.get('user')) 


@receiver(user_logged_out)
def on_user_logged_out(sender, **kwargs):
    LoggedInUser.objects.filter(user=kwargs.get('user')).delete()
私たちは作り付けのものを使っているuser_logged_in and user_logged_out ユーザが正常にログインしてログアウトするたびに発生するシグナル.
あなたがどのように我々がユーザーを得たかについて疑問に思っているならばkwargs , これ以上私の友人を驚かない.The user 上記の2つのシグナルで常に引数が送られます.

アプリ.パイ
次のコードを追加しますapps.py ファイルをインポートするファイルです.
from django.apps import AppConfig
class AccountsConfig(AppConfig):
    name = 'accounts'
    # This function is the only new thing in this file
    # it just imports the signal file when the app is ready
    def ready(self):
        import accounts.signals
あなたのsettings.py ファイルは、あなたのアプリケーションの名前を更新する正確なアプリを指すようにapps.py
INSTALLED_APPS = [
    .....

    'accounts.apps.AccountsConfig',
]

ミドルウェアパイ
ファイルを作成するmiddleware.py あなたのアプリケーションディレクトリで.
#Session model stores the session data
from django.contrib.sessions.models import Session

class OneSessionPerUserMiddleware:
    # Called only once when the web server starts
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        # Code to be executed for each request before
        # the view (and later middleware) are called.
        if request.user.is_authenticated:
            stored_session_key = request.user.logged_in_user.session_key

            # if there is a stored_session_key  in our database and it is
            # different from the current session, delete the stored_session_key
            # session_key with from the Session table
            if stored_session_key and stored_session_key != request.session.session_key:
                Session.objects.get(session_key=stored_session_key).delete()

            request.user.logged_in_user.session_key = request.session.session_key
            request.user.logged_in_user.save()

        response = self.get_response(request)

        # This is where you add any extra code to be executed for each request/response after
        # the view is called.
        # For this tutorial, we're not adding any code so we just return the response

        return response
注意request.user.logged_in_user.session_key 私たちはlogged_in_user ここで私たちはそれを関連する名前と定義しましたuser あなたのフィールドLoggedInUser モデル.これをdidntした場合、逆関係名はloggedinuser Pythonの命名規則に従っていません.
最後に、このミドルウェアをMIDDLEWARE あなたのリストsettings.py ファイル
MIDDLEWARE = [
    ....

    'accounts.middleware.OneSessionPerUserMiddleware'

]

結論
この1つで我々はどのようにあなたのアプリケーションで複数のセッションを持つことからユーザーを防ぐために学んだ.より多くの50のデバイス(50友人や家族のデバイスを正確に)にビデオをストリーミングから悪い人々を防ぐように1つのWebアプリ上のアカウントを購読.
このチュートリアルでは、あなたのdjangoアプリでカスタムミドルウェアを作成する方法を示すことでした.
確かに、これを達成するのにより良いかもしれない他の方法があります.これはあなたのニーズに最適な解決策ではないかもしれません.アイデアはどのようにミドルウェアの仕事をお見せしていた.
今行くと探検!
読書ありがとう.

ビデオバージョン
閉じるこの動画はお気に入りから削除されています.
を、ちょうど私はもう一度明らかに述べる.ボタンをクリックし、[ベル]アイコンをクリックします.もう一度読書をありがとう.