Django/GeoDjangoレシピ
Django/GeoDjangoの開発で役に立つ、ちょっとしたコツを紹介します。

プロジェクト名と設定ディレクトリ名を違うものにする

プロジェクト名と設定ディレクトリ名が同じ名前でわかりづらいということがあります。 この場合は、django-admin.pyでプロジェクトを作成するときに、設定ディレクトリを わかりやすいディレクトリ名にするという方法もあります。
通常の場合
1
(env) $ django-admin.py startproject myproj
2
myproj
3
├── manage.py
4
└── myproj
5
├── __init__.py
6
├── settings.py
7
├── urls.py
8
└── wsgi.py
Copied!
設定ディレクトリ名を変更した場合
1
(env) $ mkdir myproj
2
(env) $ cd myproj
3
(env) $ django-admin.py startproject config .
4
myproj
5
├── config
6
│ ├── __init__.py
7
│ ├── settings.py
8
│ ├── urls.py
9
│ └── wsgi.py
10
└── manage.py
Copied!

Djangoの環境変数

設定ファイルのsettings.pyにパスワードやAPIキー等を直接に値を記述をすると GitHub等で管理したソースコードからパスワードが漏洩する恐れがあります。 環境変数ファイルから値を読み込むようにしておくとこれを防ぐことが出来ます。
1
(env)$ pip install django-environ
Copied!
環境変数ファイル.envを編集
1
(env)$ vi .env
2
# PostgreSQL
3
POSTGRES_ENGINE=django.db.backends.postgresql_psycopg2
4
POSTGRES_DATABASE=5952
5
POSTGRES_USER=postgres
6
POSTGRES_PASSWORD=
7
POSTGRES_HOST=127.0.0.1
8
POSTGRES_PORT=5432
Copied!
設定ファイル config/settings.py を編集
1
(env)$ vi config/settings.py
2
import os
3
import environ
4
5
root = environ.Path(__file__) - 3
6
env = environ.Env(DEBUG=(bool, False),)
7
8
READ_DOT_ENV_FILE = env.bool('DJANGO_READ_DOT_ENV_FILE', True)
9
if READ_DOT_ENV_FILE:
10
env_file = str(ROOT_DIR.path('.env'))
11
env.read_env(env_file)
12
13
DEBUG = env.bool('DJANGO_DEBUG', False)
14
15
DATABASES = {
16
'default': {
17
'ENGINE': os.environ['POSTGRES_ENGINE'],
18
'NAME': os.environ['POSTGRES_DATABASE'],
19
'USER': os.environ['POSTGRES_USER'],
20
'PASSWORD': os.environ['POSTGRES_PASSWORD'],
21
'HOST': os.environ['POSTGRES_HOST'],
22
'PORT': os.environ['POSTGRES_PORT']
23
}
24
}
Copied!

GeoDjangoでGeoJSON Tile Layer

django-geojsonをインストールすると 「Tiled GeoJSON layer view」というViewが利用することが出来ます。
これに、JavaScriptライブラリのLeaflet GeoJSON Tile Layerを 組み合わせるとGeoJSONをタイルで読み込むことが出来ます。 ただし、Leaflet GeoJSON Tile LayerがLeaflet 0.7.7にしか対応してないこともあるので、紹介までに留めて起きます
django-geojson documentには、 他にも機能があるのでドキュメントを参考にしてみてください。
1
(env)$ pip install django-geojson
Copied!

Djangoで非同期処理

Djangoで非同期処理をする場合は、分散タスク・キューのCelery - http://www.celeryproject.org/ を使う方法があります。
1
(env)$ pip install celery
Copied!
例として、TensorFlowを使った非同期処理を下記に記述します。
  • task queue based on message - Celery
  • used celery as broker - RabbitMQ, Redis
  • Worker Thread of Application - e.g. TensorFlow
参考

SQLでデータベースアクセス

直接にSQL文でデータベースにアクセスすることが出来ます。 複雑な空間演算をする時などでは、SQL文を直接記述する方が良いかと思います。

Djangoのモデルとして接続しているデータベースにアクセスする場合

1
from django.db import connection
2
3
try:
4
cursor = connection.cursor()
5
cursor.execute("SELECT * FROM database")
6
7
col_names = [desc[0] for desc in cursor.description] # カラム名取得
8
9
# fetchall()で、結果を全て取り出せる
10
rows = cursor.fetchall()
11
dict_result = []
12
for row in rows:
13
row_dict = dict(zip(col_names, row))
14
dict_result.append(row_dict)
15
16
except Exception as e:
17
raise Exception()
18
19
finally:
20
cursor.close()
21
22
return dict_result
Copied!

外部のデータベースにアクセスする場合

1
import psycopg2
2
import psycopg2.extras # DictCursorを使用するために拡張機能をimport
3
4
# Connect to an existing database
5
try:
6
connection = psycopg2.connect("dbname='database' user='postgres' host='localhost' password='xxxxx' port='5432'")
7
connection.autocommit = True
8
except psycopg2.Error as e:
9
raise Exception()
10
11
try:
12
# Open a cursor to perform database operations
13
cursor = connection.cursor(cursor_factory=psycopg2.extras.DictCursor)
14
# Query the database and obtain data as Python objects
15
cursor.execute("SELECT * FROM database")
16
17
# fetchall()で、1結果を全て取り出せる
18
cursor = cursor.fetchall()
19
dict_result = []
20
for row in rows:
21
dict_result.append(dict(row))
22
23
except psycopg2.Error as e:
24
raise Exception()
25
26
finally:
27
cursor.close()
28
connection.close()
29
30
return dict_result
Copied!
参考
  • セキュリティの観点から、データベースの接続情報はソースコードに直接に記述をせずに、django-environ等で環境変数で設定することを推奨します。