Help us understand the problem. What is going on with this article?

【Python+heroku】Python入れてない状態からherokuで何か表示するまで(後編)

More than 3 years have passed since last update.

これはなに?

こちらの続きです

【Python+heroku】Python入れてない状態からherokuで何か表示するまで(前編)
http://qiita.com/it_ks/items/afd1bdb792d41d0e1145

ここまでで、
heroku上にデプロイしてサンプルのまま動かしました <イマココ

heroku update

忘れてました。定番ですよね、やっとくといいですよね。
heroku update

>heroku update
Updating plugins... done. Updated 1 package.
heroku-cli: Updating... done.

このときはheroku-cliに更新があったようで、アップデートされました。

virtualenv

つくる

virtualenv venv-name
切り替えて使う当座の環境設定を構築してくれます。
venv-nameのとこが環境名。お好みの名前をつけて実行してください。
ここではオーソドックスに、「venv」という名前でつくります。

>virtualenv venv
New python executable in venv\Scripts\python.exe
Installing setuptools, pip, wheel...done.

すると、いまは
C:\Users\(中略)\python-getting-started
に居るわけですが、その直下にvenvっていうフォルダが作られます。
その中にはPythonもろもろ(40MBほど)がおさめられていて、
これが汚していい環境一式ということになります。

有効にする。

activate.batってのが用意されてるので、それを使います。
すると、プロンプト(コマンドライン入力待ちの先頭)に環境名がつくようになります。

>venv\Scripts\activate.bat
(venv) C:\Users\(中略)\python-getting-started>

以下、(venv) >と省略することにします

Push local changes

イマココ

https://devcenter.heroku.com/articles/getting-started-with-python#push-local-changes

requirementsファイルからインストール

(venv) >pip install -r requirements.txt
Collecting dj-database-url==0.3.0 (from -r requirements.txt (line 1))
  Downloading dj_database_url-0.3.0-py2.py3-none-any.whl
Collecting Django==1.9.1 (from -r requirements.txt (line 2))
  Downloading Django-1.9.1-py2.py3-none-any.whl (6.6MB)
    100% |################################| 6.6MB 75kB/s
Collecting gunicorn==19.4.5 (from -r requirements.txt (line 3))
  Downloading gunicorn-19.4.5-py2.py3-none-any.whl (112kB)
    100% |################################| 114kB 1.7MB/s
Collecting psycopg2==2.6.1 (from -r requirements.txt (line 4))
  Downloading psycopg2-2.6.1-cp27-none-win32.whl (814kB)
    100% |################################| 815kB 487kB/s
Collecting whitenoise==2.0.6 (from -r requirements.txt (line 5))
  Downloading whitenoise-2.0.6-py2.py3-none-any.whl
Installing collected packages: dj-database-url, Django, gunicorn, psycopg2, whitenoise
Successfully installed Django-1.9.1 dj-database-url-0.3.0 gunicorn-19.4.5 psycopg2-2.6.1 whitenoise-2.0.6

(venv) >

requirements.txt編集

requests==2.9.1
を requirements.txt に追記せよ、とのことなので書き足して、
しかるのちにpip install -r requirements.txt

(venv) >pip install -r requirements.txt
Requirement already satisfied (use --upgrade to upgrade): dj-database-url==0.3.0 in c:\users\cat_high\documents\guncys\herokustudy\proj\testapp\python-getting-started\sgenv\lib\site-packages (from -r requirements.txt (line 1))
Requirement already satisfied (use --upgrade to upgrade): Django==1.9.1 in c:\users\cat_high\documents\guncys\herokustudy\proj\testapp\python-getting-started\sgenv\lib\site-packages (from -r requirements.txt (line 2))
Requirement already satisfied (use --upgrade to upgrade): gunicorn==19.4.5 in c:\users\cat_high\documents\guncys\herokustudy\proj\testapp\python-getting-started\sgenv\lib\site-packages (from -r requirements.txt (line 3))
Requirement already satisfied (use --upgrade to upgrade): psycopg2==2.6.1 in c:\users\cat_high\documents\guncys\herokustudy\proj\testapp\python-getting-started\sgenv\lib\site-packages (from -r requirements.txt (line 4))
Requirement already satisfied (use --upgrade to upgrade): whitenoise==2.0.6 in c:\users\cat_high\documents\guncys\herokustudy\proj\testapp\python-getting-started\sgenv\lib\site-packages (from -r requirements.txt (line 5))
Collecting requests==2.9.1 (from -r requirements.txt (line 6))
  Downloading requests-2.9.1-py2.py3-none-any.whl (501kB)
    100% |################################| 503kB 518kB/s
Installing collected packages: requests
Successfully installed requests-2.9.1

(venv) >

hello/views.py編集

指示に従って、views.pyの先頭に下記を追記
import requests

さらに、index関数を改変

# Create your views here.
def index(request):
    # return HttpResponse('Hello from Python!')
    return render(request, 'index.html')

def index(request):
    r = requests.get('http://httpbin.org/status/418')
    print r.text
    return HttpResponse('<pre>' + r.text + '</pre>')

ローカルでテスト

index関数を書き換えたら、テスト

(venv) >pip install -r requirements.txt
(venv) >heroku local
forego | starting web.1 on port 5000
web.1  | Traceback (most recent call last):

(venv) >

ローカル環境は http://localhost:5000 にアクセスすると確認できるとのこと。

補足

これあとで気づいたんですが、たぶん、windows環境だったらこっちですよね
heroku local web -f Procfile.windows
ここの下の方に書いてあるやつですが↓
https://devcenter.heroku.com/articles/getting-started-with-python#declare-app-dependencies

heroku上のファイルへ反映

まだここ

https://devcenter.heroku.com/articles/getting-started-with-python#push-local-changes

git add

git add .

(すると
warning: LF will be replaced by CRLF in〜〜
The file will have its original line endings in your working directory.
改行コードについてのログがいっぱい返ってきました。省略)

git commit

(venv) >git commit -m "Demo"

*** Please tell me who you are.

Run

  git config --global user.email "you@example.com"
  git config --global user.name "Your Name"

to set your account's default identity.
Omit --global to set the identity only in this repository.

fatal: unable to auto-detect email address (got '{user}@{machine}.(none)')

(venv) >

んなああ
すいません。

(venv) >git config --global user.email "aiueo@gmail.com"
(venv) >git config --global user.name "heroku user name"

そして再度コミット。

git pushと確認

git push heroku masterって書いてあったので粛々と従う

アップロード、そこそこ時間がかかります。2分くらい?

(venv) >git push heroku master
Counting objects: 5952, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (4984/4984), done.
Writing objects: 100% (5952/5952), 7.32 MiB | 87.00 KiB/s, done.
Total 5952 (delta 1807), reused 0 (delta 0)
remote: Compressing source files... done.
remote: Building source:
remote:
remote: -----> Using set buildpack heroku/python
remote: -----> Python app detected
remote: -----> Installing dependencies with pip
remote:        Collecting requests==2.9.1 (from -r requirements.txt (line 6))
remote:        Downloading requests-2.9.1-py2.py3-none-any.whl (501kB)
remote:        Installing collected packages: requests
remote:        Successfully installed requests-2.9.1
remote:
remote: -----> Preparing static assets
remote:        Running collectstatic...
remote:        Post-processed 'admin/js/vendor/xregexp/LICENSE-XREGEXP.txt' as 'admin/js/vendor/xregexp/LICENSE-XREGEXP.d64cecf4f157.txt'
(中略)
remote:        Post-processed 'humans.txt' as 'humans.d41d8cd98f00.txt'
remote:        Post-processed 'lang-logo.png' as 'lang-logo.019c8743b7cf.png'
remote:        58 static files copied to '/app/staticfiles', 58 post-processed.
remote:
remote:
remote: -----> Discovering process types
remote:        Procfile declares types -> web
remote:
remote: -----> Compressing... done, 50.3MB
remote: -----> Launching...
remote:        Released v6
remote:        https://ancient-taiga-0000.herokuapp.com/ deployed to Heroku
remote:
remote: Verifying deploy.... done.
To https://git.heroku.com/ancient-taiga-0000.git
   fe7f948..8bba81f  master -> master

(venv) >

(venv) >heroku open で(ローカルじゃない方のherokuを)確認。

コンソール

イマココ

https://devcenter.heroku.com/articles/getting-started-with-python#start-a-console

Python

heroku run python manage.py shellしてみろってさ

(venv) >heroku run python manage.py shell
Running python manage.py shell on ancient-taiga-0000... up, run.8091
Python 2.7.11 (default, Dec  7 2015, 21:16:24)
[GCC 4.8.4] on linux2
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>>
>>> dir()
['__builtins__']

対話できるぜ。
通信してるためか、タイプするときのレスポンスは低下します。

閉じるときは

>>> exit()

bash

heroku run bash

(venv) >heroku run bash
Running bash on ancient-taiga-0000... up, run.5888
~ $ ls
app.json        hello      Procfile          README.md         runtime.txt
gettingstarted  manage.py  Procfile.windows  requirements.txt  staticfiles
~ $ exit
exit

(venv) >

表示内容を編集

こっからが本番です。
さっき改変したindex関数ですが、

    return HttpResponse('<pre>' + r.text + '</pre>')

この部分がindexにアクセスしたとき表示される内容になります。
HttpResponse()文字列を与えればいいわけです。

例えば

def index(request):
    return HttpResponse( str(dir()) )

みたいな。

add、commit、push

.pyを編集したら、add→commit→push

(venv) >git add .

(venv) >git commit -m "DemoDemo"
[master 986e6d1] DemoDemo
 1 file changed, 4 insertions(+)

(venv) >git push heroku master
Counting objects: 4, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (4/4), 365 bytes | 0 bytes/s, done.
Total 4 (delta 3), reused 0 (delta 0)
remote: Compressing source files... done.
remote: Building source:
remote:
remote: -----> Using set buildpack heroku/python
remote: -----> Python app detected
remote: -----> Installing dependencies with pip
remote:
remote: -----> Preparing static assets
remote:        Running collectstatic...
remote:        Post-processed 'admin/js/vendor/jquery/jquery.js' as 'admin/js/vendor/jquery/jquery.107fbe9555bf.js'
(中略)
remote:        Post-processed 'humans.txt' as 'humans.d41d8cd98f00.txt'
remote:        Post-processed 'lang-logo.png' as 'lang-logo.019c8743b7cf.png'
remote:        58 static files copied to '/app/staticfiles', 58 post-processed.
remote:
remote:
remote: -----> Discovering process types
remote:        Procfile declares types -> web
remote:
remote: -----> Compressing... done, 50.3MB
remote: -----> Launching...
remote:        Released v8
remote:        https://ancient-taiga-0000.herokuapp.com/ deployed to Heroku
remote:
remote: Verifying deploy... done.
To https://git.heroku.com/ancient-taiga-0000.git
   8bba81f..986e6d1  master -> master

(venv) >

(あ、コミットコメントがクソみたいになってますが、当然もっと上等なポエムを添えるべきでしょう)

結果:
heroku_dir.png

index以外を追加

index関数はhttps://ancient-taiga-0000.herokuapp.com/にアクセスしたときに呼ばれるわけですが、
じゃあ、たとえばhttps://略/testみたいな感じでアクセスできるようにするには。

関数追加

indexと同様の、return HttpResponse()な関数を追加します。
ここでは「test」関数を用意しました。

def test(request):
    return HttpResponse( '<strong>test view !!</strong>' )

urls.py編集

view.pyとともに、gettingstartedフォルダ直下にあるurls.pyも編集すればよいようです
githubでいうこれっす、

https://github.com/heroku/python-getting-started/blob/master/gettingstarted/urls.py

urlpatterns = patterns('',
    # Examples:
    # url(r'^$', 'gettingstarted.views.home', name='home'),
    # url(r'^blog/', include('blog.urls')),

    url(r'^$', hello.views.index, name='index'),
    url(r'^db', hello.views.db, name='db'),
    url(r'^admin/', include(admin.site.urls)),
)

(▲)こういう部分があるので

    url(r'^test', hello.views.test, name='test'),

こういう感じで追記してみました。

これで
heroku_testview.png

何か表示するという目標を達しました、お疲れ様でした。

まとめ

  • 上下に渡って長かったけど大したことはやってません。後半は主に以下
    • views.pyに、表示したい処理を記載
    • urls.pyに登録
  • もとドキュメントにある「env」「postgrqsl」には言及しませんでした。あしからず

最後のtest viewではstrongタグを使っているように、HTML文字列を用意して上げればよさそうです。
あとはその前に外部サービスとかと通信するなんか処理を書いておいて、
それを整形してHttpResponse関数に渡してあげる感じで行けそうです。

ということで外部のAPIとかをあれこれして遊びたいですね。

参考

無料枠内でのHerokuの準備とデプロイ(Mac 10 + Rails 4.2 + MySQL 5.6)
http://ruby-rails.hatenadiary.com/entry/20150314/1426332751

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした