Rest Api
Rest Api
REDDY
Advantages of DRF:
DRF allows the flexibility to extend and customize the framework’s tools
according to programmer’s demands that greatly reduces development time.
It also provides the support of testing, debugging and caching.
Simplicity, flexibility, quality, and test coverage of source code.
Powerful serialization engine compatible with both ORM and non-ORM
data sources.
Pluggable and easy to customize validators and authenticators.
Generic classes for CRUD operations.
Clean, simple, views for Resources, using Django's new class based views.
MOHAN [Link]
API types:
REST API:
REST API is an architectural style for an application programming interface
(API) that uses HTTP request to access and use data.
When web services use REST architecture, they are called Restful APIs or
REST APIs.
A REST API is a set of web addresses that respond with pure information.
API returns JSON or XML, which is common format.
MOHAN [Link]
JSON:
JSON is an open standard file format and data interchange format that uses
human-readable text to store and transmit data objects consisting of attribute
value pairs.
JavaScript Object Notation (JSON) is a standard text-based format for
representing structured data based on JavaScript object syntax. It is
commonly used for transmitting data in web applications (e.g., sending some
data from the server to the client, so it can be displayed on a web page.
XML:
API Resource:
MOHAN [Link]
Installing DRF:
INSTALLED_APPS=[
‘rest_framework’
]
Creating API:
[Link]:
MOHAN [Link]
INSTALLED_APPS = [
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'Restapp',
'rest_framework',
]
[Link]:
def __str__(self):
return [Link]
[Link] :
Note: to convert model data into JSON format then we use serializers.
Add a new python file under the app with the name [Link]
[Link]:
class empSerializer([Link]):
class Meta:
model=Employees
fields='__all__'
[Link]:
def get(self,request):
emp=[Link]()
serializer=empSerializer(emp,many=True)
MOHAN [Link]
return Response([Link])
def post(self):
pass
[Link]:
urlpatterns = [
path('admin/', [Link]),
path('emp/',[Link].as_view()),
]
Serializers:
Serializers allow complex data such as query sets and model instances to be
converted to native python data types that can then be easily rendered into
JSON, XML or other content types.
Serializers also provide deserialization, allowing parsed data to be converted
back into complex types.
The process of converting complex data like query sets and model instances
to python data types is called serialization.
JsonRenderer:
Go to [Link]
[Link]:
INSTALLED_APPS = [
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'rest_framework',
]
[Link]:
from [Link] import models
[Link]:
from [Link] import admin
from [Link] import Employee
[Link]:
class EmpSerializer([Link]):
id=[Link](max_length=20)
ename=[Link](max_length=20)
eaddress=[Link](max_length=20)
email=[Link](max_length=20)
[Link]:
from [Link] import Employee
from [Link] import EmpSerializer
from rest_framework.renderers import JSONRenderer
from [Link] import HttpResponse
def emp_details(request,pk):
emp=[Link](id=pk)
#print(emp)
serializer=EmpSerializer(emp)
#print(serializer)
json_data=JSONRenderer().render([Link])
#print(json_data)
return
HttpResponse(json_data,content_type='application/js
MOHAN [Link]
on')
def emp_all_details(request):
emp=[Link]()
serializer=EmpSerializer(emp,many=True)
json_data=JSONRenderer().render([Link])
return
HttpResponse(json_data,content_type='application/js
on')
[Link] :
urlpatterns = [
path('admin/', [Link]),
path('emp/<int:pk>',views.emp_details),
path('empall/',views.emp_all_details),
]
[Link] :
import requests
URL="[Link]
r=[Link](url=URL)
emp_data=[Link]()
print(emp_data)
Note: from [Link] file we are requesting to api to get employee data and api will
send request to django application.
De serialization:
The io module provides Python's main facilities for dealing with various
types of I/O.
Python IO module allows us to manage the file-related input and output
operations.
A stream is basically a sequence of data. Whatever data we use in our
programming it flows through a stream.
MOHAN [Link]
It parses the incoming request JSON content into python content type dict.
JSONParser. Parses JSON request content. [Link] will be
populated with a dictionary of data.
Data parsing is the process of taking data in one format and
transforming it to another format.
[Link]:
INSTALLED_APPS = [
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'rest_framework',
MOHAN [Link]
'[Link]',
]
[Link]:
[Link]:
@[Link](Manager)
class ManagerAdmin([Link]):
list_display = ['name','address','mail','age']
[Link]:
class ManagerSerialzer([Link]):
name=[Link](max_length=20)
address=[Link](max_length=20)
mail=[Link](max_length=20)
age=[Link]()
[Link]:
stream=[Link](jsondata)
py_data=JSONParser().parse(stream)
serializer=ManagerSerialzer(data=py_data)
if serializer.is_valid():
[Link]()
result={'message':'Data inserted into
database'}
jsondata=JSONRenderer().render(result)
return
HttpResponse(jsondata,content_type='application/jso
n')
jsondata=JSONRenderer().render([Link])
return HttpResponse(jsondata,
content_type='application/json')
[Link]:
urlpatterns = [
path('admin/', [Link]),
path('createmanager/',views.create_Manager),
]
Create a new python file with the name [Link] inside the application.
[Link]:
import requests
import json
URL="[Link]
MOHAN [Link]
data={
'name':'mohan',
'address':'hyderabad',
'mail':'mohan@[Link]',
'age':37
}
jsondata=[Link](data)
r=[Link](url=URL,data=jsondata)
data=[Link]()
print(data)
[Link]:
INSTALLED_APPS = [
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'rest_framework',
]
[Link] :
MOHAN [Link]
[Link]:
@[Link](Employee)
class EmployeeAdmin([Link]):
list_display =
['id','name','address','mail','age']
[Link]:
from rest_framework import serializers
from [Link] import Employee
MOHAN [Link]
class EmployeeSerialzer([Link]):
name=[Link](max_length=20)
address=[Link](max_length=20)
mail=[Link](max_length=20)
age=[Link]()
[Link]=validated_data.get('name',[Link]
me)
[Link] =
validated_data.get('address', [Link])
[Link] = validated_data.get('mail',
[Link])
[Link] = validated_data.get('age',
[Link])
[Link]()
return instance
[Link]:
jsondata=JSONRenderer().render([Link])
return
HttpResponse(jsondata,content_type='application/jso
n')
emp=[Link]()
serializer =
EmployeeSerialzer(emp,many=True)
jsondata =
JSONRenderer().render([Link])
return HttpResponse(jsondata,
content_type='application/json')
if [Link] == 'POST':
jsondata = [Link]
stream = [Link](jsondata)
py_data = JSONParser().parse(stream)
serializer =
EmployeeSerialzer(data=py_data)
if serializer.is_valid():
[Link]()
result = {'message': 'Data inserted
into database'}
jsondata =
JSONRenderer().render(result)
return HttpResponse(jsondata,
MOHAN [Link]
content_type='application/json')
jsondata =
JSONRenderer().render([Link])
return HttpResponse(jsondata,
content_type='application/json')
if [Link]=='PUT':
jsondata = [Link]
stream = [Link](jsondata)
py_data = JSONParser().parse(stream)
id=py_data.get('id')
emp=[Link](id=id)
#serializer=EmployeeSerialzer(emp,data=py_data,part
ial=True)
serializer = EmployeeSerialzer(emp,
data=py_data)
if serializer.is_valid():
[Link]()
result = {'message': 'Data updated
into database'}
jsondata =
JSONRenderer().render(result)
return HttpResponse(jsondata,
content_type='application/json')
jsondata =
JSONRenderer().render([Link])
return HttpResponse(jsondata,
content_type='application/json')
if [Link]=='DELETE':
jsondata = [Link]
stream = [Link](jsondata)
py_data = JSONParser().parse(stream)
id = py_data.get('id')
emp = [Link](id=id)
[Link]()
MOHAN [Link]
[Link]:
urlpatterns = [
path('admin/', [Link]),
path('emp/',views.employee_data),
]
Create a new python file with the name [Link] inside the application.
[Link]:
import requests
import json
URL="[Link]
def get_record(id=None):
data={}
if id is not None:
data={'id':id}
jsondata=[Link](data)
r=[Link](url=URL,data=jsondata)
data=[Link]()
print(data)
#get_record(1)
#get_record()
MOHAN [Link]
def post_record():
data = {
'name': 'kiran',
'address': 'vizag',
'mail': 'kiran@[Link]',
'age': 28
}
jsondata=[Link](data)
r=[Link](url=URL,data=jsondata)
data=[Link]()
print(data)
#post_record()
def update_record():
data = {
'id':1,
'name': 'ramesh',
'address': 'vizag',
'mail':'ramesh@[Link]',
'age': 45
}
jsondata=[Link](data)
r=[Link](url=URL,data=jsondata)
data=[Link]()
print(data)
#update_record()
def delete_data():
data={'id':2}
jsondata=[Link](data)
r=[Link](url=URL,data=jsondata)
data=[Link]()
print(data)
MOHAN [Link]
delete_data()
[Link]:
INSTALLED_APPS = [
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'rest_framework',
]
[Link] :
[Link]:
@[Link](Employee)
class EmployeeAdmin([Link]):
list_display =
['id','name','address','mail','age']
[Link]:
class EmployeeSerialzer([Link]):
name=[Link](max_length=20)
address=[Link](max_length=20)
mail=[Link](max_length=20)
age=[Link]()
[Link]=validated_data.get('name',[Link]
me)
[Link] =
validated_data.get('address', [Link])
[Link] = validated_data.get('mail',
[Link])
[Link] = validated_data.get('age',
[Link])
[Link]()
return instance
[Link]:
py_data = JSONParser().parse(stream)
id = py_data.get('id', None)
if id is not None:
emp = [Link](id=id)
serializer = EmployeeSerialzer(emp)
jsondata =
JSONRenderer().render([Link])
return HttpResponse(jsondata,
content_type='application/json')
emp = [Link]()
serializer = EmployeeSerialzer(emp,
many=True)
jsondata =
JSONRenderer().render([Link])
return HttpResponse(jsondata,
content_type='application/json')
if [Link] == 'PUT':
jsondata = [Link]
stream = [Link](jsondata)
py_data = JSONParser().parse(stream)
id = py_data.get('id')
emp = [Link](id=id)
#
serializer=EmployeeSerialzer(emp,data=py_data,parti
al=True)
serializer = EmployeeSerialzer(emp,
data=py_data)
if serializer.is_valid():
[Link]()
result = {'message': 'Data updated
into database'}
jsondata =
JSONRenderer().render(result)
return HttpResponse(jsondata,
content_type='application/json')
jsondata =
JSONRenderer().render([Link])
return HttpResponse(jsondata,
content_type='application/json')
[Link]:
urlpatterns = [
path('admin/', [Link]),
path('emp/',[Link].as_view()),
Create a new python file with the name [Link] inside the application.
[Link]:
import requests
import json
URL="[Link]
def get_record(id=None):
data={}
if id is not None:
data={'id':id}
jsondata=[Link](data)
r=[Link](url=URL,data=jsondata)
data=[Link]()
print(data)
#get_record(1)
#get_record()
def post_record():
data = {
MOHAN [Link]
'name': 'kiran',
'address': 'vizag',
'mail': 'kiran@[Link]',
'age': 28
}
jsondata=[Link](data)
r=[Link](url=URL,data=jsondata)
data=[Link]()
print(data)
#post_record()
def update_record():
data = {
'id':1,
'name': 'ramesh',
'address': 'vizag',
'mail':'ramesh@[Link]',
'age': 45
}
jsondata=[Link](data)
r=[Link](url=URL,data=jsondata)
data=[Link]()
print(data)
#update_record()
def delete_data():
data={'id':2}
jsondata=[Link](data)
r=[Link](url=URL,data=jsondata)
data=[Link]()
print(data)
delete_data()
MOHAN [Link]
DRF Validations:
Object level validation: This can be used to perform validation on all fields or
multiple fields.
Validators: This can be used to create a validation function with logic that can be
reuse in the application.
Ex:
[Link]:
from rest_framework import serializers
from [Link] import Employee
MOHAN [Link]
#validators
def starts_with_s(value):
if value[0].lower()!='s':
raise [Link]('Name
should starts with letter s')
class EmployeeSerialzer([Link]):
name=[Link](max_length=20,validators
=[starts_with_s])
address=[Link](max_length=20)
mail=[Link](max_length=20)
age=[Link]()
[Link]=validated_data.get('name',[Link]
me)
[Link] =
validated_data.get('address', [Link])
[Link] = validated_data.get('mail',
[Link])
[Link] = validated_data.get('age',
[Link])
[Link]()
return instance
if value>100:
raise [Link]("Age
should not exceed 100")
return value
Model serializer class will provide automatic serialize class with fields that
are related to model fields.
Model serializer class is just model based serializer class.
It will create automatically set of fields based on the model.
It will generate validators automatically.
It will provide default implementation of create and update methods.
Syntax:
class Meta:
model=Student
fields=['id','name','address','mail','age']
MOHAN [Link]
#fields='__all__'
[Link]:
INSTALLED_APPS = [
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'myapp1',
'rest_framework',
]
[Link] :
[Link]:
@[Link](Student)
class StudentAdmin([Link]):
list_display =
['id','name','address','mail','age']
MOHAN [Link]
[Link]:
class
StudentSerializer([Link]):
# validators
def starts_with_s(value):
if value[0].lower() != 's':
raise [Link]('Name
should starts with letter s')
#address=[Link](read_only=True)
name=[Link](validators=[starts_with_
s])
class Meta:
model=Student
#fields=['name','address','mail','age']
fields='__all__'
#read_only_fields=['address','age']
MOHAN [Link]
[Link]:
return HttpResponse(jsondata,
content_type='application/json')
into database'}
jsondata =
JSONRenderer().render(result)
return HttpResponse(jsondata,
content_type='application/json')
jsondata =
JSONRenderer().render([Link])
return HttpResponse(jsondata,
content_type='application/json')
[Link]:
urlpatterns = [
path('admin/', [Link]),
path('student/',[Link].as_view()),
MOHAN [Link]
Create a new python file with the name [Link] inside the application.
[Link]:
import requests
import json
URL="[Link]
def get_record(id=None):
data={}
if id is not None:
data={'id':id}
jsondata=[Link](data)
r=[Link](url=URL,data=jsondata)
data=[Link]()
print(data)
#get_record(1)
#get_record()
def post_record():
data = {
'name': 'sairam',
'address': 'hyd',
'mail': 'sairam@[Link]',
'age': 26
}
jsondata=[Link](data)
r=[Link](url=URL,data=jsondata)
data=[Link]()
print(data)
post_record()
MOHAN [Link]
def update_record():
data = {
'id':1,
'name': 'durga',
'address': 'hyd',
'mail':'durga@[Link]',
'age': 45
}
jsondata=[Link](data)
r=[Link](url=URL,data=jsondata)
data=[Link]()
print(data)
#update_record()
def delete_data():
data={'id':4}
jsondata=[Link](data)
r=[Link](url=URL,data=jsondata)
data=[Link]()
print(data)
#delete_data()
DRF api_view:
api_view allow us to define functions that match standard http methods like
GET, POST, PUT ,PATCH etc.
The main functionality of api_view decorator is which takes a list of HTTP
methods that your view should respond.
MOHAN [Link]
[Link] :
request. data returns the parsed content of the request body. This is
similar to the standard request. It includes all parsed content.
Response:
Response objects are initialized with data, which should consist of native
python primitives.
Headers:
HTTP Headers are an important part of the API request and response as they
represent the meta-data associated with the API request and response.
Headers carry information for: Request and Response Body
[Link]:
INSTALLED_APPS = [
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'rest_framework',
'myapp2',
]
[Link]:
class Trainer([Link]):
name=[Link](max_length=20)
address=[Link](max_length=20)
mail = [Link](max_length=20)
age = [Link]()
[Link]:
@[Link](Trainer)
class TrainerAdmin([Link]):
list_display =
['id','name','address','mail','age']
[Link]:
from rest_framework import serializers
from [Link] import Trainer
MOHAN [Link]
class
TrainerSerializer([Link]):
class Meta:
model=Trainer
fields=['id','name','address','mail','age']
[Link]:
urlpatterns = [
path('admin/', [Link]),
MOHAN [Link]
path('trainer/',views.trainer_api),
]
Create a new python file with the name [Link] inside the application.
[Link]:
import requests
import json
URL=" [Link]
def get_record(id=None):
data={}
if id is not None:
data={'id':id}
jsondata=[Link](data)
headers={'content-Type':'application/json'}
r=[Link](url=URL,headers=headers,data=jsondat
a)
data=[Link]()
print(data)
#get_record(1)
get_record()
[Link]:
INSTALLED_APPS = [
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'[Link]',
MOHAN [Link]
'[Link]',
'[Link]',
'rest_framework',
'myapp2',
]
[Link]:
from [Link] import models
[Link]:
from [Link] import admin
from [Link] import Trainer
# Register your models here.
@[Link](Trainer)
class TrainerAdmin([Link]):
list_display =
['id','name','address','mail','age']
[Link]:
class
TrainerSerializer([Link]):
class Meta:
model=Trainer
fields=['id','name','address','mail','age']
[Link]:
serializer=TrainerSerializer(tr,many=True)
return Response([Link])
if [Link]=='POST':
serializer=TrainerSerializer(data=[Link])
if serializer.is_valid():
[Link]()
return Response({"message":"Data
inserted"})
return Response([Link])
if [Link]=='PUT':
id=[Link]('id')
tr=[Link](pk=id)
serializer=TrainerSerializer(tr,data=[Link],p
artial=True)
if serializer.is_valid():
[Link]()
return Response({"message":"Data
updated"})
return Response([Link])
if [Link]=='DELETE':
id=[Link]('id')
tr=[Link](pk=id)
[Link]()
return Response({"message":"Record
deleted"})
[Link] :
urlpatterns = [
path('admin/', [Link]),
path('trainer/',views.trainer_api),
]
Create a new python file with the name [Link] inside the application.
[Link]:
import requests
import json
URL=" [Link]
def get_record(id=None):
data={}
if id is not None:
data={'id':id}
jsondata=[Link](data)
headers={'content-Type':'application/json'}
r=[Link](url=URL,headers=headers,data=jsondat
a)
data=[Link]()
print(data)
#get_record(1)
#get_record()
def post_record():
data = {
'name': 'sairam',
'address': 'hyd',
'mail': 'sairam@[Link]',
'age': 26
}
jsondata=[Link](data)
MOHAN [Link]
r=[Link](url=URL,headers=headers,data=jsonda
ta)
data=[Link]()
print(data)
#post_record()
def update_record():
data = {
'id':1,
'name': 'mohan',
'address': 'srnagar',
'mail':'mohan@[Link]',
'age': 30
}
jsondata=[Link](data)
headers = {'content-Type': 'application/json'}
r=[Link](url=URL,headers=headers,data=jsondat
a)
data=[Link]()
print(data)
#update_record()
def delete_data():
data={'id':4}
jsondata=[Link](data)
headers = {'content-Type': 'application/json'}
r=[Link](url=URL,headers=headers,data=json
data)
data=[Link]()
print(data)
MOHAN [Link]
delete_data()
Ex with CRUD APIView using class based view with browser API testing:
[Link] :
[Link]:
[Link] :
class
ManagerSerializer([Link]):
class Meta:
model=Manager
fields=['id','name','address','mail','age']
[Link] :
class ManagerAPI(APIView):
def get(self,request,pk=None,format=None):
id=pk
if id is not None:
m=[Link](id=id)
serializer=ManagerSerializer(m)
return Response([Link])
m=[Link]()
serializer=ManagerSerializer(m,many=True)
return Response([Link])
def post(self,request,format=None):
serializer=ManagerSerializer(data=[Link])
if serializer.is_valid():
[Link]()
return Response({'message':'Data
inserted'},status=status.HTTP_201_CREATED)
return
Response([Link],status=status.HTTP_400_B
AD_REQUEST)
MOHAN [Link]
def put(self,request,pk,format=None):
id=pk
m=[Link](pk=id)
serializer=ManagerSerializer(m,data=[Link])
if serializer.is_valid():
[Link]()
return Response({'message':"Data is
updated"})
return
Response([Link],status=status.HTTP_400_B
AD_REQUEST)
def patch(self,request,pk,format=None):
id=pk
m=[Link](pk=id)
serializer=ManagerSerializer(m,data=[Link],pa
rtial=True)
if serializer.is_valid():
[Link]()
return Response({'message':"partiallly
updated"})
return
Response([Link],status=status.HTTP_400_B
AD_REQUEST)
def delete(self,request,pk,format=None):
id=pk
m=[Link](pk=id)
[Link]()
return Response({'message':"Record is
deleted"})
[Link] :
urlpatterns = [
path('admin/', [Link]),
path('manager/',[Link].as_view()),
path('manager/<int:pk>',[Link].as_view())
,
]
Note: to test this, go to browser and then type
[Link]
Types of mixin:
[Link]:
INSTALLED_APPS = [
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'rest_framework',
'myapp4',
]
[Link]:
address=[Link](max_length=20)
mail = [Link](max_length=20)
age = [Link]()
[Link]:
[Link]:
from rest_framework import serializers
from [Link] import Customer
class
CustomerSerializer([Link]):
class Meta:
model=Customer
fields=['id','name','address','mail','age']
MOHAN [Link]
[Link]:
def get(self,request,*args,**kwargs):
return [Link](request,*args,**kwargs)
class
CustomerCreate(GenericAPIView,CreateModelMixin):
queryset = [Link]()
serializer_class =CustomerSerializer
def post(self,request,*args,**kwargs):
return [Link](request,*args,**kwargs)
class
CustomerRetrieve(GenericAPIView,RetrieveModelMixin)
:
queryset = [Link]()
serializer_class =CustomerSerializer
def get(self,request,*args,**kwargs):
return
[Link](request,*args,**kwargs)
MOHAN [Link]
class
CustomerUpdate(GenericAPIView,UpdateModelMixin):
queryset = [Link]()
serializer_class =CustomerSerializer
def put(self,request,*args,**kwargs):
return [Link](request,*args,**kwargs)
class
CustomerDelete(GenericAPIView,DestroyModelMixin):
queryset = [Link]()
serializer_class =CustomerSerializer
def delete(self,request,*args,**kwargs):
return [Link](request,*args,**kwargs)
#Retrieve,Update,Delete
class
Retrive_Update_Delete(GenericAPIView,RetrieveModelM
ixin,UpdateModelMixin,DestroyModelMixin):
queryset = [Link]()
serializer_class = CustomerSerializer
def put(self,request,*args,**kwargs):
return [Link](request,*args,**kwargs)
#List ,Create
MOHAN [Link]
class List_Create(GenericAPIView,ListModelMixin,
CreateModelMixin):
queryset = [Link]()
serializer_class = CustomerSerializer
[Link] :
urlpatterns = [
path('admin/', [Link]),
#path('customerlist/',[Link].as_view())
,
#path('customercreate/',[Link].as_vie
w()),
#path('customerretrieve/<int:pk>',
[Link].as_view()),
#path('customerupdate/<int:pk>',
[Link].as_view()),
#path('customerdelete/<int:pk>',
[Link].as_view()),
path('RUD/<int:pk>',views.Retrive_Update_Delete.as_
view()),
MOHAN [Link]
path('LC/',views.List_Create.as_view()),
Concrete views do most of the work that we need to do on our own when
using APIView .
They use mixins as their basic building blocks, combine the building blocks
with GenericAPIView , and bind actions to the methods.
The following are the concrete generic views.
1. ListAPIView
2. CreateAPIView
3. RetrieveAPIView
4. UpdateAPIView
5. DestroyAPIView
6. ListCreateAPIView
7. RetrieveUpdateAPIView
8. RetrieveDestroyAPIView
9. RetrieveUpdateDestroyAPIView
MOHAN [Link]
MOHAN [Link]
queryset
serializer class
[Link]:
INSTALLED_APPS = [
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'[Link]',
MOHAN [Link]
'rest_framework',
'myapp5',
]
[Link]:
from [Link] import models
[Link]:
from [Link] import admin
from [Link] import Customer
# Register your models here.
@[Link](Customer)
class CustomerAdmin([Link]):
list_display =
['id','name','address','mail','age']
[Link]:
class
CustomerSerializer([Link]):
class Meta:
model=Customer
fields=['id','name','address','mail','age']
[Link]:
CreateAPIView,RetrieveAPIView,UpdateAPIView,Destroy
APIView,
ListCreateAPIView,RetrieveUpdateAPIView,RetrieveDes
troyAPIView,RetrieveUpdateDestroyAPIView
class CustomerCreate(CreateAPIView):
queryset = [Link]()
serializer_class = CustomerSerializer
class CustomerRetrieve(RetrieveAPIView):
MOHAN [Link]
queryset = [Link]()
serializer_class = CustomerSerializer
class CustomerUpdate(UpdateAPIView):
queryset = [Link]()
serializer_class = CustomerSerializer
class CustomerDestroy(DestroyAPIView):
queryset = [Link]()
serializer_class = CustomerSerializer
class CustomerListCreate(ListCreateAPIView):
queryset = [Link]()
serializer_class = CustomerSerializer
class
CustomerRetrieveUpdate(RetrieveUpdateAPIView):
queryset = [Link]()
serializer_class = CustomerSerializer
class
CustomerRetrieveDestroy(RetrieveDestroyAPIView):
queryset = [Link]()
serializer_class = CustomerSerializer
class
CustomerRetrieveUpdateDestroy(RetrieveUpdateDestroy
APIView):
queryset = [Link]()
serializer_class = CustomerSerializer
[Link] :
urlpatterns = [
path('admin/', [Link]),
path('customerlist/',[Link].as_view()),
path('customercreate/',[Link].as_view
()),
path('customerretrieve/<int:pk>',[Link]
ieve.as_view()),
path('customerupdate/<int:pk>',[Link]
.as_view()),
path('customerdestroy/<int:pk>',
[Link].as_view()),
path('customerlistcreate/',[Link]
.as_view()),
path('customerretrieveupdate/<int:pk>',[Link]
erRetrieveUpdate.as_view()),
path('customerretrievedestroy/<int:pk>',
[Link].as_view()),
path('customerretrieveupdatedestroy/<int:pk>',
[Link].as_view()),
Django REST framework allows you to combine the logic for a set of related
views in a single class, called a ViewSet.
In other frameworks you may also find conceptually similar
implementations named something like 'Resources' or 'Controllers'.
MOHAN [Link]
A ViewSet class is simply a type of class-based View, that does not provide
any method handlers such as .get() or .post(), and instead provides actions
such as .list() and .create().
The method handlers for a ViewSet are only bound to the corresponding
actions at the point of finalizing the view, using the .as_view() method.
Typically, rather than explicitly registering the views in a viewset in the
urlconf, you'll register the viewset with a router class, that automatically
determines the urlconf for you.
Routers are used with ViewSets in django rest framework to auto config the
urls.
Routers provides a simple, quick and consistent way of writing ViewSet
logic to a set of URLs.
Router automatically maps the incoming request to proper viewset action
based on the request method type(i.e GET, POST, etc).
ViewSet attributes:
basename :
The base to use for the URL names that are created.
If unset, the basename will be automatically generated based on the queryset
attribute of the viewset.
Note that if the viewset does not include a queryset attribute then you must
set basename when registering the viewset.
action :
detail:
Return Boolean, indicates that the current action is configured for a list or
detail view.
name :
[Link]:
MOHAN [Link]
INSTALLED_APPS = [
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'rest_framework',
'myapp6',
]
[Link]:
[Link]:
[Link]:
class
CustomerSerializer([Link]):
class Meta:
model=Customer
fields=['id','name','address','mail','age']
[Link]:
cust=[Link]()
serializer=CustomerSerializer(cust,many=True)
return Response([Link])
def retrieve(selfself,request,pk=None):
id=pk
if id is not None:
cust=[Link](id=id)
serializer=CustomerSerializer(cust)
return Response([Link])
def create(self,request):
serializer=CustomerSerializer(data=[Link])
if serializer.is_valid():
[Link]()
return Response({"message":"Data
inserted"},status=status.HTTP_201_CREATED)
return
Response([Link],status=status.HTTP_400_B
AD_REQUEST)
def update(self,request,pk):
id=pk
cust=[Link](pk=id)
serializer =
CustomerSerializer(cust,data=[Link])
if serializer.is_valid():
[Link]()
return Response({"message":"Data
updated"})
return Response([Link],
status=status.HTTP_400_BAD_REQUEST)
def partial_update(self,request,pk):
id=pk
cust=[Link](pk=id)
MOHAN [Link]
serializer =
CustomerSerializer(cust,data=[Link],partial=T
rue)
if serializer.is_valid():
[Link]()
return Response({"message":"Data is
partially updated"})
return Response([Link],
status=status.HTTP_400_BAD_REQUEST)
def destroy(selfself,request,pk):
id=pk
cust=[Link](pk=id)
[Link]()
return Response({"message":"Record
deleted"})
[Link] :
urlpatterns = [
path('admin/', [Link]),
path('',include([Link])),
]
MOHAN [Link]
ReadOnlyModelViewSet:
[Link]:
INSTALLED_APPS = [
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'rest_framework',
'myapp7',
]
[Link]:
class Manager([Link]):
name=[Link](max_length=20)
address=[Link](max_length=20)
mail = [Link](max_length=20)
age = [Link]()
[Link]:
[Link]:
class
ManagerSerializer([Link]):
MOHAN [Link]
class Meta:
model=Manager
fields=['id','name','address','mail','age']
[Link]:
#ReadOnlyModelViewSet
'''class
ManagerModelViewSet([Link]):
queryset = [Link]()
serializer_class = ManagerSerializer'''
[Link]:
urlpatterns = [
MOHAN [Link]
path('admin/', [Link]),
path('',include([Link])),
Types of Authentication:
1. Basic Authentication
2. Token Authentication
3. Session Authentication
4. Remote User Authentication
5. Custom Authentication
Permissions:
Permissions are used to grant or deny access for different classes of users to
different parts of the API.
The simplest style of permission would be to allow access to any
authenticated user, and deny access to any unauthenticated user. This
corresponds to the IsAuthenticated class in REST framework.
Permission classes:
[Link]:
INSTALLED_APPS = [
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'rest_framework',
'myapp7',
]
[Link]:
class Manager([Link]):
name=[Link](max_length=20)
address=[Link](max_length=20)
mail = [Link](max_length=20)
age = [Link]()
[Link]:
[Link]:
class
ManagerSerializer([Link]):
class Meta:
MOHAN [Link]
model=Manager
fields=['id','name','address','mail','age']
[Link]:
[Link]:
urlpatterns = [
path('admin/', [Link]),
path('',include([Link])),
[Link]:
REST_FRAMEWORK={
'DEFAULT_AUTHENTICATION_CLASSES':['rest_framework.a
[Link]'],
'DEFAULT_PERMISSION_CLASSES':['rest_framework.permi
[Link]']
}
Permission classes:
AllowAny :
IsAuthenticated:
MOHAN [Link]
IsAdminUser :
IsAuthenticatedorReadOnly :
Authenticated users can access API and Unauthenticated users can only read
but can not write.
DjangoModelPermissions :
Users should be authenticated and must have enough permissions for read
and write.
DjangoModelPermissionsorAnonReadOnly :
DjangoObjectPermissions :
CustomPermissions:
MOHAN [Link]
The methods should return True if the request should be granted access, and
False otherwise.
[Link]:
INSTALLED_APPS = [
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'rest_framework',
'myapp7',
]
[Link]:
[Link]:
class
ManagerSerializer([Link]):
class Meta:
model=Manager
fields=['id','name','address','mail','age']
[Link]:
permission_classes = [CustomPermission]
[Link]:
urlpatterns = [
path('admin/', [Link]),
path('',include([Link])),
path('authentication/',include('rest_framework.urls
',namespace='rest_framework'))
[Link]:
class CustomPermission(BasePermission):
def has_permission(self, request, view):
if [Link]=='GET':
return True
return False
INSTALLED_APPS = [
...
'rest_framework.authtoken'
]
MOHAN [Link]
Note: Make sure to run [Link] migrate after changing your settings. The
rest_framework.authtoken app provides Django database migrations.
If successfully authenticated, TokenAuthentication provides the following
credentials.
[Link] will be a Django User instance.
[Link] will be a rest_framework.[Link] instance.
Unauthenticated responses that are denied permission will result in an HTTP
401 Unauthorized response .
[Link]:
INSTALLED_APPS = [
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'rest_framework',
'myapp8',
'rest_framework.authtoken',
[Link]:
MOHAN [Link]
[Link]:
class
MOHAN [Link]
ManagerSerializer([Link]):
class Meta:
model=Manager
fields=['id','name','address','mail','age']
[Link]:
[Link]:
urlpatterns = [
path('admin/', [Link]),
path('',include([Link])),
MOHAN [Link]
path('authentication/',include('rest_framework.urls
',namespace='rest_framework'))
Go to admin panel, click on tokens, click on Add token, select user for
creating a token and then click on save.
Note: if user has token then it will return that, if user don’t have any token then it
will create a token.
httpie :
[Link] :
MOHAN [Link]
urlpatterns = [
path('admin/', [Link]),
path('',include([Link])),
path('authentication/',include('rest_framework.urls
',namespace='rest_framework')),
path('gettoken/',obtain_auth_token)
]
[Link] :
@receiver(post_save,sender=settings.AUTH_USER_MODEL
)
def
create_auth_token(sender,instance=None,created=Fals
e,**kwargs):
if created:
[Link](user=instance)
Note: in this case as soon as we create a user through signal automatically token
will be create.
[Link]:
INSTALLED_APPS = [
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'rest_framework',
'myapp8',
'rest_framework.authtoken',
MOHAN [Link]
[Link]:
@receiver(post_save,sender=settings.AUTH_USER_MODEL
)
def
create_auth_token(sender,instance=None,created=Fals
e,**kwargs):
if created:
[Link](user=instance)
[Link]:
[Link]:
class
ManagerSerializer([Link]):
class Meta:
model=Manager
fields=['id','name','address','mail','age']
[Link]:
class ManagerModelViewSet([Link]):
queryset = [Link]()
serializer_class = ManagerSerializer
authentication_classes = [TokenAuthentication]
permission_classes = [IsAuthenticated]
[Link]:
urlpatterns = [
path('admin/', [Link]),
path('',include([Link])),
path('authentication/',include('rest_framework.urls
',namespace='rest_framework')),
[Link]:
INSTALLED_APPS = [
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'rest_framework',
'myapp8',
[Link]:
from [Link] import models
[Link]:
list_display =
['id','name','address','mail','age']
[Link]:
class
ManagerSerializer([Link]):
class Meta:
model=Manager
fields=['id','name','address','mail','age']
class CustomAuthentication(BaseAuthentication):
def authenticate(self, request):
username=[Link]('username')
if username is None:
return None
try:
user=[Link](username=username)
except [Link]:
raise AuthenticationFailed("User does
not exist")
return (user,None)
[Link]:
from [Link] import Manager
from [Link] import ManagerSerializer
from rest_framework import viewsets
from rest_framework.permissions import
IsAuthenticated
from [Link] import
CustomAuthentication
[Link]:
MOHAN [Link]
urlpatterns = [
path('admin/', [Link]),
path('',include([Link])),
path('authentication/',include('rest_framework.urls
',namespace='rest_framework')),
Click on the ManagerViewset link and try the below link with providing
username
[Link]
Filtering in DRF:
MOHAN [Link]
[Link] :
INSTALLED_APPS = [
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'rest_framework',
]
[Link] :
[Link] :
@[Link](Student)
class StudentAdmin([Link]):
list_display =
['id','name','sid','saddress','trainedby']
[Link]:
class
StudentSerializer([Link]):
class Meta:
model=Student
fields=['id','name','sid','saddress','trainedby']
[Link] :
MOHAN [Link]
class StudentList(ListAPIView):
queryset = [Link]()
#queryset =
[Link](trainedby="user1")
serializer_class = StudentSerializer
[Link]:
urlpatterns = [
path('admin/', [Link]),
path('studentapi/',[Link].as_view()),
]
You might want to filter the queryset to ensure that only results relevant to
the currently authenticated user making the request are returned.
You can do so by filtering based on the value of [Link]
[Link]:
class StudentList(ListAPIView):
queryset = [Link]()
serializer_class = StudentSerializer
def get_queryset(self):
user=[Link]
return
[Link](trainedby=user)
Generic Filtering:
As well as being able to override the default queryset, REST framework also
includes support for generic filtering backends that allow you to easily
construct complex searches and filters.
Generic filters can also present themselves as HTML controls in the
browsable API and admin API.
DjangoFilterBackend:
REST_FRAMEWORK = {
'DEFAULT_FILTER_BACKENDS':
['django_filters.rest_framework.DjangoFilterBackend']
}
MOHAN [Link]
[Link]:
INSTALLED_APPS = [
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'rest_framework',
'django_filters',
]
REST_FRAMEWORK={
'DEFAULT_FILTER_BACKENDS':['django_filters.rest_fra
[Link]']
}
[Link]:
class StudentList(ListAPIView):
queryset = [Link]()
MOHAN [Link]
serializer_class = StudentSerializer
filterset_fields=['saddress']
Now you can remove default filter backends from [Link] file and
try below code .
[Link]:
class StudentList(ListAPIView):
queryset = [Link]()
serializer_class = StudentSerializer
filter_backends = [DjangoFilterBackend]
filterset_fields=['saddress','trainedby']
Search Filter:
MOHAN [Link]
[Link] :
INSTALLED_APPS = [
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'rest_framework',
'django_filters',
[Link] :
[Link] :
MOHAN [Link]
@[Link](Student)
class StudentAdmin([Link]):
list_display =
['id','name','sid','saddress','trainedby']
[Link]:
class
StudentSerializer([Link]):
class Meta:
model=Student
fields=['id','name','sid','saddress','trainedby']
[Link] :
MOHAN [Link]
class StudentList(ListAPIView):
queryset = [Link]()
serializer_class = StudentSerializer
filter_backends = [SearchFilter]
search_fields=['saddress']
#search_fields = ['saddress','name']
#search_fields=['^name'] #startswith
#search_fields = ['=name'] #exact match
[Link]:
urlpatterns = [
path('admin/', [Link]),
path('studentapi/',[Link].as_view()),
]
REST_FRAMEWORK={
#'SEARCH_PARAM':'search' #default
'SEARCH_PARAM':'s'
}
Now go to browser: [Link]
Ordering Filter:
[Link]:
Pagination in DRF:
Django provides a few classes that help you manage paginated data – that is,
data that’s split across several pages, with “Previous/Next” links.
REST framework includes support for customizable pagination styles. This
allows you to modify how large result sets are split into individual pages of
data.
Pagination can be of 3 ways.
1. PageNumberPagination
2. LimitOffsetPagination
3. CursorPagination
[Link]:
REST_FRAMEWORK={
'DEFAULT_PAGINATION_CLASS':'rest_framework.paginati
[Link]',
'PAGE_SIZE':3
}
You can also set the pagination class on an individual view by using the
pagination_class attribute.
[Link] :
INSTALLED_APPS = [
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'[Link]',
MOHAN [Link]
'[Link]',
'rest_framework',
'paginationapp',
]
[Link] :
[Link] :
[Link]:
MOHAN [Link]
class
StudentSerializer([Link]):
class Meta:
model=Student
fields=['id','name','address','age']
[Link] :
[Link]:
urlpatterns = [
path('admin/', [Link]),
path('studentapi/',[Link].as_view()),
]
MOHAN [Link]
[Link]:
class MyPagination(PageNumberPagination):
page_size = 3
page_query_param = 'p'
page_size_query_param = 'records'
max_page_size = 5
[Link] :
[Link]
[Link]
This pagination style mirrors the syntax used when looking up multiple
database records. The client includes both a "limit" and an "offset" query
parameter.
The limit indicates the maximum number of items to return, and is
equivalent to the page_size in other styles. The offset indicates the starting
position of the query in relation to the complete set of unpaginated items.
To set this globally write the following code in [Link]
REST_FRAMEWORK={
'DEFAULT_PAGINATION_CLASS':'rest_framework.[Link]
etPagination'
}
[Link] :
INSTALLED_APPS = [
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'rest_framework',
'paginationapp',
]
[Link] :
MOHAN [Link]
[Link] :
[Link]:
class
StudentSerializer([Link]):
class Meta:
MOHAN [Link]
model=Student
fields=['id','name','address','age']
[Link] :
[Link]:
urlpatterns = [
path('admin/', [Link]),
path('studentapi/',[Link].as_view()),
]
[Link]:
class MyPagination(LimitOffsetPagination):
default_limit = 5
limit_query_param = 'pagelimit'
offset_query_param = 'pageoffset'
max_limit = 4
[Link] :
This pagination style only presents forward and reverse controls, and does
not allow the client to navigate to arbitrary positions.
Cursor based pagination requires that there is a unique, unchanging ordering
of items in the result set.
MOHAN [Link]
[Link]:
class MyPagination(CursorPagination):
page_size = 3
ordering = 'name'
cursor_query_param = 'c'
[Link]:
class Student([Link]):
name=[Link](max_length=20)
sid=[Link]()
saddress=[Link](max_length=20)
[Link]:
@[Link](Student)
class StudentAdmin([Link]):
list_display = ['id','name','sid','saddress']
[Link]:
class
StudentSerializer([Link]
lizer):
class Meta:
model=Student
fields=['id','url','name','sid','saddress']
[Link]:
queryset = [Link]()
serializer_class = StudentSerializer
[Link]:
router=DefaultRouter()
[Link]('studentapi',[Link]
set,basename='student')
urlpatterns = [
path('admin/', [Link]),
path('',include([Link])),
]
Throttling in DRF:
Ex:
[Link]:
INSTALLED_APPS = [
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'rest_framework',
'throttleapp',
]
[Link]:
[Link] :
@[Link](Student)
MOHAN [Link]
class StudentAdmin([Link]):
list_display = ['id','name','sid','saddress']
[Link]:
class
StudentSerializer([Link]):
class Meta:
model=Student
fields=['id','url','name','sid','saddress']
[Link]:
[Link]:
router=DefaultRouter()
[Link]('studentapi',[Link]
Set,basename='student')
urlpatterns = [
path('admin/', [Link]),
path('',include([Link])),
path('auth/',include('rest_framework.urls',namespac
e='rest_framework'))
]
[Link]:
REST_FRAMEWORK={
'DEFAULT_THROTTLE_RATES':{
'anon':'3/day',
'user':'4/hour',
}
}
Note: non authenticated user can make 3 requests per day and authenticated user
can make 4 requests per hour.
[Link] :
MOHAN [Link]
class MohanRateThrottle(UserRateThrottle):
scope='Mohan'
[Link] :
[Link] :
REST_FRAMEWORK={
'DEFAULT_THROTTLE_RATES':{
'anon':'3/day',
'user':'4/hour',
'Mohan':'2/minute'
MOHAN [Link]
}
}
REST_FRAMEWORK={
'DEFAULT_THROTTLE_CLASSES':[
'rest_framework.[Link]',
'rest_framework.[Link]'
],
'DEFAULT_THROTTLE_RATES':{
'anon':'100/day',
'user':'1000/day'