app.py (165 lines of code) (raw):
from __future__ import absolute_import
import json
import os
from urlparse import urlparse
from flask import Flask, render_template, request, redirect, session
from flask_sslify import SSLify
from rauth import OAuth2Service
import requests
app = Flask(__name__, static_folder='static', static_url_path='')
app.requests_session = requests.Session()
app.secret_key = os.urandom(24)
sslify = SSLify(app)
with open('config.json') as f:
config = json.load(f)
def generate_oauth_service():
"""Prepare the OAuth2Service that is used to make requests later."""
return OAuth2Service(
client_id=os.environ.get('UBER_CLIENT_ID'),
client_secret=os.environ.get('UBER_CLIENT_SECRET'),
name=config.get('name'),
authorize_url=config.get('authorize_url'),
access_token_url=config.get('access_token_url'),
base_url=config.get('base_url'),
)
def generate_ride_headers(token):
"""Generate the header object that is used to make api requests."""
return {
'Authorization': 'bearer %s' % token,
'Content-Type': 'application/json',
}
@app.route('/health', methods=['GET'])
def health():
"""Check the status of this application."""
return ';-)'
@app.route('/', methods=['GET'])
def signup():
"""The first step in the three-legged OAuth handshake.
You should navigate here first. It will redirect to login.uber.com.
"""
params = {
'response_type': 'code',
'redirect_uri': get_redirect_uri(request),
'scopes': ','.join(config.get('scopes')),
}
url = generate_oauth_service().get_authorize_url(**params)
return redirect(url)
@app.route('/submit', methods=['GET'])
def submit():
"""The other two steps in the three-legged Oauth handshake.
Your redirect uri will redirect you here, where you will exchange
a code that can be used to obtain an access token for the logged-in use.
"""
params = {
'redirect_uri': get_redirect_uri(request),
'code': request.args.get('code'),
'grant_type': 'authorization_code'
}
response = app.requests_session.post(
config.get('access_token_url'),
auth=(
os.environ.get('UBER_CLIENT_ID'),
os.environ.get('UBER_CLIENT_SECRET')
),
data=params,
)
session['access_token'] = response.json().get('access_token')
return render_template(
'success.html',
token=response.json().get('access_token')
)
@app.route('/demo', methods=['GET'])
def demo():
"""Demo.html is a template that calls the other routes in this example."""
return render_template('demo.html', token=session.get('access_token'))
@app.route('/products', methods=['GET'])
def products():
"""Example call to the products endpoint.
Returns all the products currently available in San Francisco.
"""
url = config.get('base_uber_url') + 'products'
params = {
'latitude': config.get('start_latitude'),
'longitude': config.get('start_longitude'),
}
response = app.requests_session.get(
url,
headers=generate_ride_headers(session.get('access_token')),
params=params,
)
if response.status_code != 200:
return 'There was an error', response.status_code
return render_template(
'results.html',
endpoint='products',
data=response.text,
)
@app.route('/time', methods=['GET'])
def time():
"""Example call to the time estimates endpoint.
Returns the time estimates from the given lat/lng given below.
"""
url = config.get('base_uber_url') + 'estimates/time'
params = {
'start_latitude': config.get('start_latitude'),
'start_longitude': config.get('start_longitude'),
}
response = app.requests_session.get(
url,
headers=generate_ride_headers(session.get('access_token')),
params=params,
)
if response.status_code != 200:
return 'There was an error', response.status_code
return render_template(
'results.html',
endpoint='time',
data=response.text,
)
@app.route('/price', methods=['GET'])
def price():
"""Example call to the price estimates endpoint.
Returns the time estimates from the given lat/lng given below.
"""
url = config.get('base_uber_url') + 'estimates/price'
params = {
'start_latitude': config.get('start_latitude'),
'start_longitude': config.get('start_longitude'),
'end_latitude': config.get('end_latitude'),
'end_longitude': config.get('end_longitude'),
}
response = app.requests_session.get(
url,
headers=generate_ride_headers(session.get('access_token')),
params=params,
)
if response.status_code != 200:
return 'There was an error', response.status_code
return render_template(
'results.html',
endpoint='price',
data=response.text,
)
@app.route('/history', methods=['GET'])
def history():
"""Return the last 5 trips made by the logged in user."""
url = config.get('base_uber_url_v1_1') + 'history'
params = {
'offset': 0,
'limit': 5,
}
response = app.requests_session.get(
url,
headers=generate_ride_headers(session.get('access_token')),
params=params,
)
if response.status_code != 200:
return 'There was an error', response.status_code
return render_template(
'results.html',
endpoint='history',
data=response.text,
)
@app.route('/me', methods=['GET'])
def me():
"""Return user information including name, picture and email."""
url = config.get('base_uber_url') + 'me'
response = app.requests_session.get(
url,
headers=generate_ride_headers(session.get('access_token')),
)
if response.status_code != 200:
return 'There was an error', response.status_code
return render_template(
'results.html',
endpoint='me',
data=response.text,
)
def get_redirect_uri(request):
"""Return OAuth redirect URI."""
parsed_url = urlparse(request.url)
if parsed_url.hostname == 'localhost':
return 'http://{hostname}:{port}/submit'.format(
hostname=parsed_url.hostname, port=parsed_url.port
)
return 'https://{hostname}/submit'.format(hostname=parsed_url.hostname)
if __name__ == '__main__':
app.debug = os.environ.get('FLASK_DEBUG', True)
app.run(port=7000)