サイトを識別するために

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

うちの型落ちMacもぽちぽちとアップデートかけていたりする訳ですが。最近ちょっと多くないですかー?Big Surさん?ちょっと勘弁して欲しいんですけど!確かに明らかにクライアントとして使用すべきMac
Read more
当初は常識的に?レンタルサーバー上でクーロン実行考えていたですが。良く良く考えてみれば。私が今クーロンで実行させたいと思っているスクリプトは、レンタルサーバーで実行する必要全然ない、んですよねー。要は
Read more
php7.2 へのバージョンアップが予定通り、レンタルサーバーさんでされました。一応、事前にドキュメント読んだりはしたつもりだったですが。出ました。思いっ切り出ましたね!エラー。しかも、ちょっと恥ずか
Read more
全然気づいていなかったけれども。コンテンツサイトでjstreeが動かなくなっていたんですよね。ちょっと前にごちょごちょ弄くってはいたので、何かやらかしたか?!と思っていたのですが。(ほら、jsだから、
Read more
ちょっと都合に付き、MySQLをサイトで使うようにしようかなと思い立ちました。でもいきなりレンタルサーバー様でMySQL使うのはリスキー。取り敢えず、検証環境で使えるように、とうことで、やはりNASで
Read more

Recent Comments

Information

緊急連絡は現在ありません。

Recent Update

さて。改装しておよそ1か月経過しました。といっても、見かけは変えてないつもりなのでわからないでしょーが。今回の改装ポイントは、前は完全関数型使用でした、が、今回は可能な限りクラス使用しています。うん、
Read more
DjangoでのエラーをADMINSにメール送信出来る環境を整え。なかなか良い感じにバグフィックス出来るようになってきたな~Sentryお役御免か?なんて良い気になってましたよ、ハイ。すいません、私で
Read more
うちの型落ちMacもぽちぽちとアップデートかけていたりする訳ですが。最近ちょっと多くないですかー?Big Surさん?ちょっと勘弁して欲しいんですけど!確かに明らかにクライアントとして使用すべきMac
Read more
PythonとDjangoアップデートであります。早いですよ、やっぱり!(Pythonも3.9。。。4はいつ頃なんだっけ?確かもうスケジュールされてたような。あれ、Djangoだけかな)Djangoで
Read more
サイト改装、というか、プログラム&フレームワーク切替から少々時間経過しました。(確か8月頭に処理した筈)思わぬエラーや自分的見落としやらミスによるエラー対応もほぼほぼ終了。終息したかなっと思ってます。
Read more

Preview

Information(Board)

サイト改装しました! といいつつ、表向きは全く変わらない(ように作った)筈です。 何かおかしいところがございましたら、ご連絡頂けると助かります。
Read more