Part III: Implementing HTTP Verbs on F1 api

In the previous blog we created api, now we are going to test it. Before going there I have made some changes to the project. Like I have created a Detail view which has information on particular Racer. The template would look something like this:

profile

So lets begin updating some code, starting from the models.Update your models.py with the following code:

class Fastest_laps(models.Model):
    driver_name = models.CharField(max_length=25, null=True)
    grand_prix = models.CharField(max_length=15, blank=True)
    car_model = models.CharField(max_length=50)
    time_taken = models.CharField(blank=True, max_length=8)

    def __str__(self):
        return self.driver_name


class Driver(models.Model):

    place_of_birth = models.CharField(max_length=25)
    driver = models.ForeignKey(Fastest_laps, db_column='driver_name')
    picture = models.ImageField(blank=True, null=True)

    def __str__(self):
        return str(self.driver)

There is a foreign key that connects the two tables. Going forward you need to create api views for Update, Put and Delete so that on a given api endpoint you can use all the HTTP verbs. I am using class-based views, it helps me with reusable components, I will discuss in-depth about it later. You need to update the api.py file with the following code:

#!/usr/bin/env python
from rest_framework.generics import ListCreateAPIView, ListAPIView, UpdateAPIView,RetrieveAPIView, DestroyAPIView
from .serializer import ListSerializer,DetailSerializer
from .models import Fastest_laps,Driver


class ListApi(ListAPIView):

    queryset = Fastest_laps.objects.all()

    serializer_class = ListSerializer

class LapCreateApi(ListCreateAPIView):

    queryset = Fastest_laps.objects.all()

    serializer_class = ListSerializer

class DetailApi(ListAPIView):

    queryset = Driver.objects.all()
    serializer_class = DetailSerializer


class LapUpdateApi(UpdateAPIView):

    queryset = Fastest_laps.objects.all()
    serializer_class = ListSerializer

class LapRetrieve(RetrieveAPIView):
    queryset = Fastest_laps.objects.all()
    serializer_class = ListSerializer

class LapDestroy(DestroyAPIView):
    queryset = Fastest_laps.objects.all()
    serializer_class = ListSerializer

I have used generic views , you can go forward and use viewsets under rest_framework. You can see I have imported UpdateAPIView, RetrieveAPIView and DestroyAPIView, so advantage of using class based views is allow you to compose bits of reusable behavior. REST framework takes advantage of this by providing a number of pre-built views that provide for commonly used patterns.

So basically an UpdateAPIView will update the model instance, similarly a  DestroyAPIView will delete a model Instance.

Final change is url.py

#!/usr/bin/env python
from django.conf.urls import url
from .api import ListApi,DetailApi,LapUpdateApi,LapRetrieve,LapDestroy

app_name = 'historicRaces'
urlpatterns = [
    url(r'^fastlaps/$', ListApi.as_view()),
    url(r'^detail/$',DetailApi.as_view()),
    url(r'^lap/(?P<pk>\d+)/update$', LapUpdateApi.as_view()),
    url(r'^lap/(?P<pk>\d+)$', LapRetrieve.as_view()),
    url(r'^lap/(?P<pk>\d+)/delete$', LapDestroy.as_view()),
]

So in your terminal run your local server on your computer’s IP. It should look something like this: python manage.py runserver 192.168.43.135:8000. [In settings.py look for ALLOWED_HOSTS set it to allowed all by placing an asterisk  in the square bracket. [‘*’]]

I am first going to see my first api 192.168.43.135:8000/fastlaps

fastdata

Works just fine, I can see all my data, I also want to look at my detail api.

detail

Perfect. Now lets test our GET, POST, PUT and Delete Methods.

Next open a terminal and write the following:

Get

import requests
>>> url = ‘http://192.168.43.135:8000/fastlaps/&#8217;
>>> response = requests.get(url)
>>> response.json()

[{‘id’: 1, ‘grand_prix’: ‘Great Britain’, ‘driver’: ‘Nino Farina’, ‘car_model’: ‘ALFA ROMEO’, ‘time_taken’: ‘1:50.600’}, {‘id’: 2, ‘grand_prix’: ‘Monaco’, ‘driver’: ‘Juan Manuel Fangio’, ‘car_model’: ‘ALFA ROMEO’, ‘time_taken’: ‘1:51.000’}, {‘id’: 3, ‘grand_prix’: ‘Indianapolis 50’, ‘driver’: ‘Johnnie Parsons’, ‘car_model’: ‘KURTIS KRAFT OFFENHAUSER’, ‘time_taken’: ‘2:41.600’}, {‘id’: 4, ‘grand_prix’: ‘Belgium’, ‘driver’: ‘Nino Farina’, ‘car_model’: ‘ALFA ROMEO’, ‘time_taken’: ‘4:34.100’}]

get a specific record:

>> url = ‘http://127.0.0.1:8000/lap/8&#8217;
>>> response = requests.get(url)
>>> response.json()

{‘id’: 8, ‘driver_name’: ‘Nino Farina’, ‘grand_prix’: ‘Great Britain’, ‘car_model’: ‘ALFA ROMEO’, ‘time_taken’: ‘1:50.600’}

Post

>> data = {‘id’:’5′,’grand_prix’:’Indianapolis’,’driver’:’Johnnie Parsons’,’car_model’:’KURTIS KRAFT OFFENHAUSER’,’time_taken’:’2:41.600′}
>>> response = requests.post(url,data)
>>> response.json()
{‘id’: 5, ‘grand_prix’: ‘Indianapolis’, ‘driver’: ‘Johnnie Parsons’, ‘car_model’: ‘KURTIS KRAFT OFFENHAUSER’, ‘time_taken’: ‘2:41.600’}

9

Put:

my_data = {‘id’:’7′,’driver_name’:’Lee Wallard’,’grand_prix’:’Indianapolis’,’car_model’:’KURTIS KRAFT OFFENHAUSER’,’time_taken’:’1:07.260′}
>>> response = requests.patch(url,my_data)
>>> response.json()
{‘id’: 7, ‘driver_name’: ‘Lee Wallard’, ‘grand_prix’: ‘Indianapolis’, ‘car_model’: ‘KURTIS KRAFT OFFENHAUSER’, ‘time_taken’: ‘1:07.260’}

p2

Delete

>> url = ‘http://127.0.0.1:8000/lap/7/delete&#8217;
>>> response = requests.delete(url)
>>> response.json()

delete

We will continue the testing api in the next blog too, and make our code more efficient. Stay Tuned. For the updated code visit https://github.com/Dpython2017/formula1.git

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s