over 3 years ago

若你有一支程式需要定時跑的話,
Heroku 提供 Schdeuler 簡單地達到你的需求,
Heroku Scheduler | Heroku Dev Center

1. 要求 heroku 在你的帳號啟用 scheduler 服務。

若你的帳號資訊未填寫信用卡資訊,Heroku 會先要求完成信用卡資訊填寫,schedluer 跟 app 服務一樣,一個月有固定的免費配額可使用。
 $ heroku addons:create scheduler:standard

2. 進入 app dashboard 會發現多了 Heroku Schdeuler 選項。

3. 隨意將一個 python 程式上傳至 remote master,並測試確認程式正常。

  $ heroku run python test.py

4. 在 Heroku Schdeuler 內 add new job。

完成。

 
over 4 years ago

Heroku,一個偶然看到的網站,是一套 Paas 的服務,建立在 Amazon EC2 的雲端架構上,

Dynos 是其基本的服務單位,以每小時單位計價,隨著服務規格不同,如記憶體或 CPU 等,提供不同價格的方案,

基本上就是你不需要擔心實際的資源配置以及系統架構,

並提供各式各樣的底層服務來讓你選擇組合,方便快速的整合讓你專心開發應用程式。

前言

會有興趣是因為這些雲端運算或 Amazon 以前只會在書上或考題上看到,

剛好又在練習 python 以及好奇 server API 運作的情況下,

心想不如來實際操作看看寫一支小小的 python 程式放在 heroku 上來處理 GET/POST 連線。

可以按照 Getting Started with Python on Heroku 的步驟來建置,

不過我只是個用 editor 寫小小 python 程式的人,過程中其實遇到一點點的阻礙加上一點點的不知道自己在做什麼,

因此在這邊列出成功的操作步驟加上一點點的說明,來清楚的紀錄整個流程。

< 申請 heroku 帳號 >

sign up

< 部署環境 >

1. 安裝 Heroku toolbelt

Heroku toolbelt
基本上因為必須操作 heroku 的指令,你必須先裝上 heroku 的 command line tool。

2. heroku login

當你完成安裝後,便可以使用 heroku 指令來使用剛剛申請的帳號進行登入。

$ heroku login
3. 建立專案根目錄

再來請建立一個資料夾作為你的應用程式的根目錄,並且移動到此根目錄底下。

$ mkdir helloflask
$ cd helloflask
4. 安裝 Virtualenv

Virtualenv 是一個可以創造出 python 虛擬環境的工具,用來為你的專案架設獨立的環境,
在這邊 heroku 認為你已經安裝好 Virtualenv,若沒有裝過的話,要先進行安裝。

$ easy_install virtualenv
5. 建立並啟動 Virtualenv 環境
$ virtualenv venv
$ source venv/bin/activate
6. 安裝 Flask

Flask 是一個以 python 語言為主的 MicroFramework,以此來實作我們的 python 程式。

$ pip install Flask gunicorn
7. 建立一個簡單的 application

在這邊我們先寫一個非常簡單的程式,來測試環境是否架設成功。

import os

from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello():
        return 'Hello World!'

if __name__ == '__main__':
        port = int(os.environ.get('PORT', 5000))
        app.run(host='0.0.0.0', port=port)
8. 建立 Procfile 以及 requirements.txt

在這邊 heroku 會先請你定義使用 web 方式來執行應用程式,並寫入名為 “Procfile" 的檔案以及建立環境設定檔。

$ pip freeze > requirements.txt
$ echo web: python app.py > Procfile
9. 執行 web service
$ foreman start

接下來就可以開啟瀏覽器輸入 https://localhost:5000,就能看到 'Hello World!' 出現了。

10. push 至遠端伺服器

heroku 會為你建立好遠端分支,這時候必須進行一些 git 的操作,push 到遠端分支上來 deploy 程式碼,

成功 push 之後,在 Heroku | Apps 上就能看到你的應用程式,

如:boiling-fjord-8215

下一篇:處理連線

 
over 4 years ago

將環境建置完成後,再來要試著來處理 GET/POST 連線,

其實沒有真正要做什麼東西,只是想要玩玩看是否真的能成功來 post 資料並且顯示在 web 上,

目標如下:

POST

- 收到 POST 連線後,抓到 post data
- 將 data 內容 output 成一個文字檔
- 回傳收到的 data, time, from ip

GET

- 讀取文字檔內容
- 在 web 上顯示最新的 data 資訊

實作

import flask
import functools
import os
import datetime
import time

app = flask.Flask(__name__)

@app.route('/wtf', methods=['POST', 'GET'])
def wtf():
    fileName = 'lastReceive.txt'


    if flask.request.method == 'GET':
        getFile = open(fileName, 'r')
        text = getFile.read()
        getFile.close()
        spilt = text.split('$')
        return '<br>' + 'Last Received POST Data is : "' + spilt[0] + '"' + '<br>' + 'From : ' + spilt[1]+ '<br>' + 'Date : ' + spilt[2]

    elif flask.request.method == 'POST':

        receivePost = flask.request.stream.read()
        ip = flask.request.remote_addr
        now = datetime.datetime.fromtimestamp(time.time()).strftime('%Y-%m-%d %H:%M:%S')
        write = receivePost + '$' + ip + '$' + now

        if not os.path.isfile(fileName):
            tempFile = open(fileName, 'a')
        else: 
            tempFile = open(fileName, 'w')
        tempFile.write(write)
        tempFile.close()

        return '<br>' + 'Receive POST Data is : "' + receivePost + '"' + '<br>' + 'From : ' + ip + '<br>' + 'Date : ' + now


def main():
    port = int(os.environ.get('PORT', 5000))
    app.run(host='0.0.0.0', port=port)

if __name__ == '__main__': main()