Django3にPanelで作ったアプリケーション埋め込む

Pythonで簡単にwebアプリケーションやダッシュボードの作成が行えるpanelライブラリ。

https://qiita.com/8_hisakichi_8/items/717b0c78c00a9de9bd5a

今回はpanelで作成したアプリケーションをDjango3で動かしてみたくなったので、公式のDocumentationを参考にやってみました.
公式の説明はDjango2を対象としていて,Django3で動かす場合は色々とつまずく点があったので備忘録として残します.

<hr>
<b>公式Documentation</b>

https://panel.holoviz.org/user_guide/Django_Apps.html

https://github.com/holoviz/panel/tree/master/examples/apps/django_multi_apps

### 完成図
-----------
以下のような感じでpanelで作成したデモアプリケーションをDjango上で表示します

![スクリーンショット 2022-07-23 12.05.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2744175/862babd1-8cef-1e34-b126-412c71ede2a8.png)


### 環境構築<hr>
pythonのバージョンは3.8.13を使用
その他ライブラリのバージョンは[panel/examples/apps/django_multi_apps/requirements.txt](https://github.com/holoviz/panel/blob/master/examples/apps/django_multi_apps/requirements.txt)を参考にしてください(バージョン依存が激しいので注意）


[github](https://github.com/holoviz/panel/tree/master/examples/apps/django_multi_apps)にDjangoの設定ファイル・HTMLテンプレートPanelのデモアプリケーションがあるので、このdjango_multi_appsフォルダをダウンロードし

```python:
cd django_multi_apps
python manage.py runserver
```
でDjangoのサービスを起動する.
するとおそらく下記のエラーが表示されると思います.

```python:
  File "/Users/junya/opt/miniconda3/envs/panelqiita/lib/python3.8/site-packages/django/apps/config.py", line 38, in __init__
    raise ImproperlyConfigured(
django.core.exceptions.ImproperlyConfigured: The app label 'bokeh.server.django' is not a valid Python identifier.
```

ググったところ,Django3でPanelを動かす場合にはDjango本体のコードを,下記のように一部書き換える必要があるとのことでした.

```python:
#miniconda3/envs/[仮想環境名]/lib/python3.8/site-packages/bokeh/server/django/apps.pyを書き換える

## 変更前
class DjangoBokehConfig(AppConfig):

    name = label = 'bokeh.server.django'

    _routes: Optional[RoutingConfiguration] = None

## 変更後
class DjangoBokehConfig(AppConfig):

    name = 'bokeh.server.django'
    label = 'bokeh_server_django'

    _routes: Optional[RoutingConfiguration] = None
```

これに伴ってdjango_multi_apps/urls.pyとrouting.pyも以下のように . を _ に変更する必要があります
```python
###django_multi_apps/urls.py 29行目
## 変更前
from .themes import plot_themes

pn_app_config = apps.get_app_config('bokeh.server.django')


## 変更後
from .themes import plot_themes

pn_app_config = apps.get_app_config('bokeh_server_django')
```

```python
###django_multi_apps/routing.py  5行目
## 変更前
bokeh_app_config = apps.get_app_config('bokeh.server.django')

## 変更後
bokeh_app_config = apps.get_app_config('bokeh_server_django')
```

公式のデモは基本的にDjango2を対象としているのでこんなことになっているようです。
変更後に再度Djangoを起動してみます

```python
You have 18 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.
Django version 3.2, using settings 'django_multi_apps.settings'
Starting ASGI/Channels version 2.4.0 development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
```

![スクリーンショット 2022-07-23 13.03.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2744175/1b937492-1621-2a5f-5dd4-6481c874ca1d.png)

今度は500エラーが返ってきました.migrateするよう警告が出ていたので,
```python
python manage.py migrate
```
でmigrateして再度起動してみます.
今度はpanelで作成したアプリケーションが表示されました.
デモアプリは３つとも上手く表示できているようです.

![スクリーンショット 2022-07-23 13.08.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2744175/29d6cc08-7088-f484-094b-1f534b1043f5.png)

![スクリーンショット 2022-07-23 13.09.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2744175/5133e139-dc3c-ecc3-8ab8-452243b238ab.png)

![スクリーンショット 2022-07-23 13.10.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2744175/f2ffbf4a-9c06-4388-d190-225c64126168.png)


なんとかDjango3でpanelを動かすことができましたがライブラリの依存関係がかなり厳しいので実用は難しいかもしれません...
誰かのお役に立てば幸いです