Django 1.9で追加されたメジャー機能の紹介
この記事は 2015 tech-yuruyuru アドベントカレンダー - connpass 14日目のものです。
Django 1.9 がリリースされたので、メジャー機能だけでもチェックしようということで、ドキュメントとコードみつつ調べたことを簡単に書いてきます。
ここに書いてあるコードは本家documentから引用してます。(わかりやすいので)
今回追加されたメジャー機能
- Performing actions after a transaction commit
- Password validation
- Permission mixins for class-based views
- Running tests in parallel
Performing actions after a transaction commit
- トランザクションが正常にコミットされた後に実行するアクションのフックが追加されました
from django.db import transaction def do_something(): pass # send a mail, invalidate a cache, fire off a Celery task, etc. transaction.on_commit(do_something)
(引用: Database transactions | Django documentation | Django)
Password validation
パスワードのいろんなバリデーション機能がDjango側でできるようになった
settingsのAUTH_PASSWORD_VALIDATORSにバリデーションの種類をいろいろ追加できる
defalutは []、設定しなければ全てのパスワードは受理される
AUTH_PASSWORD_VALIDATORS = [ { 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', }, { 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', 'OPTIONS': { 'min_length': 9, } }, { 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', }, { 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', }, ]
(引用: Password management in Django | Django documentation | Django)
- UserAttributeSimilarityValidator
Userの入力したパスワードが、username, first_name, last_name, email と類似しているかどうかを検証してくれるclass
lower()で小文字にしたあとSequenceMatcherで文字列比較、quick_ratio()でシーケンスの同一性を測り、類似度が高い場合にエラーメッセージを返す。
- CommonPasswordValidator
よくあるパスワードのリスト.txtと一致したらエラー出すclass
common-passwords.txt.gzというのが、よくあるパスワードリスト。これを解凍してこのパスワードリストの中に入力されたパスワードがあればエラーメッセージを返す。
- MinimumLengthValidator
パスワードの最小の長さを設定できる
- NumericPasswordValidator
数値のみでパスワードが構成されていないかチェックしてくれる
- 実装みれば何やってるかよくわかります
django.contrib.auth.password_validation | Django documentation | Django
Permission mixins for class-based views
Django-bracesにあるアクセス制御関連と似た機能を追加したよという話
requestを受け取ってViewに処理を渡す前にアクセス権限のチェックとかしたりするのを、今まではdecoratorを作ったりDjango-bracesを入れてやっていたけど、これがDjango側でできるようになった。
- 今回追加されたMixin
- AccessMixin
- LoginRequiredMixin
- PermissionRequiredMixin
- UserPassesTestMixin
- LoginRequiredMixin
非認証ユーザをログインページ または 403ページ へリダイレクト
このMixinはUser.is_active フラグはチェックしないというのは覚えていた方が良いかも。
from django.contrib.auth.mixins import LoginRequiredMixin class MyView(LoginRequiredMixin, View): login_url = '/login/' redirect_field_name = 'redirect_to'
(引用: Using the Django authentication system | Django documentation | Django)
- PermissionRequiredMixin
ビューにアクセスするユーザが指定の権限を持っているかチェックする
権限のないユーザの取り扱いをまとめてカスタマイズできる。便利だと思う。
from django.contrib.auth.mixins import PermissionRequiredMixin class MyView(PermissionRequiredMixin, View): permission_required = 'polls.can_vote' # Or multiple of permissions: permission_required = ('polls.can_open', 'polls.can_edit')
(引用: Using the Django authentication system | Django documentation | Django)
Running tests in parallel
別のプロセスで平行してテストを実行できるよという話
-
- pararel=n でプロセス数の調整もできる
- 注意点
(資料: [django-admin and manage.py | Django documentation | Django)
以上です。
他にもいっぱい追加されてたので、少しずつ調べる。
ちなみに (だいたい)新卒エンジニア向け技術交流会 vol.5 - Dark - Developers at Real Kommunity | Doorkeeper で発表した内容とほぼ一緒なので、スライドも置いておく。
www.slideshare.net