Pythonでチャットボット(chatbot):DjangoでHerokuにアップ(前編)

前回の続きになります。前回の記事はこちら。

「パターン3.Web上でボットとチャットする(Pythonパッケージで作成)」を作ってみます。

なお、前回までの記事で説明済みの内容については繰り返し書くことはしませんので、プログラミング初心者の方は最初から読むことをお勧めします。

まず、Web上で動かすための前提知識についていくつか説明します。

前提知識 ~ クラウドサーバー

昔はWebアプリケーションというと、自社内にWebサーバーとDBサーバーをたてて社内イントラネットで構築するやり方が普通でした。最近は、クラウドが浸透してきていて、検討候補にクラウドサーバーを考えるのが普通になっています。クラウドのサービス形態として、基盤のみ提供するIaas、ミドルウェアあたりまで提供するPaas、アプリケーションまで提供するSaasと3タイプに分類できます。

有名なクラウドサーバーというとアマゾンのAWSや、GoogleのGCP、MS社のMicrosoft Azureなどがありますが、個人が無料でクレジットカード登録なしで始められるものとしてHerokuやPythonanywhereがあります(2021年4月現在)。どちらもPaasですので、開発者はアプリケーション開発に集中することができます。

今回は、Herokuを利用してWebアプリケーションを作ってみます。

前提知識 ~ Herokuとは

Herokuは、2021年現在、セールスフォース・ドットコム社が提供しているPaasサービスになります。

Web上にアプリケーションを配置できれば、誰でも、どの機器からもそのサービスを使える、といった利点があります。ユーザー登録などが面倒という場合は、自分のPCだけでもWebアプリケーションの稼働確認はできるので、この内容は読み飛ばしてください。

まず、herokuのユーザー登録をHerokuのサインアップから行います。将来的にも遊びで使うだけであれば、登録内容は正確である必要はありません。つまり、個人情報を入力する必要はありません。セールスフォース・ドットコム社は世界的にも有名なSaasサービスの会社なのでセキュリティは安心して大丈夫とは思いますが。「一次開発言語」の選択はPythonでお願いします。

次に、gitとHerokuCLIをインストール・設定します。詳しくは、Heroku Dev CenterのWebサイトの手順を確認下さい。

基本的な概念として「ローカル」と「リモート」があります。「ローカル」は自分のPCを指し「リモート」はクラウドサーバーを指します。

常に「リモート」でやれるとよいのですが、実際の開発はトライ&エラーの繰り返しで、コーディング~テストを繰り返してやっていきます。その際、(今回は一人ですが、)チームで開発すると他の人が作った開発資源と不整合が生じたり、そもそもサーバーに開発資源を反映するのに時間がかかる、といった問題があります。そのため、サクサク開発するために、自分のPCでコーディング~テストを繰り返して、きりのよいところまで出来上がったらサーバーに開発資源を挙げるという手順を取ります。gitとHerokuCLIはそのための補助ツールとしての役割を担います。

HerokuCLIはHeroku専用のツールですが、gitは世の中でかなり流行っているバージョン管理ツールになります。Githubは有名ですね。

前提知識 ~ Herokuの基本的な使い方

ユーザー登録ができると、Herokuログイン画面から、Herokuサーバーにアクセスできます。また、コマンドプロンプトでherokuのコマンドも使えるようになっているはずです。ローカルの開発資源をリモートに反映すると、その状況はログとして出力されますが、それは上記のどちらからでも確認できます。

開発資源の反映方法ですが、gitを使ったことがあるなら、ほとんど操作は同じです。まず、コマンドプロンプトを立ち上げ、ローカルの開発資源のフォルダまでcdコマンドで移動します。その後、以下の手順で開発資源をリモート環境に反映します。

// gitの初期ファイルを作成
git init

// ローカルリポジトリに結びつくリモートリポジトリを設定
heroku git:remote -a (アプリ名)

// 変更したファイルをインデックスに登録
git add .

// 変更したファイルをローカルリポジトリに書き込む("inital commit"はコメントなのでなんでも良い)
git commit -m "inital commit"

// herokuにローカルで作成したファイルを反映(push)
git push heroku main

最初の2ステップは一度限りの設定ですので、2回目以降のリモート反映は以下の操作をひたすら繰り返します。

// 変更したファイルをインデックスに登録
git add .
// 変更したファイルをローカルリポジトリに書き込む("inital commit"はコメントなのでなんでも良い)
git commit -m "inital commit"
// herokuにローカルで作成したファイルを反映(push)
git push heroku main

リモート反映した開発資源に対して「https:// (アプリ名).herokuapp.com/〇〇〇〇」のURLでブラウザからアクセスします。〇〇〇〇の部分はアプリケーションの作り方次第で変わります。なくても動くようにもできます。

また、ローカルPCでの動作確認についてです。

Heroku Dev CenterのWebサイトの手順通り行っていれば、「heroku local web」コマンドで、ローカルPCの動作確認ができます。

私はローカルPCの動作確認で「heroku local web」を実行時、ModuleNotFoundError: No module named ‘fcntl’のエラーが発生したことがあります。このパッケージはWindowsでは動作しないようです。

代替手段として、python は標準で簡易サーバーを持っており、「python manage.py runserver」と入力することでサーバーが上がります。

もう一つの手段として、waitress(Pythonで実装されたマルチスレッドかつ非同期処理実装のWebサーバ)をインストールして対応するやり方もあります。(pip install waitress)

「heroku local web」を実行する代わりに、waitress-serve –port=5000 gettingstarted.wsgi:application のように実行してサーバーを立ち上げます。

前提知識 ~ Django

DjangoはPythonで実装されたWebアプリケーションフレームワークです。フレームワークを利用することで一から開発するよりも効率的に保守性の高い開発が行なえます。

「pip install Django」でDjangoをインストールできます。

主要なコマンドをいくつか紹介します。

プロジェクトの開始(自動的に複数ファイルが生成されます)(chatbot_projectのところは自由なフォルダ名を指定して下さい。)
  django-admin startproject chatbot_project

アプリケーションの追加(自動的に複数ファイルが生成されます) (chatbot1のところは自由なフォルダ名を指定して下さい。)
  python manage.py startapp chatbot1

上記の2つのコマンドを実行すると以下のようなフォルダ・ファイル構成になります。

tree C:\github\chatbot /f
C:\GITHUB\CHATBOT
└─chatbot_project
    │  manage.py
    │
    ├─chatbot1
    │  │  admin.py
    │  │  apps.py
    │  │  models.py
    │  │  tests.py
    │  │  views.py
    │  │  __init__.py
    │  │
    │  └─migrations
    │          __init__.py
    │
    └─chatbot_project
        │  asgi.py
        │  settings.py
        │  urls.py
        │  wsgi.py
        │  __init__.py
        │
        └─__pycache__
                settings.cpython-38.pyc
                __init__.cpython-38.pyc

以下のコマンドは開発の際、頻繁に実行します。

サーバー起動(デフォルトでは runserver コマンドは内部 IP のポート 8000 で起動します。つまり、URLを「http://127.0.0.1:8000/」と指定します。)
  python manage.py runserver

staticファイルをルートのstaticfilesに集約(コピーする)
  python manage.py collectstatic –noinput

Djangoを使うためには、ファイル同士がどう連結していて、どう呼び出されているのかを理解するのことが大切です。特に、プロジェクト本体のファイルとアプリケーションのファイル名が同じだったりするので、最初は少し混乱するかもしれません。

PythonとDjangoアプリをHerokuにデプロイする手順についてはherokuのサイトにもまとまっています。

~~ 長くなってきたので、ここで区切ります。後半に続きます。~~

後半はこちら。

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