書籍紹介:Python実践レシピ

Python実践レシピ』をレビューでお手伝いしまして、本書をいただきましたので紹介します。

本書はPython3.9をターゲットとした内容になっており、Pythonでよく使われる標準モジュールやサードパーティのモジュールをサンプルコード付きで紹介しています。

Pythonの公式ドキュメントは分量がかなりあり、有志による日本語訳もありますが、内容的には本書とはそれほど重複はありません。 公式ドキュメントを補完するような内容なので、入門の後の2冊目ぐらいのところでオススメです。

レビューの際に比較的新しい標準モジュールの章などを読んでいると、「こんな機能あったんだ」みたいな発見もあったので、既にPythonを利用している方でも読んでみると発見があるかもしれません。

512ページもある分厚い本ですが、定価2970円となっており、技術書としては手頃な価格かと思います。

Djangoで他のユーザーに成り代わる機能を提供するdjango-hijackを試す

ウェブサービスの運営で、「特定のユーザーでログインして画面の動作を試す」ことをしたい場合、django-hijackというパッケージで簡単に実現できます。 試したバージョンは、Python 3.10, Django 3.2, django-hijack 3.1.2 です。

ドキュメント

django-hijack 2.x系のドキュメントはReadTheDocsでホストされていますが、3.x系のドキュメントはGitHubのdocsディレクトリを参照とのことでした。

django-hijack/index.md at master · django-hijack/django-hijack · GitHub

djanog-hijackの導入

2.x系はコア機能のdjango-hijackと、管理画面の拡張機能django-hijack-adminの2つのPyPIのパッケージに別れていましたが、3.xではdjango-hijackパッケージのみに統合されたようです。

インストールは django-hijack のパッケージのみでokでした。

pip install django-hijack

ドキュメントにある通り、Djangosettings.py を編集し、 INSTALLED_APPSMIDDLEWARE を設定します。

# settings.py
INSTALLED_APPS = [
    '…',
    'hijack',
    'hijack.contrib.admin',  # Django Adminの統合機能を使う場合
]

MIDDLEWARE = [
    '…',
    'hijack.middleware.HijackUserMiddleware',
]

別ユーザーに成り代わる機能を提供するViewが必要なので、 urls.pydjango-hijackのエンドポイントをincludeします。

# urls.py
from django.urls import include, path


urlpatterns = [
    path('hijack/', include('hijack.urls')),
    # …
]

これで管理画面のユーザー一覧に「HIJACK」というボタンが表示されます。ボタンを押すとユーザーに成り代わります。

f:id:nullpobug:20211123164720p:plain

以下はユーザー名を表示するだけの簡単なViewを作ってテストした画面です。画面下部のメッセージはdjango-hijackが自動で挿入したものになります。

f:id:nullpobug:20211123164735p:plain

カスタムのユーザーモデルを利用していて、Adminを独自で拡張している場合は、 hijack.contrib.admin.admin モジュールにある HijackUserAdminMixin を利用する必要があるかもしれません。

デフォルトではHIJACKボタンを押せるユーザーは、管理者(is_superusertrue)のみです。 settings.HIJACK_PERMISSION_CHECK で権限のチェックをカスタマイズできます。

参考

blog.hirokiky.org

WindowsにCygwinの作業環境をセットアップする

いつも作業用のWindowsでは、sshLinux系OSの各種コマンド群はCygwinを使ってます。sshクライアント、bashが使える環境をセットアップするところまでのメモです。

ホームディレクトリはWindowsのホームディレクトリと合わせたいので設定を変更してます。

Cygwinのインストール

Cygwinのインストールは、インストーラーを使います。 setup-x86-64.exe をダウンロードしてきて実行。

Cygwin Installation

インターネット接続環境があるので、「Install from Internet」を選んでCygwinの各パッケージをダウンロードしてインストールします。 f:id:nullpobug:20211031155648p:plain インストール先、キャッシュ先はデフォルトのまま進めて、Download Siteは速度の関係から国内を選びます。(jpドメインのところならどれでもよいけど、ftpが速度は速め。ミラーサーバーはいつもありがたく使わせていただいております。) f:id:nullpobug:20211031155704p:plain パッケージ一覧から、インストールしたいソフトウェアパッケージを選択します。sshコマンドならopensshとか。全部入れると多いので必要なものだけ入れるようにしています。

いつも使っているのはopensshやtreeコマンドのあたり。デフォルトでインストールされるパッケージもあるので気をつけること。Srcは基本的に不要。 f:id:nullpobug:20211031155720p:plain 「次へ」で進めてインストールを完了させます。

ホームディレクトリ変更

ホームディレクトリはデフォルトだと、Cygwinインストール先の /home/ 以下にユーザー名で作られるのですが、個人的にはWindowsのホームディレクトリと合わせたいので、変更します。

デフォルトのインストール先の場合は、 C:\cygwin64\etc\nsswitch.conf ファイルの db_home の値を以下のように編集します。

db_home: /%H

これでCygwin起動時のホームディレクトリがWindowsのホームディレクトリと同じになります。

.bashrcの調整

デフォルトのプロンプトは改行が含まれていてイマイチなので、 ユーザー名@ホスト名 カレントディレクトリ$ の表示にしています。

また、Windowsのstartコマンドでexplorerにてフォルダを開く機能も同様に使いたかったので、cygstartのエイリアスを設定しています。

.bashrc 末尾部分:

#PS1='[\u@\h \W]\$ '
PS1='\[\e]0;\w\a\]\n\[\e[32m\]\u@\h \[\e[33m\]\w\[\e[0m\]\$ '
alias start=cygstart

f:id:nullpobug:20211031155826p:plain

フォントや背景色などは好みで調整。

参考

Djangoの自動主キーフィールド

Djangoではモデルクラスに primary_key=True のフィールドを明示的に定義しない場合、自動で id という名前で主キーのフィールドが追加されます。

このとき使われるフィールドのクラスは、Django 3.1以前では AutoField でしたが、Django 3.2から settings.DEFAULT_AUTO_FIELD で指定されたクラスが使われるようになりました。

Djangoにビルトインされている自動インクリメントされる主キーのフィールドクラスは次のとおりです。

  • AutoField
    • 範囲: 1 ~ 2147483647
    • IntegerFieldを継承している
  • BigAutoField
    • Django 1.10 で追加
    • 範囲: 1 ~ 9223372036854775807
    • BigIntegerFieldを継承している
  • SmallAutoField
    • Django 3.0 で追加
    • 範囲: 1 ~ 32767
    • SmallIntegerFieldを継承している

settings.DEFAULT_AUTO_FIELD について

settings.DEFAULT_AUTO_FIELD は、Django 3.2で追加されました。 settings.pyに定義がない場合のデフォルト値は 'django.db.fields.AutoField' です。 startprojectで新規にプロジェクトを作成した場合は、settings.pyには DEFAULT_AUTO_FIELD = 'django.db.fields.BigAutoField' が記述されます。

AutoFieldからBigAutoFieldへのマイグレーション

自動で追加されているidフィールドを、AutoFieldからBigAutoFieldに変更したい場合、settings.py に DEFAULT_AUTO_FIELD = 'django.db.fields.BigAutoField' を記述してからmakemigrationsを実行すると、スキーマ変更のマイグレーションファイルが作られます。

あとはいつも通りマイグレーションを実施できます。

参考

Ubuntu 20.04(Focal Fossa)にdeadsnakes PPAでPython3.9をインストールする

Ubuntu向けのPPAであるdeadsnakesを使うと、aptコマンドで複数のPythonバージョンを簡単にインストールできます。

add-apt-repositoryコマンドをインストール

PPAのaptリポジトリの追加に add-apt-repository コマンドを使います。 software-properties-common パッケージに含まれています。

sudo apt install -y software-properties-common

deadsnakes PPAのリポジトリを有効化

aptコマンドでインストールするために、deadsnakes PPAのリポジトリを有効化します。

sudo add-apt-repository -y ppa:deadsnakes/ppa
sudo apt update

成功すれば apt search python3.9 コマンドのようにしてパッケージを探すと、列挙されるようになります。

Python 3.9をインストール

スタンダードに venv を使える環境を作ります。

sudo apt install -y python3.9 python3.9-dev python3.9-venv

成功すれば python3.9 -V コマンドでPython 3.9のバージョンが表示されるようになります。

ensurepip

venvのみで運用する場合、venvを作ったときにvenv環境にはpipコマンドが入るので、これは必須ではありませんが、venvなしでもpipコマンドを使いたい場合にはensurepipを実行しておくとよいです。

python3.9 -m ensurepip --default-pip --user

~/.local/bin ディレクトリに pip コマンドが追加されます。PATHを通しておくとよいかと思います。

書籍紹介:エキスパートPythonプログラミング改訂3版

『エキスパートPythonプログラミング 改訂3版』を査読でお手伝いしまして、本書をいただきましたので紹介します。

最初に手にとった際、「分厚い・・・」と感じました。手元に初版から改訂3版までがあるのですが、ページ数はそれぞれ次の通りです。

  • 初版:416ページ
  • 改訂2版:520ページ
  • 改訂3版:616ページ

これまで改訂のたびに100ページほど増えてました。

改訂3版はPython3.9をターゲットにしています。

改訂2版の際はPython2系と3系の比較の話などがありましたが、Python2系は完全にEOLとなり、Python3系のほうが一般的な状況となったので、2系の話は基本的にありません。

また、3系でもEOLとなったバージョンの話は削除され、比較的最近入った機能などの説明が追加されています。

「古くなったものが削除され、新しいものが追加された」という感じの改訂になっています。

レベル感は以前と変わらず、中級、上級者向けの内容となっています。

書籍紹介:実践Django Pythonによる本格Webアプリケーション開発

@c_bata_ さんの著書、『実践Django Pythonによる本格Webアプリケーション開発』をいただいたので紹介します。

本書の内容

Djangoの基本機能、モデルとクエリ操作、ビュー、テンプレート、フォーム、テスト、認証と認可、Django Rest FrameworkによるAPI開発を実際に動作するコードとともに説明をしています。

特に以下の点はおもしろいと思いました。

  • テストコードを多く記述している
    • テストコードを始めに書いて、テストをFailにしたあとで、テストコードがSuccessになるよう実装を進めている
  • セキュリティの説明で、実際に問題発生するコードを説明してから、解決方法の説明をしている
  • クエリ数を削減するパフォーマンスチューニングの話がある
    • SQLの実行計画の確認やインデックスについての説明がある

また、題材となっている「コードスニペット共有サイト」のアプリ開発で、サードパーティライブラリをうまく活用している点もよかったです。

Djangoのバージョンは、現時点では最新版となる 3.2系 に対応しているため、これからDjangoを使う人にとってもよいと思います。

対象読者

対象読者は本書の最初に書かれています。

  • Pythonの基本が理解できている
  • 簡単なWebアプリケーションの開発経験がある(言語やフレームワークは問わない)

Pythonの文法や使い方の説明は無いので、Pythonについては別途学習が必要です。

Webアプリケーションの基本的な仕組み(HTTPやHTML、CSS、通信の仕組みなど)の説明は省略されているので、別途学習するとよいと思います。

SQLの文法やデータベースの使い方の説明は省略されているので、別途学習するとよいと思います。

プログラミング初心者の方にはおすすめできません(想定してないと思います)

Djangoを使って簡単なアプリを書いたことはあるけど、この次に何をしたらよいのかわからない」という人にはオススメです。

Django初級~中級ぐらいのレベル感だと思います。

その他

  • 査読協力に載ってる方は見知った人たち
    • aodagがDjangoの本を査読しているぞ!