Friday I/O ですー。
株式会社ワムウでは、毎週金曜日は 興味がある事柄に取り組み、その成果を何らかの形でアウトプットする日
としております。
みんな金曜日は好きな事やったらいいよ!
はじめに
Golangやらなんやらと色々便利な言語がある昨今ではありますが、さっくりWebアプリを作るのであればやっぱり最強(だと個人的には思ってる)なPythonの Django
ちゃんであります。
今回はDjangoでWebアプリを作る際にいつも使うライブラリをまとめてみました。
django-cacheops
ORM経由でのDBアクセスを勝手にキャッシュしてくれるライブラリです。
入れてちょこっと設定するだけでよしなにしてくれるので大変便利で御座います。
その他、 Function Cache
と View Cache
の仕組みもあるので、キャッシュ戦略はとりあえずこれ使っとけば良い感ある。
django-choices
ModelやFormのChoicesを綺麗に書けるようになるライブラリ。
# 普通の Choices の書き方
class Person(models.Model):
# Choices
PERSON_TYPE = (
("C", "Customer"),
("E", "Employee"),
("G", "Groundhog"),
)
# Fields
name = models.CharField(max_length=32)
type = models.CharField(max_length=1, choices=PERSON_TYPE)
# django-choices を使った場合
from djchoices import DjangoChoices, ChoiceItem
class Person(models.Model):
# Choices
class PersonType(DjangoChoices):
customer = ChoiceItem("C")
employee = ChoiceItem("E")
groundhog = ChoiceItem("G")
# Fields
name = models.CharField(max_length=32)
type = models.CharField(max_length=1, choices=PersonType.choices)
定数としても利用できるので便利。
person = Person.objects.get(1)
if person.type == Person.PersonType.customer:
pass
django-debug-toolbar
言わずもがなですけども、デバッグ用の便利機能を画面に表示してくれるやつ。
これないともう仕事出来ないレベル。
脳死で入れといておk。
django-extensions
お名前の通り django を色々と拡張してくれるライブラリ。
manage.py に色々と便利コマンドを追加してくれたり、管理画面にオートコンプリートの機能を追加したり、お便利モデルフィールド群を用意してくれたり盛り沢山です。
URL一覧を表示する以下のコマンドが地味に便利。
./manage.py show_urls
また、runserver_plusという機能があるのですが、これを使うとブラウザに表示されるエラー画面でデバッグが出来る様になります!
runserver_plus
を利用するにはWerkzeugというライブラリが必要です。
./manage.py runserver_plus 0.0.0.0:8000
django-import-export
CSVファイル等
を管理画面からインポートしたりエクスポートしたり出来るライブラリ。
おじさん達すぐ CSVファイルちょうだい!
っていうから、これ入れとくと便利。
tablibがサポートするフォーマット(ExcelとかJSON)を取り扱えますよ。
デフォルトで使うと無駄に処理が多くて重くなるので、手前味噌ですが以下の記事を参考にすると良いと思います。
django-import-exportのインポートがくそ遅い理由と対処
django-polymorphic
Djangoのマルチテーブル継承を利用する際には是非入れといた方が良いライブラリ。
モデルインスタンスのダウンキャストを勝手にやってくれます。
from polymorphic.models import PolymorphicModel
class Animal(PolymorphicModel):
name = models.CharField('name', max_length=50)
class Dog(Animal):
def say(self):
return '{}: わんわん'.format(self.name)
class Cat(Animal):
def say(self):
return '{}: にゃーん'.format(self.name)
Dog.objects.create(name='ポチ')
Cat.objects.create(name='タマ')
for animal in Animal.objects.all():
print(animal.say()) # 犬なら「わんわん」で猫なら「にゃーん」
django-security
セキュリティ対策用のミドルウェアがいっぱい入ってるライブラリ。
自分で書いてもいいけど、既にあるなら使った方が楽ですよね。
django-storages
アップロードファイルを S3
とかで管理したいなーって時に利用すると便利なライブラリです。
Webアプリが冗長構成を取る場合なんかは必須。
django-widget-tweaks
DjangoのFormをレンダリングする際に classを追加したい
時とかってあると思うんですけど、そういう場合って結構面倒なんですよね。
django-widget-tweaks
を使うと簡潔に書けるので、絶対に使った方が良いです。
Django標準ではこんな書き方ですが。。。
# forms.py
class LoginForm(forms.Form):
username = forms.CharField(
'ユーザー名',
max_length=100,
widget=forms.TextInput(attrs={'class': 'input-username'})
)
password = forms.CharField(
'パスワード',
max_length=100,
widget=forms.PasswordInput(attrs={'class': 'input-password'})
)
---
<!-- login.html -->
<form>
{{ form.username }}
{{ form.passowrd }}
<button type="submit">Login</button>
</form>
django-widget-tweaks
を使うとこうなります。
# forms.py
class LoginForm(forms.Form):
username = forms.CharField('ユーザー名', max_length=100)
password = forms.CharField('パスワード', max_length=100)
---
<!-- login.html -->
{% load widget_tweaks %}
<form>
{% render_field form.username class="input-username" %}
{% render_field form.passowrd class="input-password" type="password" %}
<button type="submit">Login</button>
</form>
HTMLを書く雰囲気で書けるので素敵。
django-betterforms
かゆいところに手が届いてるFormを作成できるライブラリですよ。
複数のFormを1つのFormとして利用出来る MultiForm ってのが特に便利です。
class UserForm(forms.ModelForm):
class Meta:
model = User
fields = ('username', 'password')
class ProfileForm(forms.ModelForm):
class Meta:
model = Profile
fields = ('first_name', 'last_name')
class UserProfileMultiForm(MultiModelForm):
form_classes = {
'user': UserForm,
'profile': ProfileForm,
}
class UserSignupView(CreateView):
form_class = UserProfileMultiForm
success_url = reverse_lazy('home')
def form_valid(self, form):
user = form['user'].save()
profile = form['profile'].save(commit=False)
profile.user = user
profile.save()
return redirect(self.get_success_url())
djangorestframework
Djangoを使って Rest API サーバー
を作りたいーって時に利用すると大変便利なライブラリです。
ライブラリってか別のフレームワークになる感は否めないぐらい巨大なライブラリです。
巨大ゆえ説明が面倒なので偉大な先人のエントリーを参照されたし。
Django REST Frameworkを使って爆速でAPIを実装する
FactoryBoy
テストに必要なモデルデータ作る時とかに大変重宝致します!
リレーション関係にあるデータも一緒に作れるので、テスト書くときにダラダラとデータの準備をする必要がなくなります。
class ProfileFactory(DjangoModelFactory):
user = factory.SubFactory('app.users.factories.UserFactory')
name = Faker('name')
name_kana = Faker('kana_name')
class Meta:
model = Profile
django_get_or_create = ('user',)
class UserFactory(DjangoModelFactory):
email = Faker('email')
password = factory.PostGenerationMethodCall('set_password', 'hogehoge')
profile = factory.RelatedFactory(ProfileFactory, 'user')
class Meta:
model = User
django_get_or_create = ('email',)
user = UserFactory()
assert user.profile.name is not None
dateutil
DjangoってかPythonのライブラリなんですけど、便利なので書いときますね。
名前のとおり、 日時の操作に関するユーティリティ
を提供してくれるライブラリです。
timedelta の強化版である relativedelta がとにかく便利。
timedelta
は n日
までしか指定できないのですけど、 relativedelta
だと nヵ月
とか指定出来るのです。
assert datetime(2000, 1, 1) + relativedelta(months=1) == datetime(2000, 2, 1)
datetime(2000, 1, 31) + relativedelta(months=1) == datetime(2000, 2, 29)
あと、 標準的な日時フォーマットであれば自動でパースしてくれる parser も便利ですよ。
assert parse('2000-10-15') == datetime(2000, 10, 15)
Raven (Sentry)
ライブラリってか エラートラッキングサービスのクライアント
なんですけども、非常に便利なので紹介しておきます。
Webアプリ上で投げられた例外等を検知して、メールやSlackへ通知を送ってくれます。
本番環境でエラーが起きた際に通知が来るようにしておくと、 おじさん達に怒られる前にこっそり直す
という事が出来ます。
エラーの内容も Sentryの管理画面上で確認できる
ので、わざわざログファイルをあさったりもしなくて済みます。
バグの対応速度が段違いに向上するので、是非利用してみてください。
まとめ
他にも沢山のライブラリがDjangoにはあるので、色々探してみると楽しいと思います。
Awesome Djangoで大量にライブラリが紹介されてるので、眺めてみるのも良いと思います。
便利なライブラリあったよー
とか ないから作ったよー
とか教えてくれるとおじさん嬉しいなー。