Showing posts with label python. Show all posts
Showing posts with label python. Show all posts

Sunday, March 15, 2015

Django RESTful Example

The other topic covered in homework this week was setting up a RESTful service using Django. The example provided in the book is a Weather Station mock-up. I have implemented this example and made a few changes of my own to make it work. I did not use MySQL as the database back-end, which is not a hard requirement since Django's data representation libraries let you change the back-end without modifying the object structure. Code is here.

Setup Instructions

  1. Install Python 2.7 with Virtualenv extension
  2. 'virtualenv weatherstation' to create a new blank "weatherstation" Virtualenv container
  3. 'source weatherstation/bin/activate' to turn on Virtualenv container
  4. 'pip install -r requirements.txt' to install all the required packages for the Django setup
  5. 'python mange.py syncdb' to create a new database
  6. When prompted to add a new user, say 'yes' and use 'username' and 'password'

Running Instructions

  1. Activate the weatherstation Virtualenv container
  2. 'python manage.py runserver'
  3. Add at least one piece of data and browse to 'http://127.0.0.1:8000/home'

Adding Data

Modify the following line to as needed.

curl -i -H "Content-Type: application/json" -X POST -d '{"name":"TestCity", "timestamp": "123456", "temperature": "46", "lat": "30.123456", "lon": "76.123456"}' http://127.0.0.1:8000/station/ -u username:password

What's Happening Here?

The URI endpoint "/station" allows people with the correct permissions (username:password) to create new "Station" objects in Django using a POST request and a JSON object in the POST data. These objects contain a name along with some temperature and location information. When the /home URL is loaded, the "requests" Python library makes a GET request and displays the information from the last update using the "index.html" template. The values passed to the template from the view replace the {{ values }} of the same name.

WAMP Publisher / Subscriber Example

One of the topics covered in our homework this week was setting up an asynchronous WAMP publisher / subscriber example using Python. WAMP stands for "Web Application Messaging Protocol", which is a sub-protocol which leverages Websockets (which in turn leverage HTTP) to set up asynchronous communication models. The Python implementation uses AutobahnPython (WAMP implemented on the Twisted network library) to do this. The example code in the book and the procedures used to do this are unfortunately out of date, so the code needed to be modified to get this to work. I had to modify each code sample to clean up some spelling / syntax, and add a "main" function at the bottom to start an ApplicationRunner using the ApplicationSession defined above. Code is available here.

Setup Instructions

  1. Install Python 2.7 with Virtualenv extension
  2. 'virtualenv wamp' to create a new blank "wamp" Virtualenv container
  3. 'source wamp/bin/activate' to turn on Virtualenv container
  4. 'pip install crossbar' to install Crossbar.io WAMP router, will get AutobahnPython as a dependancy
  5. Create a new blank Crossbar.io server to use as a WAMP router
    1. 'mkdir server'
    2. 'cd server'
    3. 'crossbar init'

Usage Instructions

  1. Start the WAMP router
    1. 'cd server'
    2. 'crossbar start'
  2. Start the Subscriber (./subscriberApp.py)
  3. Start the Publisher (./publisherApp.py)

What's Going On Here

When the server is started, it is accepting all new topics published to 'realm1' without any authentication. When the subscriber joins, it is telling the server "please send me any new updates to com.example.test-topic". When the publisher joins, it starts an infinate loop of taking the current time and updating the topic 'com.example.test-topic' with that value. The server then sends those updates to the subscriber client, which prints them out.