Interview question
How do you build RESTful APIs with Python frameworks? Python frameworks से RESTful APIs कैसे बनाते हैं?
Answer
# Flask-RESTful
from flask import Flask
from flask_restful import Api, Resource, reqparse
app = Flask(__name__)
api = Api(app)
class TodoItem(Resource):
def get(self, id):
return {'id': id, 'task': 'Sample task'}
def post(self, id):
parser = reqparse.RequestParser()
parser.add_argument('task', type=str, required=True)
args = parser.parse_args()
return {'id': id, 'task': args['task']}, 201
def put(self, id):
parser = reqparse.RequestParser()
parser.add_argument('task', type=str)
args = parser.parse_args()
return {'id': id, 'task': args['task']}, 200
def delete(self, id):
return {'status': 'deleted', 'id': id}, 204
api.add_resource(TodoItem, '/todos/<int:id>')
# Django REST Framework
from rest_framework import viewsets
from rest_framework.decorators import action
from rest_framework.response import Response
from .models import Todo
from .serializers import TodoSerializer
class TodoViewSet(viewsets.ModelViewSet):
queryset = Todo.objects.all()
serializer_class = TodoSerializer
@action(detail=False, methods=['get'])
def recent(self, request):
recent = Todo.objects.order_by('-created_at')[:5]
serializer = self.get_serializer(recent, many=True)
return Response(serializer.data)
# FastAPI with Pydantic
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class TodoCreate(BaseModel):
title: str
description: str = None
class Todo(TodoCreate):
id: int
todos_db = []
@app.get('/todos')
async def get_todos():
return todos_db
@app.get('/todos/{todo_id}')
async def get_todo(todo_id: int):
return next((t for t in todos_db if t['id'] == todo_id), None)
@app.post('/todos', response_model=Todo)
async def create_todo(todo: TodoCreate):
new_todo = {'id': len(todos_db) + 1, **todo.dict()}
todos_db.append(new_todo)
return new_todo
@app.put('/todos/{todo_id}')
async def update_todo(todo_id: int, todo: TodoCreate):
for t in todos_db:
if t['id'] == todo_id:
t.update(todo.dict())
return t
@app.delete('/todos/{todo_id}')
async def delete_todo(todo_id: int):
global todos_db
todos_db = [t for t in todos_db if t['id'] != todo_id]
return {'status': 'deleted'}Flask-RESTful:
class Resource
api.add_resource()
reqparse.RequestParser()
Django REST Framework:
ViewSets
Serializers
@action decorators
FastAPI:
Pydantic models
@app.get/post/put/delete
Automatic validationWas this answer clear?