リクエスト元の
ユースケースとGeoIP2
と、
事前準備と
前提
OS の
OS の
Version cat /etc/redhat-release CentOS Linux release 7.8.2003 (Core)
Djangoの
Version pip list | grep Django Django 1.11.20
djangorestframeworkの
Version pip list | grep djangorestframework djangorestframework 3.9.2
CentOS 7 に、geoipupdate
を インストールして、 GeoIP2の データベースを 自動更新する
Django のGeoIP2
を
これは、geoipupdate
と
インストール、
CentOS 7の
インストール
Version 2.5.0 がyum -y install geoipupdate
インストールされました。 geoipupdate -V geoipupdate 2.5.0
GeoIP.confの
編集
データベースの更新には、 アカウント情報と ライセンスキーが 必要に なります。
ライセンスキーは、GeoLite2 Sign Up | MaxMind で アカウントを 作ると 発行できるようになります。
ちなみに、データベースの ダウンロードにも、 アカウント登録が 必要です。
CentOS 7 だと、/etc/GeoIP.conf
にファイルは 配置されています。
AccuntID
、LicenseKey
に払い出された 情報を 設定します。 # Enter your account ID and license key below. These are available from # https://www.maxmind.com/en/my_license_key. If you are only using free # GeoLite databases, you may leave the 0 values. AccountID YOUR_ACCOUNT_IDYOUR_ACCOUNT_ID LicenseKey YOUR_LICENSE_KEY # Enter the edition IDs of the databases you would like to update. # Multiple edition IDs are separated by spaces. EditionIDs GeoLite2-Country GeoLite2-City
ライセンスキー発行時の
注意点
ライセンスキー発行時に、geoipupdate
で使用するか 否かの チェックボックスが あり、 チェックしないと、 geoipupdate
では使用できない キーに なります。
CentOS 7 のyum で インストールできる geoipupdate
のVesion が 2.5.0 なので 3.1.1以下を 選択しています。 この 設定ですと、 ライセンスキーは ハッシュ形式で 保存されないため、 安全性が 低くなる 旨の 警告が この 後の ページで 出力されます。 私は 気にしませんでしたが、 気に される 方は yum での インストールではなく、 ソースから ビルドを かけるなど 実施した ほうが 良いかもしれません。 ディレクトリ作成
を/bin/geoipupdate
実行した ところ、 と/usr/share/GeoIP does not exist
出力されました。
データベースの格納先が ないので、 ディレクトリを 作成します。 mkdir /usr/share/GeoIP
スケジュール実行
参考記事と同様に、 木曜日に 実行するように 設定しました。 0 12 * * 4 /bin/geoipupdate # GeoIP Update
以上で、
djangorestframework で Web API を 建てる
djangorestframework で
geoip2 の
インストール
StackOverFlow の記事で、 Django 1.11 の 場合、 Version指定して インストールしていたので、 それを 参考に バージョン指定しています。 pip install geoip2==2.9.0
settings.pyの
編集
GEOIP_PATH
を追加します。 GEOIP_COUNTRY
と、GEOIP_CITY
もありますが、 デフォルト設定で 問題ないので、 記載しませんでした。 ################## # GEOIP SETTINGS ################## GEOIP_PATH='/usr/share/GeoIP'
urls.pyの
編集 import apis url("^geoip/$",apis.geoip, name="geoip")
apis.py
@api_view
デコレータで、関数APIを 作りました。 from rest_framework.decorators import api_view from django.contrib.gis.geoip2 import GeoIP2 from rest_framework.response import Response @api_view(['GET']) def geoip(request): g = GeoIP2() client_addr = request.META.get('REMOTE_ADDR') city = g.city(client_addr) return Response(city)
追記. django-geoip2-extras を 使う
template で、
tempalteタグで
インストール
pip install django-geoip2-extras
settings.py に
geoip2_extras.middleware.GeoIP2Middleware
を追加 MIDDLEWARE = ( ..., 'django.contrib.sessions.middleware.SessionMiddleware', 'geoip2_extras.middleware.GeoIP2Middleware', ... )
これで、request.geo_data
に
- ip_address
- city
- postal_code
- region
- country_code
- country_name
- latitude
- longitude
is_unknown
templateで
使う
Django のtemplate内では 以下のように 使用できます。 {% if request.geo_data is None or request.geo_data.country_code == "JP" %} <div class="blog-item"> <!-- blog本文下の広告 --> <ins class="adsbygoogle" style="display:block" data-ad-client="{{ settings.CLEAN_BLOG_GOOGLE_ADS_CLIENT_ID }}" data-ad-slot="{{ settings.CLEAN_BLOG_GOOGLE_ADS_SLOT_ID }}" data-ad-format="auto"></ins> <hr> </div> {% endif %}
注意点
template内で使用する 際の 注意点を 記載します。 Cacheの
設定の 確認 Django の Cache の 設定に よっては、 templateの 評価が 行われず、 requestごとに 判定されない 場合が あります。
Django’s cache framework | Django ドキュメント | Django にtemplateに 対する Cache設定に ついての 記載が あります。 django.core.context_processors.request を
有効に する。
template 内でrequest に オブジェクトに アクセスするには、 Django.core.context_processors.request
をTEMPLATE_CONTEXT_PROCESSORS
に登録する 必要が あります。
参考
以下、
IPアドレスから
地域特定する GeoIP系技術に ついて 調べてみた (追記あり)|TechRacho(テックラッチョ)〜 エンジニアの 「?」を 「!」に〜|BPS株式会社 Automatic Updates for GeoIP2 and GeoIP Legacy Databases « MaxMind Developer Site
geodjango - Django: ImportError: cannot import name ‘GeoIP2’ - Stack Overflow
以上です。
コメント