Server Apps + API: Python Implementation for the Cron Job
As part of the Server + API Architecture Scenario, we will explain how to implement the server process in Python. Please refer to the Server + API Architecture Scenario document for information on the implemented solution.
Full source code for the Python implementation of the server process can be found in this GitHub repository.
Get an access token
In order to make the HTTP request to the Auth0 /oauth/token API endpoint we will use the libraries json, urllib and urllib2.
This is our sample implementation:
def main():
import json, urllib, urllib2, httplib
# Configuration Values
domain = "{yourDomain}" # Your Auth0 Domain
api_identifier = "API_IDENTIFIER" # API Identifier of your API
client_id = "{yourClientId}" # Client ID of your Machine-to-Machine Application
client_secret = "{yourClientSecret}" # Client Secret of your Machine to Machine Application
api_url = "http://localhost:8080/timesheets/upload"
grant_type = "client_credentials" # OAuth 2.0 flow to use
# Get an access token from Auth0
base_url = "https://{domain}".format(domain=domain)
data = urllib.urlencode({'client_id': client_id,
'client_secret': client_secret,
'audience': api_identifier,
'grant_type': grant_type})
req = urllib2.Request(base_url + "/oauth/token", data, headers={"Accept": "application/x-www-form-urlencoded"})
response = urllib2.urlopen(req)
resp_body = response.read()
oauth = json.loads(resp_body)
access_token = oauth['access_token']
# Standard boilerplate to call the main() function.
if __name__ == '__main__':
main()Was this helpful?
To test this modify your code to print the access_token variable and run the process using python cron.py.
Invoke the API
The steps we follow in our implementation are:
Build a JSON object containing timesheet data and assign it to a
timesheetvariable.Add the API URL and the
timesheetvariable contents to the request body usingurllib2.Request.Add the
Authorizationheader to the request.Set the
Content-Typeheader toapplication/json.Invoke the API using
urllib2.urlopenand add some error handling. Retrieve the response usingjson.loadsand print it in the console.
This is our sample implementation (some code is omitted for brevity):
def main():
# import libraries - code omitted
# Configuration Values - code omitted
# Get an Access Token from Auth0 - code omitted
#Post new timesheet to API
timesheet = {'user_id': '007',
'date': '2017-05-10T17:40:20.095Z',
'project': 'StoreZero',
'hours': 5}
req = urllib2.Request(api_url, data = json.dumps(timesheet))
req.add_header('Authorization', 'Bearer ' + access_token)
req.add_header('Content-Type', 'application/json')
try:
response = urllib2.urlopen(req)
res = json.loads(response.read())
print 'Created timesheet ' + str(res['id']) + ' for employee ' + str(res['user_id'])
except urllib2.HTTPError, e:
print 'HTTPError = ' + str(e.code) + ' ' + str(e.reason)
except urllib2.URLError, e:
print 'URLError = ' + str(e.reason)
except httplib.HTTPException, e:
print 'HTTPException'
except Exception, e:
print 'Generic Exception' + str(e)
# Standard boilerplate to call the main() function - code omittedWas this helpful?
To test this make sure your API is running and run the process using python cron.py.
That's it! You are done!