Sử dụng Heroku Connect kết hợp với Flask và Psycopg2

1. Tổng quan

Heroku Connect có thể dễ dàng build Heroku apps share data với hệ thống Saleforce của bạn. Ở trong bài viết này, mình sẽ giới thiệu cho bạn cách chạy một Python app với Psycopg2 trong Heroku. Với Heroku Connect bạn có thế sync dữ liệu giữa PostgreSQL và Saleforce. Psycopg là một trong những Postgres adapter library của Python dùng phổ biến. Psycopg2 là một DB API 2.0 phù hợp với PostgreSQL driver.

2. Tạo app

2.1 Yêu cầu

2.2 Các bước thực hiện

2.2.1 Tạo môi trường ảo Python

Ở đây mình sẽ dụng Virtualenv để tạo môi trường này:

$ mkdir flask-psycopg2-sample 
$ cd flask-psycopg2-sample 
$ virtualenv -p python2 venv
$ source venv/bin/activate
$ mkdir src && cd src

Sau bước này, mình đã tạo một môi trường ảo sử dụng Python 2 tên là venv. Đồng thời, mình cũng tạo thư mục gốc source code là src.

2.2.2 Cài đặt các gói cần thiết

Ở bước này, mình sẽ cài các gói: flask, gunicorn, psycopg2. Sau đó mình export các lib và version các lib ra một file requirements.txt.

$ pip install flask gunicorn psycopg2
$ pip freeze > requirements.txt

2.2.3 Code app

Cấu trúc project:

venv
src.
├── app.py
├── Procfile
├── requirements.txt
└── templates
	└── contacts.html
  • Tạo Flask app app.py:
import os
import psycopg2
from flask import Flask, render_template
import urlparse

url = urlparse.urlparse(os.environ.get('DATABASE_URL'))
db = "dbname=%s user=%s password=%s host=%s " % (
	url.path[1:], url.username, url.password, url.hostname)
schema = "schema.sql"
conn = psycopg2.connect(db)

cur = conn.cursor()

app = Flask(__name__, template_folder='templates')


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


@app.route('/contacts')
def contacts():
	try:

    	cur.execute("""SELECT name from salesforce.contact""")
    	rows = cur.fetchall()
    	my_list = []
    	for row in rows:
        	my_list.append(row[0])

    	return render_template('contacts.html', results=my_list)
	except Exception as e:
    	print(e)
    	return
if __name__ == '__main__':
	app.run(host='0.0.0.0')
  • Tạo file Procfile cấu hình app chạy trên Heroku cloud:
web: gunicorn app:app --log-file=-
  • File requirements.txt:
click==6.6
Flask==0.12
gunicorn==19.6.0
itsdangerous==0.24
Jinja2==2.8.1
MarkupSafe==0.23
psycopg2==2.6.2
Werkzeug==0.11.15
  • Tạo file contacts.html view:
<html>
<head>
	<title>Flask Template Example</title>
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<link href="http://netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap.min.css" rel="stylesheet" media="screen">
	<style type="text/css">
    	.container {
        	max-width: 500px;
        	padding-top: 100px;
    	}
	</style>
</head>
<body>
<div class="container">
	<p>Contacts:</p>
	<ul>
    	{% for r in results %}
    	<li>{{r}}</li>
    	{% endfor %}
	</ul>
</div>
<script src="http://code.jquery.com/jquery-1.10.2.min.js"></script>
<script src="http://netdna.bootstrapcdn.com/bootstrap/3.0.0/js/bootstrap.min.js">
</script>
</body>
</html>       

3. Deploy

Deploy lên Heroku có nhiều lựa chọn, ở đây mình chọn bộ CLI mà Heroku cung cấp.

3.1 Initialize git

$ git init
$ git add .
$ git commit -m "Add Flask Heroku Saleforce app"

3.1 Deploy

$ heroku create --app demo-fhs
$ git push heroku master

3.2 Add PostgreSQL Add-On

Sử dụng CLI để tạo add thêm Add-On PostgreSQL(https://devcenter.heroku.com/articles/heroku-postgresql):

$ heroku addons:create heroku-postgresql:hobby-dev

4. Cấu hình trong Heroku Dashboard

  • Click vào Setup Connection button:

Setup Connection

  • Nhập Schema Name. Mặc định sẽ là salesforce

Schema Name

  • Trigger OAuth bằng cách click vào button Authorize:

Trigger OAuth

Saleforce Account

  • Tạo Mappings

Mappings

  • Tạo Mappings Contacts: Chọn các fields trong Salesforce Schema mà bạn cần map tới Postgres database trong app.

Mappings Contacts

  • Load dữ liệu trên App Python Flask ta sẽ có kết quả:

Result

Chúc bạn thành công!