Advance Concepts Django Rest API
DjangoLearn the Basics
Abhijit Bonik
Indian Institute of Technology Bombay
May 16, 2018
Advance Concepts Django Rest API
Built in features
ORM
Built in Authentication System
Template engine
Form processing
Web server for development and testing
Caching
Middleware system
An admin interface
It solves many common problems associated with Webdevelopment, such as security features, database access,sessions, template processing, URL routing,internationalization etc.
Advance Concepts Django Rest API
MVT Framework
Model (ORM, Database)
View (functions, classes)
Template (HTML)
Advance Concepts Django Rest API
Execution Flow
Figure: Execution Flow
Advance Concepts Django Rest API
Creating a Django project
Command - django-admin startproject Summer Internship
Directory Structure
Summer_Internship/
manage.py
Summer_Internship/
__init__.py
settings.py
urls.py
wsgi.py
Advance Concepts Django Rest API
Creating a module or app
Command - python3 manage.py startapp interns
Directory Structure
Summer_Internship/
manage.py
Summer_Internship/
interns/
__init__.py
admin.py
apps.py
migrations/
__init__.py
models.py
tests.py
views.py
Advance Concepts Django Rest API
Models
You will define all your models in models.py file for the respectivemodule.
class Interns(models.Model):
name = models.CharField(max_length=100)
address = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
institute = models.CharField(max_length=100)
Note: Every class you define in models.py file will create a table inthe database.
Advance Concepts Django Rest API
Views
Views are nothing but functions defined in view.py file of yourmodule.
from .models import Interns
def all_intern_details(request):
interns=Interns.objects.all()
return render(request,’interns.html’,{’interns’:interns})
Note: Each view function accepts an http request , does allprocessing, make a call to the database(models) if needed andgives a http response.
Advance Concepts Django Rest API
URLs
The urls are defined in the variable ’urlpatterns’
from interns import views
urlpatterns = [
url(r’^interns_details/$’, views.all_interns_details,
name = ’interns_details’),
]
Django search for all urls you enter in the browser in this variable.
Advance Concepts Django Rest API
Template
The template file will display the value of variables or data it hasreceived from the view function. Following is a interns.html file -
{% extends ’base.html’ %}
{% for intern in interns %}
{{ intern.name }}
{{intern.address}}
{{intern.institute}}
{% endfor %}
Advance Concepts Django Rest API
Get info of a single intern
from .models import Interns
def intern_profile(request, pk):
intern=Interns.objects.get(pk=pk)
return render(request, ’intern_profile.html’,
{‘intern’:intern})
Advance Concepts Django Rest API
Get info of a single intern
from .models import Interns
def intern_profile(request, pk):
intern=Interns.objects.get(pk=pk)
return render(request, ’intern_profile.html’,
{‘intern’:intern})
Advance Concepts Django Rest API
URLs
The urls are defined in the variable ’urlpatterns’
from interns import views
urlpatterns = [
url(r’^interns_details/$’, views.all_interns_details,
name = ’interns_details’),
url(r’^intern_profile/(?P<pk>\d*)/$’,
views.intern_profile, name = ‘intern_profile’),
]
Django search for all urls you enter in the browser in this variable.
Advance Concepts Django Rest API
Display Intern details
{% extends ’base.html’ %}
<a href="{% url ‘intern_profile’ intern.pk %}">
{{ intern.name }} </a>
<p> {{intern.address}} </p>
<p> {{intern.institute}} </p>
Advance Concepts Django Rest API
Handling Forms in Django
Three way of creating forms in Django.
Using html tags
Using Django Form API
Using Django Model Form API
Advance Concepts Django Rest API
Using HTML forms- create intern.html
Create an intern details form–
<form method="post">
{% csrf_token %}
<label for="id_name">Name</label>
<input type="text" class="form-control" id="id_subject" name="name">
<label for="id_address">Address</label>
<textarea class="form-control" id="id_address" name="address" rows="5">
</textarea>
<label for="id_name">Institute</label>
<input type="text" class="form-control" id="id_institute"
name="institute">
<button type="submit" class="btn btn-success">Post</button>
</form>
Advance Concepts Django Rest API
Function for creating an intern
from .models import Intern
def create_intern(request):
if request.method == ’POST’:
name=request.POST[’name’]
address = request.POST[’address’]
institute = request.POST[‘institute’]
intern = Intern.objects.create(
name=name,
address=address,
institute=institute
)
return redirect(’intern_profile’, pk=intern.pk)
else:
return render(request, ‘create_intern.html’)
Advance Concepts Django Rest API
Forms API
Django two types of built in forms:
forms.Form
forms.ModelForm
Advance Concepts Django Rest API
Using form.Form Api - forms.py
from django import forms
class NewInternForm(forms.Form):
name = forms.CharField(label=’name’, max_length=100)
address = forms.CharField(label=’address’,
widget=forms.Textarea())
institute = forms.CharField(label=’institute’)
Advance Concepts Django Rest API
Validate with form api
from .models import Intern, Institute
from .forms import NewInternForm
def create_intern(request):
if request.method == ’POST’:
form = NewInternForm(request.POST)
if form.is_valid():
name=form.cleaned_data.get(’name’),
address = form.cleaned_data.get(’address’),
institute = form.cleaned_data.get(’institute’),
intern = Intern.objects.create(
name=name,
address=address,
institute=institute
)
return redirect(’intern_profile’, pk=intern.pk)
else:
form = NewTopicForm()
return render(request, ’create_intern.html’, {form’: form})
Advance Concepts Django Rest API
Display form using Form Apis
{% if user.is_authenticated %}
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit" class="btn btn-success">Post</button>
</form>
{% endif %}
The form have three rendering options: form.as table,form.as ul, and form.as p
Advance Concepts Django Rest API
ModelForm API
from .models import Interns
class NewInternForm(forms.ModelForm):
class Meta:
model = Interns
fields = [’name’, ’address’, ‘institute’]
Advance Concepts Django Rest API
View function
if request.method == ’POST’:
form = NewInternForm(request.POST)
if form.is_valid():
intern = form.save()
return redirect("intern_profile", pk=intern.pk)
else:
form = NewInternForm()
return render(request, ’create_intern.html’, {’form’: form})
Advance Concepts Django Rest API
Advance Concepts
Advance Concepts Django Rest API
Class based views
It extends the View class.
The requests are handled inside class methods named afterthe HTTP methods- get, post, put, head, etc
So no conditional check is required
Two types -
1 Class-Based Views (CBV)2 Generic Class-Based Views (GCBV)
Advance Concepts Django Rest API
Create interns using- Class based views
from django.views.generic import View
from .forms import NewInternForm
class CreateInternView(View):
def post(self, request):
form = NewInternForm(request.POST)
if form.is_valid():
intern = form.save()
return redirect(’intern_profile’, intern.pk)
return render(request, ’create_intern.html’, {’form’: form})
def get(self, request):
form = NewInternForm()
return render(request, ’create_intern.html’, {’form’: form})
Advance Concepts Django Rest API
Add more class methods
def render(self, request):
return render(request, ’create_intern.html’,
{’form’: self.form})
def post(self, request):
self.form = NewInternForm(request.POST)
if self.form.is_valid():
intern = self.form.save()
return redirect(’intern_profile’, intern.pk)
return self.render(request)
def get(self, request):
self.form = NewInternForm()
return self.render(request)
Advance Concepts Django Rest API
Urls for class based views
urlpatterns = [
url(r’^create_interns/$’, views.CreateInternView.as_view(),
name=’create_intern’),
]
Advance Concepts Django Rest API
Generic Class based Views (GCBV)
They can speed up development. Following are some mostly usedGCBV
CreateView,
DetailView
DeleteView
FormView
UpdateView
ListView.
Advance Concepts Django Rest API
Generic Class based views - List View
from django.views.generic import ListView
from .models import Interns
class BoardListView(ListView):
model = Interns
context_object_name = interns
template_name = interns.html’
Advance Concepts Django Rest API
CreateView
from django.views.generic import ListView
from .models import Interns
from .forms import NewInternForm
class CreateInternView(CreateView):
model = Interns
form_class = NewInternForm
success_url = reverse_lazy(’get_intern_details’,
kwargs={’pk’: self.object.id})
template_name = ‘create_interns.html’
Advance Concepts Django Rest API
DetailView
class InternProfileView(DetailView):
model = Intern
template_name = "intern_profile.html"
context_object_name = "intern"
This class will fetch the primary key from the url and return anobject of a single intern matching the key
Advance Concepts Django Rest API
Django Rest API
Advance Concepts Django Rest API
Rest API
Any application that can understand internet’s HypertextTransfer Protocol (HTTP) can communicate with each other.
REST is also a language-independent architectural style.
RESTful web services can be written using any language -Python, Java, .NET, etc.
We will use Django Rest Framework, a module of Django toimplement Rest APIs.
Advance Concepts Django Rest API
Django Rest Framework
It has a Web browsable API
Built in authentication scheme such as TokenAuthentication,BasicAuthentication, Sessionbased
Serialization that supports both ORM and non-ORM datasources.
Advance Concepts Django Rest API
Serializers
Serializers allow complex data such as querysets and modelinstances to be converted to native Python data types thatcan then be easily rendered into JSON, XML or other content types.
from rest_framework import serializers
from .models import Interns
class UserSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Interns
fields = (’pk’, ’name’, ’address’, ’institute’)
Advance Concepts Django Rest API
Class based Viewsets
from rest_framework import viewsets
from tutorial.quickstart.serializers import InternSerializer
from .models import Interns
class InternViewSet(viewsets.ModelViewSet):
queryset = Interns.objects.all().order_by(’-name’)
serializer_class = InternSerializer
Urls – Link your viewsets to url
urlpatterns = [
url(r’^api/internapi/$’, views.InternViewSet.as_view(), name=’intern_api’),
]
Advance Concepts Django Rest API
APIs using Django function based views
def intern_api(request):
if request.method == ’GET’:
interns = Interns.objects.all()
serializer = InternSerializer(interns, many=True)
return JsonResponse(serializer.data, safe=False)
elif request.method == ’POST’:
data = JSONParser().parse(request)
serializer = InternSerializer(data=data)
if serializer.is_valid():
serializer.save()
return JsonResponse(serializer.data, status=201)
return JsonResponse(serializer.errors, status=400)
Advance Concepts Django Rest API
Using Rest Framework ‘api view’ wrappers
@api_view([’GET’, ’POST’])
def intern_api(request):
if request.method == ’GET’:
interns = Interns.objects.all()
serializer = InternSerializer(interns, many=True)
return Response(serializer.data)
elif request.method == ’POST’:
serializer = InternSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data,
status=status.HTTP_201_CREATED)
return Response(serializer.errors,
status=status.HTTP_400_BAD_REQUEST)
Advance Concepts Django Rest API
Where we are now
What are models, views, templates, urls.
What are Form APIs
What is Class Based and Generic Class Based Views
What is Rest APIs
How to create a Rest API Using DRF
What are Serializers and Viewsets
Advance Concepts Django Rest API
For installation and other details refer to
https://github.com/fresearchgroup/Collaboration-System
https://fresearchgroup.github.io/docs-collaboration-system/
https://github.com/abhisgithub/django-nginx-installation-script
Advance Concepts Django Rest API
Advance Concepts Django Rest API
For installation and other details refer to
Thank You!