DjangoをJupyterLab上で実行

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)

コメント

タイトルとURLをコピーしました