DjangoCongress JP 2018 Django利用状況アンケート

Djangoって実際どうなの?

Pythonで書かれたウェブアプリケーションフレームワークDjango。実は2005年にリリースされた10年以上続いている息の長いプロダクトなのです。 今回は実際にDjangoを使っている企業様に「現場ではどのように使われているのか」をアンケートをしてみました。 Djangoを使ってみたいけれど不安のある方、またすでに使われている方にも参考になればと思います。

In [1]:
import re
import pandas as pd
from matplotlib import pyplot as plt
%matplotlib inline
# 日本語フォント
plt.rcParams['font.family'] = 'IPAPGothic'
# パイチャートのサイズを大きく
piechart_figsize = (10, 10)
piechart_font_size = 30
In [2]:
def flatmap_series(series, func):
    values = []
    for value in series:
        new_values = func(value)
        for v in new_values:
            values.append(v)
    return pd.Series(values)


def multiple_choices(series):
    return flatmap_series(series.dropna(), lambda s: [v.strip() for v in re.split(',', s)])
In [3]:
df = pd.read_csv("DjangoCongress JP 2018 事前アンケート(回答) - フォームの回答.csv",
                 header=0,
                 names=['company_name', 'product_kind', 'why_django', 'experience', 'django_version', 'python_version', 'os', 'db_backend', 'problem', 'recommend_library'])
# df

Djangoを使っている企業

In [4]:
for company_name in df['company_name'].replace('Castalia', 'キャスタリア株式会社').dropna().sort_values().unique():
    print(company_name)
AWAKENS, Inc.
BeProud
UNCOVER TRUTH Inc.
scouty.inc
キャスタリア株式会社
日本営農システムズ株式会社
株式会社SQUEEZE
株式会社オープンコレクター
株式会社クレジットエンジン
株式会社ハンズ
株式会社ハートビーツ
株式会社ワングリット
株式会社日本システム技研
株式会社雛屋建設社

Djangoでどのようなアプリケーションを開発しているか

一般的なウェブアプリケーションについでAPIサービスや教育方面でよく採用されているようです。 APIを開発するときはDjango REST Framework、教育システムだとOpen edXなど利用できるシステムやライブラリが豊富なのがDjangoの特色ですね。

In [5]:
default_kind = 'ウェブアプリ'
kinds = dict((re.compile(k), v) for k, v in ({
    '.*(教育|MOOC|学習|勉強).*': '教育',
    '.*社内.*': '社内システム',
    '.*受託.*': '受託',
    '.*(ウェブサイト|ブログ).*': 'ウェブサイト',
    '.*個人.*': '個人',
    '.*API.*': 'APIサービス',
    '.*メディア.*': 'ウェブメディア',
    '.*(分析|集計).*': '分析',
    '.*業務.*': '業務',
}).items())

def product_kind(value):
    for pattern, label in kinds.items():
        if pattern.match(value):
            return label
    else:
        return default_kind
    
product_kinds = flatmap_series(df['product_kind'].dropna(),
               lambda s: [label.replace('* ', '') for label in re.split('[\n,、,・]', s) if label != '']).map(product_kind)
_ = product_kinds.groupby(product_kinds).count().plot('pie', label='', figsize=piechart_figsize, fontsize=piechart_font_size).axis('equal')

他のフレームワークではなくDjangoを選んだ理由

やはりPython。PythonだからDjangoにしたという方が多数でした。 また、そのなかでもフルスタックなフレームワークとして、機能が豊富で利用実績が多いというのも、選択した決め手になっているとの回答もありました。 最近だと機械学習などでPythonを使っているから、そのままDjangoを選ぶというケースもあるようです。

In [6]:
from matplotlib.font_manager import findfont
from janome.tokenizer import Tokenizer
from janome.tokenfilter import CompoundNounFilter
from wordcloud import WordCloud

tokenizer = Tokenizer()
filter = CompoundNounFilter()
keywords = []
stop_words = ['ため', 'あっ', 'ある', 'いる', 'こと']
for problem in df['why_django'].dropna():
    tokens = tokenizer.tokenize(problem)
    tokens = filter.apply(tokens)
    keywords.extend([
        token.surface for token in tokens
        if token.surface not in stop_words and token.part_of_speech.split(',')[0] in ('形容詞', '名詞', '副詞', '動詞')])

font_path = findfont('IPAPGothic')
figure = plt.figure(figsize=(10,10))
figure.add_subplot(111).axis('off')
_ = plt.imshow(WordCloud(background_color="white", font_path=font_path, width=1000, height=1000).generate(" ".join(keywords)))

Djangoだからといって特殊な環境ではなくウェブ系の一般的な環境で使用されていることがわかります。 比較的新しいバージョンが選ばれているのは、もうずっとDjangoを使っているというよりは、ここ数年のPythonの採用の拡大にあわせてDjangoで開発をスタートしたケースが多そうです。 PyPyでの実績もありますね。発表お待ちしています。

どれくらいの期間Djangoで開発をしているか

In [7]:
experiences = df['experience'].map(lambda s: re.sub(r'\(.*\)', '', s))
_ = experiences.groupby(experiences).count().plot('pie', label='', figsize=piechart_figsize, fontsize=piechart_font_size).axis('equal')

使っているDjangoのバージョン

In [8]:
django_versions = multiple_choices(df['django_version']).map(lambda s: re.sub(r'\(.*\)', '', s).replace('2.0', '2'))
_ = django_versions.groupby(django_versions).count().plot('pie', label='', figsize=piechart_figsize, fontsize=piechart_font_size).axis('equal')

使っているPython

In [9]:
python_versions = multiple_choices(df['python_version'])
_ = python_versions.groupby(python_versions).count().plot('pie', label='', figsize=piechart_figsize, fontsize=piechart_font_size).axis('equal')

Djangoを動かしているOS

In [10]:
oses = multiple_choices(df['os'])
_ = oses.groupby(oses).count().plot('pie', label='', figsize=piechart_figsize, fontsize=piechart_font_size).axis('equal')

Djangoバックエンドのデータベース

二大OSSデータベースであるMySQLとPostgreSQLの利用が大半を占めていますね。 珍しいところでMongoDBを使われているところもあるようですが、これはdjango-mongodb-engine( https://django-mongodb-engine.readthedocs.io/en/latest/ )のようなカスタムのバックエンドを使っているのでしょうか。

In [11]:
db_backends = multiple_choices(df['db_backend'].replace("Aurora, Amazon Redshift", "Aurora、\nAmazon Redshift", regex=True).replace(r'SQL\(', r'SQL\n(', regex=True)) # 選択肢の設定上で","が含まれてた
db_backends
_ = db_backends.groupby(db_backends).count().plot('pie', label='', figsize=piechart_figsize, fontsize=piechart_font_size).axis('equal')

Djangoを使って困っていること

圧倒的に日本語の情報が不足しているようです。また、メインのコンポーネントであるViewとModelまわりで困ることが多いようです。 洋書ではTwo Scoops of Djangoがトピックを網羅しているのでおすすめです。他にもいくつか参考になる書籍がでているので探してみてください。最近ではDjangoの同人誌も作られているようです。

In [12]:
from matplotlib.font_manager import findfont
from janome.tokenizer import Tokenizer
from janome.tokenfilter import CompoundNounFilter
from wordcloud import WordCloud

tokenizer = Tokenizer()
filter = CompoundNounFilter()
keywords = []
stop_words = []
for problem in df['problem'].dropna():
    tokens = tokenizer.tokenize(problem)
    tokens = filter.apply(tokens)
    keywords.extend([
        token.surface for token in tokens
        if token.surface not in stop_words and token.part_of_speech.split(',')[0] in ('形容詞', '名詞', '副詞', '動詞')])

font_path = findfont('IPAPGothic')
figure = plt.figure(figsize=(10,10))
figure.add_subplot(111).axis('off')
_ = plt.imshow(WordCloud(background_color="white", font_path=font_path, width=1000, height=1000).generate(" ".join(keywords)))

おすすめライブラリ

Django REST Frameworkは鉄板ですね。SwaggerもAPI系です。他、Django Debug Toolbar、Django Hijack、Django Extensionsなど開発支援のもの、django-imort-export、Silkなど運用で使われるもの、Python Social Auth、django-keeperなど認証機能を提供するものなどがよく使われています。 Djangoは再利用できるモジュールが多くあるので、知らないものあったら調べてみてくださいね。

In [13]:
stop_words = ['en', 'latest', 'csv', 'json']
libraries = []
for recommend_library_text in df['recommend_library'].dropna():
    recommend_library_text = recommend_library_text\
        .lower()\
        .replace('django import/export', 'django-import-export')\
        .replace('import-export', 'django-import-export')\
        .replace('django rest framework', 'django-rest-framework')
    for s in re.split(r'(\n|と|は|(|・|\(|/|,)', recommend_library_text):
        s = s.strip().lower().replace(':-)', '')
        if s == "":
            continue
        if s in stop_words:
            continue
        if re.search('^([a-z]| |-)+$', s):
            libraries.append(s.replace('django-', '').replace('-django', '').replace('python-', ''))

font_path = findfont('IPAPGothic')
figure = plt.figure(figsize=(10,10))
figure.add_subplot(111).axis('off')
_ = plt.imshow(WordCloud(background_color="white", font_path=font_path, width=1000, height=1000, regexp=r'\w[\w-]+').generate(" ".join(libraries)))