Зачем использовать Django REST Framework вместо того, чтобы возвращать обычный HttpResponse в представлениях?
Я новичок в Python и видел много руководств, которые переходят к Django REST Framework при обсуждении создания REST API, не объясняя, зачем нужна эта библиотека. Я не вижу смысла в использовании Django Rest Framework, когда я могу просто определить конечные точки API в представлениях и вернуть простой HttpResponse для отправки данных клиенту.
Что Django Rest Framework делает такого, чего я не могу сделать, просто используя HttpResponse? Почему это стоит изучать?
Я собирался использовать библиотеку в том виде, в котором она была включена в видео, но она показалась мне сложнее, чем нужно, и я решил попробовать создать API без Django REST Framework
def getStats(request):
print('--------STARTING Stats----------')
# Take some GET variable
version = request.GET.get('version')
# Get some data
with open('static/data.json') as f:
data = json.load(f)
# Filter the data
if version is not None:
data = list(filter(lambda x: x['version'] == version, data))
print("FILTERED DATA", len(data))
# Perform some operations on the data
data = calculateStats(data)
# Return an HTTP response
return HttpResponse(json.dumps(data))
Этот код, кажется, работает так, как нужно, и у меня есть ощущение, что я могу сделать это представление более надежным, если потребуется, исходя из требований моего приложения.
DRF - это полный набор инструментов для построения RESTful API в Django, включая аутентификацию, сериализацию и т.д. Вы можете обойтись без него, но, в конечном счете, DRF сэкономит вам много времени.
Он хорошо вписывается в архитектуру Django, а также является достаточно расширяемым, поэтому вы не будете привязаны к какому-то непонятному расширению, как это иногда случается.
Возможно, этот старый пост на reddit от Тома Кристи (создателя DRF) может пролить немного больше света:
Django REST framework не является обязательным, но он поможет вам получить много вещей, которые будут отнимать много времени и приводить к ошибкам, если вы работая с ядром Django.
Ваш пример очень прост. Когда у вас появится более сложная логика с orm, разрешениями, сериализацией и др. Вы увидите преимущества django restframework. Вы можете очень быстро создать груб, используя наборы представлений, которые гарантируют разрешения, фильтры, со структурой REST API, используя POST, GET, PATCH, PUT, DELETE. Вы можете перечислять, создавать, обновлять и удалять. Я рекомендую вам пройти учебник по restframework https://www.django-rest-framework.org/tutorial/quickstart/ и вам станет ясно, правильный это выбор или нет.
Вы также можете использовать его для своего примера следующим образом:
from rest_framework import status
from rest_framework.decorators import api_view
from rest_framework.response import Response
@api_view(['GET'])
def getStats(request):
print('--------STARTING Stats----------')
# Take some GET variable
version = request.GET.get('version')
# Get some data
with open('static/data.json') as f:
data = json.load(f)
# Filter the data
if version is not None:
data = list(filter(lambda x: x['version'] == version, data))
print("FILTERED DATA", len(data))
# Perform some operations on the data
data = calculateStats(data)
# Return an HTTP response
return Response(json.dumps(data, status=status.HTTP_200_OK)
Django REST framework offers a bunch of useful features over raw Django:
Serializers that convert between representations (dictionaries, JSON, etc.) and model instances.
Generic class-based views that let you build CRUD APIs with minimal code.
A flexible request parsing system that handles complex request datatypes, like JSON and multipart file uploads.
Customizable request authentication and permissions.
Throttling to control rate limiting.
Filtering and ordering of queryset results.
Response pagination.
API documentation with schema generation.
Content negotiation to support multiple response types (JSON, XML, etc.)
And much more!
In short, Django REST framework handles a lot of the boilerplate and complexity of building an API, allowing you to focus on your application's logic.