Flask

初心者のためのFlaskアプリ開発④ FlaskアプリをHerokuにデプロイ!

前回の更新から二週間以上空けてしまったが、久々にブログを更新する。
この二週間は開発に専念していたので、かなりPythonとDjangoあたりのことを勉強した。
振り返りも兼ねて記事にしていこうと思う。

さて、今回は初心者のためのFlaskアプリ開発③ Flaskのテンプレートビューを使って画面に実行結果を表示させるの続き。
いよいよheroku上にデプロイして見ようと思う。
herokuが何かについては気が向いたら別の記事にまとめる。

本記事の構成

この記事の構成は以下の通り。

  1. herokuに登録
  2. ターミナルでherokuにログイン
  3. 必要なモジュールのインポート
  4. 必要なファイルの生成
  5. デプロイ!
  6. つまづきやすいポイントと解決法

herokuに登録

まずはherokuにアカウントを作り、herokuCLIをインストールする必要がある。
herokuのアカウント作成は公式ページから行う。

heroku公式ページ

基本的には案内に沿って登録するだけなのでつまづくことは少ないと思うので詳細は割愛。
ただページが英語なので、英語に苦手意識があると苦労するかも。

herokuのアカウントを作成したら、herokuのCLI(コマンド・ライン・インターフェース)をインストールする。
こちらも基本的には画面に沿って進めていくだけなので割愛。

一応参考としてドットインストールのリンクを載せておく。
herokuに代表されるPaaSとは何かについてもわかりやすくまとめられてるのでおすすめ。
使っているのはRubyとRailsだが、この動画でアカウント作成からCLIのインストールまで紹介されている。

ドットインストール:heroku入門

ターミナルでherokuにログイン

herokuの準備が整ったら、いよいよデプロイを進めていく。
まずは開発用の仮想環境を立ち上げて、アプリのルートディレクトリに移動する。

仮想環境の立ち上げや、今回デプロイするアプリケーションについては、これまでの記事を参照。

初心者のためのFlaskアプリ開発② FlaskでHelloWorldアプリをつくる
初心者のためのFlaskアプリ開発③ Flaskのテンプレートビューを使って画面に実行結果を表示させる

まずはターミナルからherokuにログインする。

  $ heroku login

メールアドレスとパスワードを入力し、"Logged in as メールアドレス"と表示されれば成功。

必要なモジュールのインポート

herokuにデプロイするためには、追加でgunicornというモジュールが必要になる。
インストールのためには以下のコマンドを入力。

  $ pip install gunicorn

gunicornとは、UNIX用のPython WSGI HTTPサーバーである。
flaskのローカルで動かしていた開発用HTTPサーバーは、残念ながら本番環境では使えないのでこちらをインストールする必要がある。
参考:Gunicorn公式ドキュメント

必要なファイルの生成

次は必要なファイルを生成する。
herokuへのデプロイのためには、初心者のためのFlaskアプリ開発③ Flaskのテンプレートビューを使って画面に実行結果を表示させるで作ったファイルにいくつか追加する必要がある。

必要なファイルは、以下の3つ。
・requirements.txt
・Procfile
・runtime.txt

①requirements.txt
開発環境で使用しているモジュールをherokuに伝えるためのファイル。
作成は簡単。
次のコマンドを打ち込むだけ。

  $ pip freeze > requirements.txt

ちなみに今回のアプリのrequirements.txtはこんな感じ。
デプロイの際、何かエラーが起きた場合は、これらのモジュールがちゃんと反映されているか、バージョンは問題ないか確認してみるといいかも。

  beautifulsoup4==4.6.3
  bs4==0.0.1
  certifi==2018.8.13
  chardet==3.0.4
  click==6.7
  Flask==1.0.2
  gunicorn==19.9.0
  idna==2.7
  itsdangerous==0.24
  Jinja2==2.10
  MarkupSafe==1.0
  requests==2.19.1
  urllib3==1.23
  Werkzeug==0.14.1

②Procfile
Procfileは、アプリケーションのdynosがHerokuプラットフォーム上で実行するコマンドを宣言するためのメカニズム。
このファイルは、アプリケーションのルートディレクトリに配置する必要がある。
サブディレクトリに置かれても機能はしない。
参考:Heroku公式ドキュメント The Procfile

今回であれば、gunicornを使用することをherokuに宣言してあげる必要がある。
Procfileという名前のファイルを作成し、次の一文を追加する。

  web: gunicorn app:app

ちなみに、今回はapp.pyに接続するため、"app:app"としていることに注意。

③runtime.txt
こちらは使っているpythonのバージョンをherokuに伝えるためのファイル。
自分のバージョンは"python -V"で確認できる。

今回は以下の一文を追加。

  python-3.6.5

こちらのファイルだが、一行目を改行していたり空白があるとエラーが出るそう。
一度確認してみると良いかもしれない。

デプロイ!

さて、一通り準備ができたのであとはデプロイしていくだけ。
とはいえここが一番つまづきやすいポイント。
丁寧に進めていく。
デプロイの流れとしては、gitリポジトリを作成し、それをherokuに送るというもの。

まずはherokuのアプリケーションを作る。

  $ heroku create hatena-nav

アプリケーション名は自由なので適宜変更すること。
こんな表示になれば成功。

  Creating ⬢ hatebu-nav... done
  https://hatebu-nav.herokuapp.com/ | https://git.heroku.com/hatebu-nav.git

次はgitリポジトリの生成。
以下のコマンドを順番に打ち込む。

  $ git init
  $ git config user.name "名前"
  $ git config user.email メールアドレス
  $ git add -A .
  $ git commit -m 'myapp'

ここで注意が必要なのはgit configの部分。
ここは書いてない参考記事が多く、私自身がデプロイでハマってしまった。
gitを初めて触る人間としては、gitのリモートリポジトリの生成一つとってもハマりどころだらけだった。
gitに関してもそのうち勉強したことを記事にする。

最後はherokuにpushする。

  $ git push heroku master

方法はこのコマンドを打ち込むだけだが、一体幾度このプロセスのエラーに阻まれたことか…。
次のような表示になれば成功。

  remote: Verifying deploy... done.
  To https://git.heroku.com/hatebu-nav.git
   * [new branch]      master -> master

私は完全に独学なので、このデプロイでハマったときには本当に困った。
誰か聞ける相手が必要だと思った。
もし私と同じように独学でデプロイにつまづいてしまった人は、諦める前にぜひこのブログにコメントをしてほしい。
何かアドバイスができるかもしれない。

  $ heroku open

デプロイに成功したらこのコマンドを打ち込むだけでブラウザが開く。
こんなページが完成した。

まとめとエラー事例集

今回主に参考にしたのはこちらのドキュメント。
Flaskドキュメント:Deployment Options
とはいえこれだけではエラーだらけでうまくデプロイできなかった。

メモ書きとしてエラーの事例を残しておく。

・No default language could be detected for this app
単純にrequirements.txtのスペルを間違えていた。
ファイル名を修正したら解消。

・gitのリモートリポジトリと接続できないエラー
以前に作成したリポジトリの設定と衝突していた模様。

  $ heroku apps:destroy --app アプリ名 --confirm アプリ名

でアプリと設定を削除してから再度createしたら解消した。
参考:【herokuコマンド】createからdestroyまで

・gunicornが動かない
Procfileの"○○:app"を自分のアプリの名前に変えたら解決。

POSTED COMMENT

  1. ねぎま より:

    大変わかりやすいまとめでありがとうございました。

  2. ねぎま より:

    大変わかりやすい記事をありがとうございました。
    (サイトURLミスしていたので念の為再送いたします)

  3. SR より:

    はじめましてSRと申します。
    herokuでbottleを使ったwebアプリを作ったところうまくいかず悩んでおります。

    サンプルコードはここにあり、これをそのままデプロイしようとしました。
    https://book.impress.co.jp/books/1116101151

    なおローカル環境では動作します。

    ちなみにデプロイについてはここを参考にしています。
    https://qiita.com/ohbarye/items/55ec574f10685a012baf

  4. SR より:

    連投になってしまい申し訳ございません。エラーログはteratailに記載されているのでよければ参考にしていただければと思います。
    https://teratail.com/questions/148745

    pybot.py直後にcrashしているのでもしかしたらサンプルコードそのものにおかしなところがあるのかもしれません。

    また、bottleとflaskでフレームワークが違うのですが、当記事のやり方も参考にしましたが、git push heroku masterをたたいた後に
    fatal: ‘heroku’ does not appear to be a git repository
    fatal: Could not read from remote repository.

    とエラーが出てしまいます。
    もし何かわかることがあればご教示いただけると幸いです。

    • Kashiwaba Yuki より:

      コメントありがとうございます。

      現状では原因は特定しかねるので、一つ一つ試していくのが良いと思います。

      ・git configのusernameとemailは設定済みでしょうか?
      ・Procfileとrequirementsにタイプミスや余計な空白は無いでしょうか?
      ・git initを何度も行ってはいないでしょうか?

      以上の点を確認いただければと思います。
      解決までお手伝いいたしますので、ぜひ遠慮なくコメントをくださればと思います。

  5. SR より:

    お返事ありがとうございます。
    ご指摘いただいたところは特にミスしていないと思います。ただフレームワークがbottleなこともあり、下のサイトを参考にしてデプロイしておりました。
    https://qiita.com/ohbarye/items/55ec574f10685a012baf

    ただ、このサイトの通りにやるとデプロイはできてもURLを入力すると
    Application error
    An error occurred in the application -(中略)- Heroku CLI with the command
    heroku logs –tail

    というエラーが画面が出てしまい、公開できなかったためいろいろなサイトを調べてここにたどり着きました。
    ただこのサイトのこの記事の通りにデプロイを行うとデプロイまで出来ないのですが、それも含めて1つずつコマンドを書いて結果をコメントに記載していこうと思います。
    もしよければご指摘をいただければと思います。

    • Kashiwaba Yuki より:

      デプロイができてアプリケーションエラーになるのであれば、

      ・ディレクトリ構成
      ・ソースコード
      ・参照ファイルのパス

      が間違っている可能性もあります。
      ローカルで動いているということなので、コードは問題ないかと思いますが。

      コマンド記載の件承知しました。
      よろしくお願いいたします。

  6. SR より:

    C:\Users\ユーザー名\Desktop\pythonlesson>pip install gunicorn
    Requirement already satisfied: gunicorn in c:\users\ユーザー名\appdata\local\pr
    ograms\python\python37-32\lib\site-packages (19.9.0)

    C:\Users\ユーザー名\Desktop\pythonlesson>pip freeze > requirements.txt

    C:\Users\ユーザー名\Desktop\pythonlesson>web: gunicorn app:pybot
    ‘web:’ は、内部コマンドまたは外部コマンド、
    操作可能なプログラムまたはバッチ ファイルとして認識されていません。

    エラーがでたのでwebの前にechoと入力したところこれでよいかは分かりませんがこのようになりました。
    C:\Users\ユーザー名\Desktop\pythonlesson>echo web: gunicorn app:pybot
    web: gunicorn app:pybot

    C:\Users\YOSHIHIRO_2\Desktop\pythonlesson>

    コマンドプロンプトからruntime.txtを作る方法はよくわからなかったので、フォルダ内右クリックから新規作成でtxtファイルを作利ました。そのあとpython-3.7.0と記載しました。

    • SR より:

      C:\Users\ユーザー名\Desktop\pythonlesson>git add -A .
      warning: LF will be replaced by CRLF in README.md.
      The file will have its original line endings in your working directory
      warning: LF will be replaced by CRLF in pybot.py.
      The file will have its original line endings in your working directory
      warning: LF will be replaced by CRLF in pybot.txt.
      The file will have its original line endings in your working directory
      warning: LF will be replaced by CRLF in pybot_datetime.py.
      The file will have its original line endings in your working directory
      warning: LF will be replaced by CRLF in pybot_eto.py.
      The file will have its original line endings in your working directory
      warning: LF will be replaced by CRLF in pybot_random.py.
      The file will have its original line endings in your working directory
      warning: LF will be replaced by CRLF in pybot_weather.py.
      The file will have its original line endings in your working directory
      warning: LF will be replaced by CRLF in pybot_wikipedia.py.
      The file will have its original line endings in your working directory
      warning: LF will be replaced by CRLF in pybotweb.py.
      The file will have its original line endings in your working directory
      warning: LF will be replaced by CRLF in views/pybot_template.tpl.
      The file will have its original line endings in your working directory

    • SR より:

      C:\Users\ユーザー名\Desktop\pythonlesson>git commit -m ‘myapp’
      [master (root-commit) c0107c5] ‘myapp’
      12 files changed, 218 insertions(+)
      create mode 100644 README.md
      create mode 100644 pybot.py
      create mode 100644 pybot.txt
      create mode 100644 pybot_datetime.py
      create mode 100644 pybot_eto.py
      create mode 100644 pybot_random.py
      create mode 100644 pybot_weather.py
      create mode 100644 pybot_wikipedia.py
      create mode 100644 pybotweb.py
      create mode 100644 requirements.txt
      create mode 100644 runtime.txt
      create mode 100644 views/pybot_template.tpl

      C:\Users\ユーザー名\Desktop\pythonlesson>git push heroku master
      fatal: ‘heroku’ does not appear to be a git repository
      fatal: Could not read from remote repository.

      Please make sure you have the correct access rights
      and the repository exists.

      以上です。
      GitHubにコードを公開しようかとも思いましたが本のコードをそのまま書いているだけなのでとりあえず保留にしています。
      必要ならばサンプルコードのURLもしくはGitHubに公開いたします。

    • Kashiwaba Yuki より:

      なるほど!
      もしかしたら現在Procfileをご用意されていないか、記載が間違っている可能性があります。
      ルートディレクトリに、Procfileという名前のファイルを作り、そこにweb: gunicorn app:pybot と一行書き込んでみてください。
      もちろんgunicornのインストールとrequirementsへのfreezeも忘れずにお願いします。

      • SR より:

        お返事ありがとうございます!!!

        Procfile作成の方法なのですが以前は以下のコマンドで作成していました。
        echo web: python pybot.py > Procfile

        今回もそのようにしてその後
        web: gunicorn app:app

        というコマンドを入力すればよいでしょうか?

        それともたとえばtxtファイルでProcfileを作成し、web: gunicorn pybot:appとtxt内に直接記載。
        そのあとに拡張子を.txtの部分だけ名前を消す、というような方法でしょうか?

        本当に初心者なもので分からないことが多いため申し訳ありません。

        • Kashiwaba Yuki より:

          echoコマンドは、ファイルにテキストを書き込むコマンドで、
          echo 〇〇 > Procfile
          で〇〇というテキストをProcfileというファイルに書き込みます。

          Procfileは拡張子なしで大丈夫なので、そのままProcfileという名前のファイルを作成して手入力しても大丈夫です。

          web: gunicorn app:appはコマンドではないのでコンソールでの入力は不要です。

          SRさんの場合は、
          web: gunicorn app:pybot
          と記載すれば動くのではないかと思います。

          もしうまく行かなければ、明日僕の環境で同じコードをデプロイしてみて、その方法をお教えしますね!

          • SR より:

            たびたびお世話になっております。
            ご指摘の通りやってみましたがどうしてもうまくいかず・・・。
            デプロイの方法をご教示いただけると幸いです・・・。

            サンプルコードはこちら。
            https://book.impress.co.jp/books/1116101151

            この中の
            500208_yasashiipython→Chapter9→lesson60
            フォルダが完成品ですのでこれを取り出していただければ問題ないはずです。

            ローカル環境で動作させるために、私は
            ①pip install requests
            ②pip install bottle
            ③pip install wikipedia
            ④python pybotweb.py
            とコマンドプロンプトで打ち込みその後
            http://localhost:8080/hello

            でローカル環境では動作することを確認いたしました。
            それでは何卒よろしくお願い申し上げます。

          • Kashiwaba Yuki より:

            コメントありがとうございます。
            ただいまこちらの環境でデプロイに成功しましたので、詳細を記事にして公開しようと思います。
            少々お待ちくださいませ。

          • Kashiwaba Yuki より:

            こちらの記事にデプロイの方法をまとめました。
            https://yukituna.com/1299/

            ちなみにどこでエラーになっていたかも判明したら、後ほどお教えいただければと思います。

  7. SR より:

    C:\Users\ユーザー名\Desktop\pythonlesson>git init
    Initialized empty Git repository in C:/Users/YOSHIHIRO_2/Desktop/pythonlesson/.g
    it/

    C:\Users\ユーザー名\Desktop\pythonlesson>git config user.name
    sr2460

    C:\Users\ユーザー名\Desktop\pythonlesson>git config user.email
    shiningrosd2460@gmail.com

  8. SR より:

    お世話になっております!!!
    たった今書いていただいたデプロイ方法を参考にいたしましてデプロイに成功いたしました。
    https://sheltered-badlands-15046.herokuapp.com/hello

    いちばんやさしいPythonの教本にはデプロイの方法については全く掲載されていなかったため、

    import os //一行目に追加
    #run(host=’localhost’, port=8080, debug=True) //これをコメントアウトさせる
    run(host=”0.0.0.0″, port=int(os.environ.get(“PORT”, 5000))) //最終行に追加

    の知識が無くデプロイしてもファイルがクラッシュしていたのだと思われます。
    また> echo web: python pybotweb.py > Procfileを
    > echo web: python pybot.py > Procfile
    としていたのもエラーの原因だったかもしれないと考えております。

    エラーと一言でいうのも難しい上文字数も膨大になりそうので、私のブログに今回の顛末を掲載し、URLを教えますのでそれを見ていただく形でもよろしいでしょうか?

    • SR より:

      お世話様です。先ほどqiitaに私がデプロイをした際に起きたことなどについてまとめさせていただきました。
      https://qiita.com/sr2460/items/9f65474a63cfb0a2e407

      エラーという意味ではデプロイは出来ているがファイルがクラッシュしていたということが多かったため、サンプルコードの書き換え知識がなかったことが一番の原因だったと思っております。

      また、
      サンプルコードをなぜこのように書き換えるのか?
      Procfileはなぜpybotwebに書き換えるのか?
      ということについて私はまだ理解できておりません。
      また、
      フレームワークDjangoを使ってweb上に成果物を公開することを目標にしております。(Django事態はpyqを使ってある程度は勉強しました)

      もしよろしければで構いませんのでここからどのような書籍等々で勉強すれば良いか、ご教示いただけると幸いです。

      今回は本当にありがとうございました。
      本当に感謝しております。

      • Kashiwaba Yuki より:

        コメントありがとうございます。
        微力ながらお力になれたこと、非常に嬉しく思います!

        僕自身不勉強なもので、誤ったことを教えないために関連する事柄をお伝えするだけにとどめますが、疑問点に回答させていただきます

        ・サンプルコードをなぜこのように書き換えるのか?
        BottleはIPアドレスとポート番号を引数に要求する、runメソッドを使ってサーバーを立ち上げているためかと思います。
        WSGIサーバーは、Djangoでも設定する必要がありますので調べてみるといいかと思います。

        ・Procfileはなぜpybotwebに書き換えるのか?
        pybotweb.pyにルーティングが書かれていたためです。
        WEBアプリケーションフレームワークのMVC(MTV)モデルは、ざっくり理解しておくとDjangoの学習がスムーズになるかと思います。

        ・勉強法について
        残念ながら、Djangoの関連書籍はRailsほど多くはなく、体系的な情報は少ないです。
        以下、僕が初めてDjnagoアプリケーションを公開した時に使用した教材です。

        ・Djangoチュートリアル(https://docs.djangoproject.com/ja/2.1/intro/tutorial01/)
        ・DjangoGirlsチュートリアル(https://tutorial.djangogirls.org/ja/)
        ・Djangoドキュメント(https://docs.djangoproject.com/ja/2.1/)
        ・Udemy(https://www.udemy.com/)
        ・ブログなど

        特にUdemyのこの講義が非常におすすめです。(https://www.udemy.com/pythondjango-a/learn/v4/content)
        また、この講義の講師のnaritoさんのブログ(https://torina.top/)もよく参考にしています。

        僕と同じく独学で学ばれているということで、大変かとは思いますがお互いがんばりましょう!
        また何か困ったことがありましたらぜひお声がけくださいませ。

        • SR より:

          ご返答ありがとうございます!!
          WSGIサーバーについてはプログラミングコードのことばかり勉強しており、まったく手を付けていない分野ですので調べてみます!
          WEBアプリケーションフレームワークのMVC(MTV)モデルに関しても同様だと思いますのでまず自分で調べてみます。

          Djnagoアプリケーションに関してもおすすめされたものをすべて目を通りしてチェックしてみます。

          年齢的に非常に厳しいのですがなにかwebに制作物公開をしてそれをもとにどこか会社にに入り込めないかと思っております。
          また困ったことがあればぜひ相談させてください。
          今回は本当にどうもありがとうございます!

  9. SR より:

    お世話になります。
    以前デプロイについていろいろ相談させていただきました。
    あの後アドバイス通りUdemy等の講座を受講いたしまして、Djangoチュートリアルのpollsアプリを改造し、アンケートサイトを自作いたしました。
    これもあの時いただいた的確なアドバイスのがあったからです。
    本当にありがとうございます!!
    サイトの更新についてはまだ悩んでいるところもあり、もしよければまた相談させていただけたら嬉しいです。
    ほんとうにありがとうございました!

    • Kashiwaba Yuki より:

      お久しぶりです!
      コメントありがとうございます。
      微力ながら助けになれたようで何よりです。

      着実にスキルアップされているようで、僕も励みになります。
      ぜひまた力になれることがあればお手伝いいたしますので、お気軽にお声がけください!

  10. ASD より:

    はじめまして。
    ブログを拝見し、学習させていただきました。

    私もエラーが発生し、Herokuへアップできないので質問させてください。

    コードは写経しています。ファイル名はスペルチェック確認しました。
    ヴァージョンは最新版にアップデートした状態での実行です。

    1)git push heroku master
    =>App not compatible with buildpack: と表示されるので、
    ターミナルから直接設定しました。
    2)$ heroku buildpacks:set heroku/python
    =>Error: The buildpack heroku/python is already set on your app.(設定の確認)
    3)再度、git push heroku master を実行
    =>App not compatible with buildpack:のエラーが出てしまい、進展しません。

    エラーの原因・ヒントがわかれば教えてください。

    • Kashiwaba Yuki より:

      コメントありがとうございます。
      Herokuの言語設定がPythonになっていないようですね・・・。

      HerokuのSettingから見られるこちらを確認されたということでよろしかったでしょうか?
      (コメントに画像を貼るためTwitterに上げてます。)

      もしHerokuの設定が正しいとすると、原因はruntime.txt、あるいはrequirements.txtの記述かもしれませんね。
      Pythonのバージョンが合っているか、必要なモジュールが書かれているか一度確認してみてください!

  11. ASD より:

    返信ありがとうございます!

    確認したところInfoのFramework部分は No framework detected の状態でした。
    (おそらく何も設定されていない状態?)

    Herokuの公式HPも一通り目を通しましたが、Info内容の変更は記述がありませんでした。(アップロードする地域の設定くらいでした)

    設定方法を検索しているのですが、解決しそうな方法が見当たりません…。

    • Kashiwaba Yuki より:

      なるほど!
      それが原因っぽいですね。

      infoの部分は通常デプロイした際に自動で設定されます。
      “Heroku automatically recognizes your app as a Python app if it includes a requirements.txt or setup.py file in its root directory.”
      引用:Heroku Python Support

      runtime.txt、あるいはrequirements.txtが原因だと思うのですがどうでしょう?
      ディレクトリ構成と、runtime.txt・requirements.txtの記述を確認できれば原因がわかるかもしれません。

      • ASD より:

        ◯ディレクトリ構成は以下です。

        Flask challenge
        |—FlaskAppDir—|— __init__.py
        |—Procifile |— app.py

        |—runtime.txt |— requirements.txt
        |—templates—|
        |—index.html
        |—layout.html

        もし、実際のファイル確認が必要でしたら、Twitterアカウント宛に添付させていただきます。

        ◯runtime.txtは、python-3.7.2の記述です(余白なし)

        ◯requirements.txtの中身は以下です。(アナコンダで取り組んでいるので長文になります…。すみません)
        labaster==0.7.12
        anaconda-client==1.7.2
        anaconda-navigator==1.9.6
        anaconda-project==0.8.2
        appnope==0.1.0
        appscript==1.0.1
        asn1crypto==0.24.0
        astroid==2.1.0
        astropy==3.1.1
        atomicwrites==1.2.1
        attrs==18.2.0
        Babel==2.6.0
        backcall==0.1.0
        backports.os==0.1.1
        backports.shutil-get-terminal-size==1.0.0
        beautifulsoup4==4.6.3
        bitarray==0.8.3
        bkcharts==0.2
        blaze==0.11.3
        bleach==3.0.2
        bokeh==1.0.3
        boto==2.49.0
        Bottleneck==1.2.1
        certifi==2018.11.29
        cffi==1.11.5
        chardet==3.0.4
        Click==7.0
        cloudpickle==0.6.1
        clyent==1.2.2
        colorama==0.4.1
        conda==4.5.12
        conda-build==3.17.6
        conda-verify==3.1.1
        contextlib2==0.5.5
        cryptography==2.4.2
        cycler==0.10.0
        Cython==0.29.2
        cytoolz==0.9.0.1
        dask==1.0.0
        datashape==0.5.4
        decorator==4.3.0
        defusedxml==0.5.0
        distributed==1.25.1
        docutils==0.14
        entrypoints==0.2.3
        et-xmlfile==1.0.1
        fastcache==1.0.2
        filelock==3.0.10
        Flask==1.0.2
        Flask-Cors==3.0.7
        future==0.17.1
        gevent==1.3.7
        glob2==0.6
        gmpy2==2.0.8
        greenlet==0.4.15
        h5py==2.8.0
        heapdict==1.0.0
        html5lib==1.0.1
        idna==2.8
        imageio==2.4.1
        imagesize==1.1.0
        importlib-metadata==0.6
        ipykernel==5.1.0
        ipython==7.2.0
        ipython-genutils==0.2.0
        ipywidgets==7.4.2
        isort==4.3.4
        itsdangerous==1.1.0
        jdcal==1.4
        jedi==0.13.2
        Jinja2==2.10
        jsonschema==2.6.0
        jupyter==1.0.0
        jupyter-client==5.2.4
        jupyter-console==6.0.0
        jupyter-core==4.4.0
        jupyterlab==0.35.3
        jupyterlab-launcher==0.13.1
        jupyterlab-server==0.2.0
        keyring==17.0.0
        kiwisolver==1.0.1
        lazy-object-proxy==1.3.1
        libarchive-c==2.8
        lief==0.9.0
        llvmlite==0.27.0
        locket==0.2.0
        lxml==4.2.5
        MarkupSafe==1.1.0
        matplotlib==3.0.2
        mccabe==0.6.1
        mistune==0.8.4
        mkl-fft==1.0.6
        mkl-random==1.0.2
        more-itertools==4.3.0
        mpmath==1.1.0
        msgpack==0.5.6
        multipledispatch==0.6.0
        navigator-updater==0.2.1
        nbconvert==5.4.0
        nbformat==4.4.0
        networkx==2.2
        nltk==3.4
        nose==1.3.7
        notebook==5.7.4
        numba==0.42.0
        numexpr==2.6.8
        numpy==1.15.4
        numpydoc==0.8.0
        odo==0.5.1
        olefile==0.46
        openpyxl==2.5.12
        packaging==18.0
        pandas==0.23.4
        pandocfilters==1.4.2
        parso==0.3.1
        partd==0.3.9
        path.py==11.5.0
        pathlib2==2.3.3
        patsy==0.5.1
        pep8==1.7.1
        pexpect==4.6.0
        pickleshare==0.7.5
        Pillow==5.3.0
        pkginfo==1.4.2
        pluggy==0.8.0
        ply==3.11
        prometheus-client==0.5.0
        prompt-toolkit==2.0.7
        psutil==5.4.8
        ptyprocess==0.6.0
        py==1.7.0
        pycodestyle==2.4.0
        pycosat==0.6.3
        pycparser==2.19
        pycrypto==2.6.1
        pycurl==7.43.0.2
        pyflakes==2.0.0
        Pygments==2.3.1
        pylint==2.2.2
        pyodbc==4.0.25
        pyOpenSSL==18.0.0
        pyparsing==2.3.0
        PySocks==1.6.8
        pytest==4.0.2
        pytest-arraydiff==0.3
        pytest-astropy==0.5.0
        pytest-doctestplus==0.2.0
        pytest-openfiles==0.3.1
        pytest-remotedata==0.3.1
        python-dateutil==2.7.5
        pytz==2018.7
        PyWavelets==1.0.1
        PyYAML==3.13
        pyzmq==17.1.2
        QtAwesome==0.5.3
        qtconsole==4.4.3
        QtPy==1.5.2
        requests==2.21.0
        rope==0.11.0
        ruamel-yaml==0.15.46
        scikit-image==0.14.1
        scikit-learn==0.20.2
        scipy==1.1.0
        seaborn==0.9.0
        Send2Trash==1.5.0
        simplegeneric==0.8.1
        singledispatch==3.4.0.3
        six==1.12.0
        snowballstemmer==1.2.1
        sortedcollections==1.0.1
        sortedcontainers==2.1.0
        Sphinx==1.8.2
        sphinxcontrib-websupport==1.1.0
        spyder==3.3.2
        spyder-kernels==0.3.0
        SQLAlchemy==1.2.15
        statsmodels==0.9.0
        sympy==1.3
        tables==3.4.4
        tblib==1.3.2
        terminado==0.8.1
        testpath==0.4.2
        toolz==0.9.0
        tornado==5.1.1
        tqdm==4.28.1
        traitlets==4.3.2
        typed-ast==1.1.0
        typing==3.6.4
        unicodecsv==0.14.1
        urllib3==1.24.1
        wcwidth==0.1.7
        webencodings==0.5.1
        Werkzeug==0.14.1
        widgetsnbextension==3.4.2
        wrapt==1.10.11
        wurlitzer==1.0.2
        xlrd==1.2.0
        XlsxWriter==1.1.2
        xlwings==0.15.1
        xlwt==1.3.0
        zict==0.1.3

        • Kashiwaba Yuki より:

          ありがとうございます!

          Procfileの中身を知りたいです!
          Procfileは、Herokuにどのアプリケーションを使うか指示するためのファイルです。
          ドキュメントより引用:”A Procfile is a mechanism for declaring what commands are run by your application’s dynos on the Heroku platform.”

          requirementsの中身を見る限りだと、Gunicornが見当たらなかったのですが、WEBサーバーは何か他のものを利用されていますか?
          Procfileには使用するWEBサーバーを記述するのですが、もしかしたらその記述の誤りが原因かもです!

          あと余談ですが、開発のときは仮想環境を作った方がいいです!
          Anacondaなら簡単に仮想環境作れるので、ぜひ使ってみてください!
          【初心者向け】Anacondaで仮想環境を作ってみる
          初心者のためのFlaskアプリ開発① AnacondaでPythonの開発環境をつくる

          仮想環境がないと、パッケージの依存関係がわからなくなりますので。
          複数の開発を行う際、全てをベース環境で開発していては、どのプロジェクトにどのライブラリを使っているのかわからなくなってしまいます。
          そうなってしまうとデプロイの際にとても困るため、基本的に開発の際には必ず仮想環境の設定が求められるそうです。

          • ASD より:

            返信ありがとうございます。

            一旦、仮想環境を組みまして再度挑戦してみました。

            同じエラーが発生し、試しにrequirements.txtをルートディレクトリに持っていったところ、途中まではうまくいくんですが、最終的にはrejectで跳ね返されます。

            GitHubに構成をいじらずにあげたので、よければ確認お願いできますでしょうか><?

          • Kashiwaba Yuki より:

            確認させていただきました!
            僕の環境で無事にデプロイに成功したのでお伝えさせていただきますね!

            原因は2点ありました。

            1.ディレクトリ構成
            2.tuntime.txtの記述

            まずディレクトリ構成ですが、下のツイートの写真のように、Procfileなどとapp.pyはルートディレクトリに置きます。
            Procfileで”web: gunicorn app:app”と、app.pyを呼び出しているのに、同じディレクトリにないとアクセスできないためです。

            次に、runtime.txtの内容ですが、現在のHerokuはPython3.7.2にはまだ対応していないようです。
            runtime.txtをPython3.7.0に変えたらデプロイに成功しました。
            これは僕も知らなかったので勉強になりました。
            ありがとうございます。

            以上です!
            ぜひ再チャレンジしてみてください!
            もしうまくいかなければ、また遠慮なく聞いてくださいね!

          • ASD より:

            返信ありがとうございます!

            修正して、試したところ無事デプロイすることができました!

            一緒に解決策を試行錯誤していただいた点、非常に心強かったです!

            本当にありがとうございました!

          • Kashiwaba Yuki より:

            おお!!
            素晴らしい!
            初めてのデプロイは大変だったかと思いますが、面白いのはこれからなので、ぜひ今後もお互いにがんばりましょう!!

  12. SR より:

    お久しぶりです。
    このコメント欄で以前質問をさせていただいたSRと申します。

  13. SR より:

    教えていただいたudemyの講座でdajngoでwebアプリケーションを作りました。
    その後bottleを使用して以前ご相談させていただいた「いちばんやさしいpython教本」のプログラムを改造いたしました。
    その後udemyの講座に沿ってさくらVPSでbottleでデプロイをしようとしたのですが、それが上手くいきませんでした。

    ホストが160.16.55.98でTCPポートも変更してあるので、
    最終行を
    run(host=”160.16.55.98 ″, port=int(os.environ.get(“PORT”, TCPポートの番号)))
    としたところ、

    “`
    Listening at: http://127.0.0.1:8000 (31967)
    [2019-03-10 20:42:45 +0900] [31967] [INFO] Using worker: sync
    [2019-03-10 20:42:45 +0900] [31970] [INFO] Booting worker with pid: 31970
    Bottle v0.12.16 server starting up (using WSGIRefServer())…
    Listening on http://160.16.55.98:ポート番号/
    Hit Ctrl-C to quit.

    (中略)

    OSError: [Errno 98] Address already in use

    “`

    のようにエラーが出てしまいました。

  14. SR より:

    またudemyの動画ではrun以降の表記が無くてもデプロイできていたので無しでトライしてみたのですが、

    “`

    [django@tk2-203-11344 douinyosoku]$ sudo nano do_audience_mobilization.py
    [django@tk2-203-11344 douinyosoku]$ sudo /usr/local/bin/gunicorn –bind 127.0.0.1:8000 do_audience_mobilization:application
    (中略)
    [2019-03-10 20:44:33 +0900] [31977] [INFO] Booting worker with pid: 31977
    Failed to find application object ‘application’ in ‘do_audience_mobilization’
    [2019-03-10 20:44:33 +0900] [31977] [INFO] Worker exiting (pid: 31977)
    [2019-03-10 20:44:33 +0900] [31974] [INFO] Shutting down: Master
    [2019-03-10 20:44:33 +0900] [31974] [INFO] Reason: App failed to load.

    “`

    のようにエラーが出てしまいました。

    また、現在このホストにpro_manage.pyを使ってdjnagoでプログラムを出力しており、別ディレクトリでbottleでデプロイをしようとしているのですがそもそもの話としてこの2つを同時にweb上に公開する場合、bottleのプログラムをdjangoに書き換えて同じディレクトリ内に格納するなどしないと不可能なようにも感じるのですがそれはどうなのでしょうか?

    長文申し訳ございません。もしよければアドバイスをお願いいたします。

    • Kashiwaba Yuki より:

      お久しぶりです。
      コメントありがとうございます。

      そうですね…、現状では原因はわかりませんが、恐らくWEBサーバー周りのトラブルなのかなと思います。
      DjangoとBottleを同時にデプロイしているとのことなので、もしかすると同じWEBサーバーを別のアプリケーションが同時に起動しようとしているのかもしれません。
      Djangoに書き直すか、別々のサーバにデプロイするかを試してみていただければと思います。

      あとはポート番号の設定も確認してみるといいかもしれません。
      プロセスをkillしてみると解決するかもしれません。
      http://toriaezu-engineer.hatenablog.com/entry/2016/09/15/230646

      とはいえ、僕自身はやったことはないので、やり方はあるのかもしれませんが、別々のアプリケーションを同じWEBサーバで動かすのは不可能に感じます。
      多分フレームワークがWEBサーバーの起動プロセスを内蔵しているはずなので、それが衝突してしまうかもしれません。

  15. SR より:

    お返事ありがとうございます。
    そうなんです。
    デプロイする際に

    django側は
    sudo /usr/local/bin/gunicorn –bind 127.0.0.1:8000 mysite.pro_wsgi:application
    でデプロイできるのですが、

    bottleの方は別ディレクトリ内のrunサーバーの設定がある
    sudo /usr/local/bin/gunicorn –bind 127.0.0.1:8000 do_audience_mobilization:application

    とするはずなのでおそらくdjango側にプログラムを統一しないといけないと両方デプロイするのは無理な気がするのですよね。

    とはいえ現在はbottleだけデプロイしようとしても失敗しているのですが・・・。
    もう少し自分で調べてみますね。

Kashiwaba Yuki にコメントする コメントをキャンセル

メールアドレスが公開されることはありません。