We developed a JSON-based API as a backend for our Google-Glass-App. Therefore we used the Django-Web-Framework with the Tastypie-Package and Virtualenv
First steps
We named our django project glass and created an app named tummedical within the project.
These steps are very well explained in the official django-docs. Now our project structure looks like this:
python manage.py startproject glass python manage.py startapp tummedical
Project-Structure
- glass
- __init__.py
- settings.py
- urls.py
- wsgi.py
- tummedical
- migrations
- __init.py
- admin.py
- api.py
- models.py
- test.py
- views.py
- manage.py
After that we can create our models withon the tummedical application.
models.py
from django.contrib.auth.models import User
from django.db import models
# Create your models here.
class Patient(models.Model):
first_name = models.CharField(max_length=200)
last_name = models.CharField(max_length=200)
barcode = models.CharField(max_length=200,blank=True,null=True)
diagnosis = models.CharField(max_length=200,blank=True,null=True)
birth_date = models.CharField(max_length=200, blank=True, null=True)
# Timestamps
created_at = models.DateTimeField(auto_now_add=True, null=True) # set when it's created
updated_at = models.DateTimeField(auto_now=True, null=True) # set every time it's updated
def __unicode__(self):
return u'%s, %s' % (self.last_name, self.first_name)
class Medicine(models.Model):
name = models.CharField(max_length=200)
barcode = models.CharField(max_length=200,blank=True,null=True)
dose = models.CharField(max_length=200,blank=True,null=True)
type = models.CharField(max_length=200,blank=True,null=True)
image = models.CharField(max_length=200,blank=True,null=True)
# Timestamps
created_at = models.DateTimeField(auto_now_add=True, null=True) # set when it's created
updated_at = models.DateTimeField(auto_now=True, null=True) # set every time it's updated
def __unicode__(self):
return u'%s' % self.name
class Treatment(models.Model):
amount = models.CharField(max_length=200, blank=True, null=True)
daytime = models.CharField(max_length=200, blank=True, null=True)
date = models.CharField(max_length=200, blank=True, null=True)
KEY_TYPES = (("1","Morning"),("2","Midday"),("3","Evening"),("4","Night"))
date = models.CharField(max_length=200, choices=KEY_TYPES, null=True)
medicine = models.ForeignKey(Medicine)
patient = models.ForeignKey(Patient)
# Timestamps
created_at = models.DateTimeField(auto_now_add=True, null=True) # set when it's created
updated_at = models.DateTimeField(auto_now=True, null=True) # set every time it's updated
def __unicode__(self):
return u'%s (%s)' % (self.medicine, self.patient)
To implement the API-functionality we use Tastipie.
Tastipie can be installed via pip
pip install django-tastipie
To enable tummedical and tastipie we have to add it in the settings.py.
Here is the also the place to configure your database connection.
settings.py
[...]
INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'tummedical',
'tastypie',
)
[...]
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'name',
'USER': 'user',
'PASSWORD': 'password',
'HOST': '/tmp/mysql.sock',
}
}
[...]
Remember to adjust name, user, password and host to your specific settings. Depending on choosen database you need to install some additional packages. In case of MySQL you may need:
pip install MySQL-python
Having a database connected and the tummedical and tastypie app´s enabled we can initialize the database.
python manage.py syncdb
Keep in mind that the manage.py need to be executed from the project root.
As mentioned before we use tastypie for the API-functionality. The configuration of tastypie is done in api.py.
For the authentication of our Wearable Devices we use the ApiKeyAuthentication(). After a successful authentication we give the device access to all the functionality (authorization = Authorization()). We create the ApiKey later in the django admin interface.
We want to allow filtering on the barcode field:
filtering = {
"barcode": ALL,
}
api.py
from tastypie import fields
from tastypie.authentication import ApiKeyAuthentication
from tastypie.authorization import Authorization
from tastypie.resources import ModelResource
from tummedical.models import Patient, Medicine, Treatment
from tastypie.resources import ALL
class PatientResource(ModelResource):
class Meta:
authentication = ApiKeyAuthentication()
authorization = Authorization()
filtering = {
"barcode": ALL,
}
queryset = Patient.objects.all()
resource_name = 'patient'
class MedicineResource(ModelResource):
class Meta:
authentication = ApiKeyAuthentication()
authorization = Authorization()
queryset = Medicine.objects.all()
filtering = {
"barcode": ALL,
}
resource_name = 'medicine'
class TreatmentResource(ModelResource):
medicine = fields.ForeignKey(MedicineResource, 'medicine', full=False)
patient = fields.ForeignKey(PatientResource, 'patient', full=False)
class Meta:
authentication = ApiKeyAuthentication()
authorization = Authorization()
queryset = Treatment.objects.all()
resource_name = 'treatment'
Make json the dedault format in settings.py
TASTYPIE_DEFAULT_FORMATS = ['json']
We enable the django admin interface by registering the models in admin.py
admin.py
from django.contrib import admin from tummedical.models import Patient, Medicine, Treatment # Register your models here. admin.site.register(Patient) admin.site.register(Medicine) admin.site.register(Treatment)
To access the admin interface we have to create a superuser first
python manage.py createsuperuser
With this user we can log into the admin interface(servername.de/admin) and create ApiKeys for our Wearable devices.


There is one more step we need before we can use the API: We need to register the API-Endpoints in the urls.py
urls.py
from django.conf.urls import include, url
from django.contrib import admin
from tummedical.api import PatientResource, MedicineResource, TreatmentResource
patient_resource = PatientResource()
medicine_resource = MedicineResource()
treatment_resource = TreatmentResource()
urlpatterns = [
url(r'^admin/', include(admin.site.urls)),
url(r'^api/', include(patient_resource.urls)),
url(r'^api/', include(medicine_resource.urls)),
url(r'^api/', include(treatment_resource.urls)),
]
If you want to give your Patients, Medicine and Treatment a more advanced interface you can implement this functionality in the views.py.