あなたのDjangoアプリケーションのユーザーのための複数のセッションを防ぐ
私の最初のチュートリアルへようこそ.この1つでは、ユーザーアカウントを同時に複数のセッションを持つのを防ぐ方法を示します.
ユーザーがログインするたびに前のセッションが削除されます.
このアプローチは、購読ユーザーのための単一のアクセスを必要とするサブスクリプションベースのアプリケーションで有用です.
アプローチ
このチュートリアルでは、Django 2.0.4とそのミドルウェアフレームワークを使用します.
ミドルウェアは、単にジャンゴの要求/応答処理の間の中間のガイまたは女性です.Jangoはすでにデフォルトで我々のプロジェクトで使用するミドルウェアを持っています.
ミドルウェアフレームワークは、ユーザーが要求を行うたびに、ユーザーが既存のセッションを持っているかどうかを確認するために使用するものです.
セッションが存在する場合、それを削除し、リクエストから新しいセッションを現在のセッションとして割り当てます.
注意:「djangoloss session」テーブルのDjangoストアセッションデータは、データベースからユーザのセッションを削除することは、ユーザーをロギングするのと同じ効果を持ちます
コードタイム
あまりにも多くの話、右?OKはコードです.
エルム.もう一つ.以下のすべてのコードを1つのアプリケーションに格納する必要があります.私はあなたがこれを知っていると信じていますが、明らかに時々明らかにすることに危害がありません.
あなたのdjangoプロジェクトのアカウントを作成し、このチュートリアルに従ってください.
モデル.パイ
我々は我々のアプリに現在ログインしているユーザーのリストを格納するモデルを作成する必要があります
The
シグナルパイ
新しいファイルを作成する
我々のアプリのために、私たちは、ユーザーがログインし、ログをいつでも知っておく必要があります.シグナルの助けを借りて、私たちはこれを知って、いくつかの行動を実行することができます(ここで、ユーザーをloggedinuser表に挿入してください).
あなたがどのように我々がユーザーを得たかについて疑問に思っているならば
アプリ.パイ
次のコードを追加します
ミドルウェアパイ
ファイルを作成する
最後に、このミドルウェアを
結論
この1つで我々はどのようにあなたのアプリケーションで複数のセッションを持つことからユーザーを防ぐために学んだ.より多くの50のデバイス(50友人や家族のデバイスを正確に)にビデオをストリーミングから悪い人々を防ぐように1つのWebアプリ上のアカウントを購読.
このチュートリアルでは、あなたのdjangoアプリでカスタムミドルウェアを作成する方法を示すことでした.
確かに、これを達成するのにより良いかもしれない他の方法があります.これはあなたのニーズに最適な解決策ではないかもしれません.アイデアはどのようにミドルウェアの仕事をお見せしていた.
今行くと探検!
読書ありがとう.
ビデオバージョン
閉じるこの動画はお気に入りから削除されています.
を、ちょうど私はもう一度明らかに述べる.ボタンをクリックし、[ベル]アイコンをクリックします.もう一度読書をありがとう.
ユーザーがログインするたびに前のセッションが削除されます.
このアプローチは、購読ユーザーのための単一のアクセスを必要とするサブスクリプションベースのアプリケーションで有用です.
アプローチ
このチュートリアルでは、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_key
はsession_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アプリでカスタムミドルウェアを作成する方法を示すことでした.
確かに、これを達成するのにより良いかもしれない他の方法があります.これはあなたのニーズに最適な解決策ではないかもしれません.アイデアはどのようにミドルウェアの仕事をお見せしていた.
今行くと探検!
読書ありがとう.
ビデオバージョン
閉じるこの動画はお気に入りから削除されています.
を、ちょうど私はもう一度明らかに述べる.ボタンをクリックし、[ベル]アイコンをクリックします.もう一度読書をありがとう.
Reference
この問題について(あなたのDjangoアプリケーションのユーザーのための複数のセッションを防ぐ), 我々は、より多くの情報をここで見つけました https://dev.to/fleepgeek/prevent-multiple-sessions-for-a-user-in-your-django-application-13ooテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol