DjangoのDB操作やテンプレートの処理結果をJupyterLabで確認する方法を説明する.
DjangoのextensionでJupyterLabを使えるものもある(参考1, 参考2)が,これはDjangoの設定ファイルを変更する必要もあり,やや不便であるため,拡張機能は使わない方法を説明する.
JupyterLabの実行
ipynbファイルはDjangoのmanage.pyと同じディレクトリに置いた状態で以下のコマンドを実行する.
参考:Djangoの設定 | Django ドキュメント | Django
# django初期化処理
# 1回だけ実行する
import django
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "basic.settings_dev")
# 非同期の処理を許可する
os.environ["DJANGO_ALLOW_ASYNC_UNSAFE"] = "true"
django.setup()
DB操作など一部の処理を実行するために非同期処理を許可する.
注意点は以下を参照
models
Djangoで使うときと同様に特定のmodelsをimportして使うことができる
from sample_app.models import CustomUser
user = CustomUser.objects.get(id=1)
print(user)
user_val = CustomUser.objects.values().get(id=3)
print(user_val)
views
特定のviewを実行するときはmiddlewareの処理を含めないものと含めるものがある.
どちらの方法でもDjangoのテスト用のモジュールを使用する.
RequestFactory(middlewareを含めない方法)
参考:テストに関する高度なトピック | Django ドキュメント | Django
requestオブジェクトを作成し,それを直接viewに入れる.middlewareでの処理結果が必要なときは手動で設定を行う(例:ログインユーザーの設定など).
requestオブジェクト作成時にget, postの引数にURLを指定しているが,URLのパース処理はされていないため,適当な文字列で問題ないと思われる.
from django.test import RequestFactory
from sample_app.models import CustomUser
from sample_app import views
factory = RequestFactory()
# getメソッド
request = factory.get("/inquiry/")
request.user = CustomUser.objects.get(id=1)
response = views.InquiryView.as_view()(request)
print(response)
# 生成されたHTMLの確認
print(response.rendered_content)
postメソッドの場合の例
# postメソッド
data = {
"title": "hoge",
"content": "hogehoge",
}
request = factory.post("/diary-update/1/", data=data)
user = CustomUser.objects.get(id=2)
request.user = user
# URLの引数は反映されないため,手動でpkなどの引数を指定する
response = views.DiaryUpdateView.as_view()(request, pk=1)
print(response)
テストクライアント(middlewareを含める方法)
参考:テストツール | Django ドキュメント | Django
seleniumと同様に実際にブラウザで実行するときと同じ手順で処理をする.
# ログイン
from django.test import Client
# これ以降はこのクライアントオブジェクトに対してリクエストを行う
c = Client()
# HTMLのname属性をkeyに指定
response = c.post("/accounts/login/", {"login": "hoge", "password": "hogehoge"})
print(response)
一覧取得
response = c.get("/diary-list/", query_params={"page":2})
print(response)
更新処理
data = {
"title": "hoge",
"content": "hogehoge",
}
response = c.post("/diary-update/1/", data)
print(response)
コメント