僕とコードとブルーハワイ

omega (@equal_001) の日記

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 でプロセス数の調整もできる
  • 実行方法
    • python manage.py test --pararel=5
    • DJANGO_TEST_PROCESSESでプロセス数を設定可能
  • 注意点
    • pdb仕込むときは並列化を無効にしないとpdb落ちる
    • テスト失敗時は例外のトレースバックが表示されないこともある(デバッグするの困難)
    • 各プロセスのテストで独自DBを使用するので、同じリソースにアクセスしないように気をつけろとのこと

(資料: [django-admin and manage.py | Django documentation | Django)



以上です。
他にもいっぱい追加されてたので、少しずつ調べる。


ちなみに (だいたい)新卒エンジニア向け技術交流会 vol.5 - Dark - Developers at Real Kommunity | Doorkeeper で発表した内容とほぼ一緒なので、スライドも置いておく。

www.slideshare.net