Django

【Django】自作のPythonプログラムを実行してHTML上に表示させる方法

Djangoのページ表示の仕組み

今回はDjangoで自分の作ったプログラムを実行し、その結果をHTMLに表示させられるようにする。

Djangoでは下記画像の流れでページが生成され、表示される。

ページ作成のメイン部分はviews.pyで担っているため、
views.pyに自作のプログラムの値を渡すように設定すればよい。

実行したいPythonファイルの作成

プログラム設置用のディレクトリを作成

Djangoで実行したいPythonファイルを作成する。
今回Pythonファイルの設置場所はアプリである「ohlcv」ディレクトリの中に
「application」というディレクトリを作成してその中に作ることとする。

フォルダ構成
gmo_ohlcv
│  db.sqlite3
│  manage.py
│
├─.devcontainer
│      devcontainer.json
│      docker-compose.yml
│      Dockerfile
│      requirements.txt
│
├─config
│  │  asgi.py
│  │  settings.py
│  │  urls.py
│  │  wsgi.py
│  │  __init__.py
│  │
│  └─__pycache__
│        いろんなpyc
│
├─ohlcv
│  │  admin.py
│  │  apps.py
│  │  models.py
│  │  tests.py
│  │  urls.py
│  │  views.py
│  │  __init__.py
│  │
│  ├─application
│  │   getohlcv.py
│  │
│  ├─migrations
│  │  │  __init__.py
│  │  │
│  │  └─__pycache__
│  │        いろんなpyc
│  │
│  └─__pycache__
│          いろんなpyc
│
└─Templates
        base.html
        home.html

今回は以前に書いたWEBアプリ作成フローの記事が終わった時点でのフォルダを使用している。

【Python×Django×Docker×VScode】WEBアプリ作成フロー 1.コンテナ立ち上げ用ファイルを編集 前提 今回はVScodeのRemote-Containersの機能とDockerを使...

実行したいプログラムを作成

今回は下記のような簡単なプログラムを用意した。

def sum():
    a = 10
    b = 20
    x = a + b
    return x

if __name__ == "__main__":
    sum()

必要なモジュールはターミナルで新しくインストールする。

コンテナを再度作り直す可能性があるため、インストールしたモジュールは
「requirements.txt」にも追記しておく。

実装

views.pyの編集

プログラムが作れたら、次にviews.pyに作成したプログラムの実行結果を表示させる処理を行う。

  1. 「from .application import sample」でプログラムを読み込む
  2. 「def get_context_data(self, **kwargs):」でcontextデータに
    「sample.sum()」の実行結果を追記する
from django.shortcuts import render

from django.views.generic import TemplateView
from requests import request
from .application import sample # 追加

class HomeView(TemplateView):
    template_name = 'home.html'
    
    def get_context_data(self, **kwargs): # 追加
        x = sample.sum()
        context = super().get_context_data(**kwargs)
        context['sum'] = x
        return context

Djangoは辞書型のcontextというデータをバックエンドに投げているため、
ページで表示させるためにはcontextのデータに追記していけばOK

クラスベースのViewを使用している場合、ベースとなっているClassが認識していないコードを記載しても実行されない。

class HomeView(TemplateView):
    template_name = 'home.html'
    print("このprintは実行されない")

home.htmlの編集

最後にページに実行結果が表示されるように編集する。

views.pyでの「def get_context_data(self, **kwargs):」の中で
context[‘sum’] = x と記載することにより
htmlファイル側で「{{ sum }}」と記載すれば「x」の値が表示されるようになる。

そのことを踏まえてhtmlファイルを編集する。

{% extends "base.html" %}
{% block content %}
<h1>Hello!</h1>
<p>合計:{{ sum }}</p>
{% endblock %}

実際にページを表示してみる

python3 manage.py runserver

でサーバー起動

ブラウザで「http://127.0.0.1:8000/home/」に接続。

上記画像のような画面がでればOK