Sunteți pe pagina 1din 43

Advance Concepts Django Rest API

Django
Learn 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 Web
development, 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 respective
module.
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 in
the database.
Advance Concepts Django Rest API

Views

Views are nothing but functions defined in view.py file of your


module.
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 all
processing, make a call to the database(models) if needed and
gives 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 has
received 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</but
</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 after
the 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 used


GCBV
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 an
object 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 Hypertext


Transfer 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 to
implement 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 data
sources.
Advance Concepts Django Rest API

Serializers

Serializers allow complex data such as querysets and model


instances to be converted to native Python data types that
can 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!

S-ar putea să vă placă și