サイトを識別するために
2020年2月17日7:00 公開
初めてのPythonおよびDjango記事。どきどきします。(嘘)
Django、便利ですよね。
特にDjango管理サイト、テーブルのmigration、ちまちまとphp(CodeIgniter3)で作っていた私にしてみれば、あっという間に出来てしまうのがすごいわ~と未だに感動中。
ただまぁ、私的にサイト作成に使用する場合、絶対的に実現させたいことが幾つかある訳ですが。
端的に上げてしまえば
1.クッキー(Session)による認証機能(隠しページ表示可否チェックの為)
2.複数サイト(サブドメイン)に渡って使用する機能、あるいはサイト識別方法
かな。今思いつくことは。
(他はまぁ、ごく普通に出来ることだよねー)
Djangoでも当然、CookieやSessionは使用しているし、またDjangoライブラリ(django.contrib.sites)で、複数サイト管理が可能なことは分かっている。
問題は、それをどのように自分好みにやり遂げるかというその一点であります。
で、今回は、サイト識別方法なりますね。
基本的には、サイト情報(サーバー名)をチェックして、Djangoでの登録情報と比較、適切な表示をする、という流れですが。
Django登録情報をチェックして、サイトのIDを取得するという処理を、Djangoのmiddlewareで実現させます。
ソース内の「プロジェクト名」は実際のプロジェクト名で置き換える感じです。
今回ファイルは3つ。
元々のファイル名は、settings.py、middleware.py、site_id_hook.py
で使用しています。
Django設定ファイル settings.py
# encoding: utf-8
--- 省略 ---
MIDDLEWARE = [
'プロジェクト名.middleware.SiteInfoSetSessionMiddleware',
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
--- 省略 ---
# SITE_ID を django.contrib.sites から取得
from プロジェクト名.site_id_hook import SiteIDHook, SITE_THREAD_INFO
SITE_ID = SiteIDHook()
ROOT_URLCONF = 'プロジェクト名.urls'
settings.py でmiddleware に設定する middleware.py
#encoding : utf-8
from django.conf import settings
from django.contrib.sites.models import Site
from django.http import HttpResponse
import datetime
class SiteInfoSetSessionMiddleware:
def __init__(self, get_response) :
self.get_response = get_response
self.SITE_ID = ''
self.MY_GET_DOMAIN = ''
self.MY_GET_SETKEY = ''
self.LOCAL_ON = False
def __call__(self, request) :
self.process_request(request)
response = self.get_response(request)
response = self.process_response(request, response)
return response
def process_request(self, request):
try :
MY_GET_DOMAIN = request.get_host()
host = MY_GET_DOMAIN.replace('.local', '')
MY_GET_SETKEY = MY_GET_DOMAIN.split('.')[0]
except :
MY_GET_DOMAIN = ''
host = ''
MY_GET_SETKEY = ''
try:
site = Site.objects.get(domain__istartswith=host)
site_no = site.id
except Site.DoesNotExist:
site = Site(domain=host, name=host)
site.save()
site_no = site.id
self.SITE_ID = site_no
self.MY_GET_DOMAIN = host
self.MY_GET_SETKEY = MY_GET_SETKEY
if MY_GET_DOMAIN != host :
self.LOCAL_ON = True
else :
self.LOCAL_ON = False
settings.SITE_THREAD_INFO.SITE_ID = site_no
def process_response(self, request, response) :
try :
response.set_cookie('MY_MULTISITE_ON', True)
response.set_cookie('LOCAL_ON', self.LOCAL_ON)
except :
return response
return response
settings.py で使用するclassを定義する site_id_hook.py
import threading
SITE_THREAD_INFO = threading.local()
class SiteIDHook:
def __int__(self):
SITE_THREAD_INFO.SITE_ID = threading.get_ident()
return SITE_THREAD_INFO.SITE_ID
ローカル環境かどうかのチェックも行っています。
(ローカル環境では、バーチャルホスト名に「.local」を付けて設定)
でないと、ローカルでの検証時に余分なサイト情報登録されちゃいますから。。。
先頭一致で比較はしていますけどね。
クッキーへの設定は今のところ、ローカルかどうかのフラグ、マルチサイト設定有りかどうかのフラグのみ。
今後、必要なクッキーを増やせば色々出来るんじゃないかなと思ってます。
メニューページ
メインコンテンツ
タグ別
公開日別
Popular Entries
Recent Comments
Information
Recent Update
Preview
Information(Board)