Sử dụng Heroku Connect kết hợp với Flask và Psycopg2
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 ...
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.1 Yêu cầu
- Cài đặt Python: http://python.org/
- Cài đặt Heroku Toolbelt : https://toolbelt.heroku.com/
- Tạo một tài khoản Heroku: https://signup.heroku.com
- Tạo một tài khoản Saleforce: https://www.salesforce.com/
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="awidth=device-awidth, 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-awidth: 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
- Click vào Setup Connection button:
- Nhập Schema Name. Mặc định sẽ là salesforce
- Trigger OAuth bằng cách click vào button Authorize:
- Sau đó, nhập Salesforce.com developer account
- Tạo 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.
- Load dữ liệu trên App Python Flask ta sẽ có kết quả:
Chúc bạn thành công!