flaskを使ってみる

今更だけどflaskとfacebook api使ってみた。
rackhubでHello {{name}}を表示するまで。

Facebookアプリ登録

以下からアプリケーションを登録する。
Facebook

アプリケーション登録後、ドメインとサイトURLを変更。
今回はrackhubでやっているのでこんな感じです。

ドメイン: xxx.rackbox.net
サイトURL: https://xxx.rackbox.net/

flask,gunicornインストール

pip install flask
pip install gunicorn

Nginx設定、起動

sudo vi /usr/local/nginx/conf.d/flask
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 15;
proxy_send_timeout 15;
proxy_read_timeout 15;

upstream flask {
    server 127.0.0.1:5000;
}

server {
    listen 80 default;
    server_name xxx.rackbox.net;

    location / {
        proxy_pass http://flask;
    }
}

設定後に起動

sudo nginx

Flaskアプリ作成

mkdir -p $HOME/sample/templates
vi $HOME/sample/sample.py
#!/usr/bin/env python
# coding: utf-8

import urllib
import urllib2
import json

from flask import Flask, request, session, redirect, url_for, render_template

app = Flask(__name__)
app.secret_key = 'session secret key'

APP_ID = 'Your App ID'
APP_SECRET = 'Your App Secret Key'
SITE_URL = 'https://xxx.rackbox.net/'

@app.route('/')
def index():
    access_token = session.get('access_token')

    if access_token is None:
        code = request.args.get('code')
        if code is None:
            auth_param = {
                'client_id': APP_ID,
                'redirect_uri': SITE_URL,
                }
            return redirect('https://graph.facebook.com/oauth/authorize?'+
                            urllib.urlencode(auth_param))
        token_param = {
            'client_id': APP_ID,
            'redirect_uri': SITE_URL,
            'client_secret': APP_SECRET,
            'code': code,
            }
        res = urllib2.urlopen('https://graph.facebook.com/oauth/access_token?'+
                              urllib.urlencode(token_param))
        session['access_token'] = res.read()
        return redirect(SITE_URL)

    res = urllib2.urlopen('https://graph.facebook.com/me?'+access_token)
    user_json = json.loads(res.read())
    return render_template('index.html', current_user=user_json)

if __name__ == '__main__':
    app.run(host='0.0.0.0', debug=True)

wsgiファイル作成

vi $HOME/sample/wsgi.py
#!/usr/bin/env python
# coding: utf-8

import sys

sys.path.append('/home/rackhuber/sample')

from sample import app as application

Template作成

vi $HOME/sample/templates/index.html
<!DOCTYPE html>
<html lang="ja">
    <head>
        <meta charset="UTF-8">
        <title>Sample</title>
    </head>
    <body>
        Hello {{ current_user.name }}!
    </body>
</html>

gunicorn起動

cd $HOME/sample
gunicorn --workers=1 --bind=0.0.0.0:5000 wsgi:application

Flaskへ ようこそ — Flask v0.5.1 documentation
Home - Facebook開発者