154 lines
3.7 KiB
Markdown
154 lines
3.7 KiB
Markdown
|
# Django REST API
|
||
|
|
||
|
[Django Rest Framework](https://www.django-rest-framework.org/)
|
||
|
|
||
|
### Requerimientos Rest Framework
|
||
|
|
||
|
- Python (>=3.10)
|
||
|
- Django
|
||
|
|
||
|
Optional:
|
||
|
|
||
|
- PyYAML, uritemplate: Schema generation support.
|
||
|
- Markdown: Markdown support for the browsable API.
|
||
|
- Pygments: Add syntax highlighting to Markdown processing.
|
||
|
- django-filter: Filtering support.
|
||
|
- django-guardian: Object level permissions support.
|
||
|
|
||
|
**En entorno virtual**
|
||
|
|
||
|
```py
|
||
|
pip install djangorestframework
|
||
|
```
|
||
|
|
||
|
### Instalacion
|
||
|
|
||
|
```py
|
||
|
pip install django-extensions djangorestframework djangorestframework-jsonapi \
|
||
|
inflection python-dotenv sqlparse
|
||
|
|
||
|
Django utiliza SQLite3 por defecto facilitar el desarrolo, en este proyecto se
|
||
|
utliza MariaDB, pero es opcional.
|
||
|
|
||
|
# MariaDB
|
||
|
pip install mysqlclient
|
||
|
```
|
||
|
|
||
|
### Inicio del proyecto
|
||
|
|
||
|
```sh
|
||
|
mkdir backend
|
||
|
|
||
|
# Creación del proyecto Django
|
||
|
django-admin startproject drf_course backend
|
||
|
```
|
||
|
|
||
|
Este proyecto consta de 2 aplicaciones.
|
||
|
|
||
|
La primera es el núcleo. Esta contendrá la lógica del contacto con el *endpoint*.
|
||
|
La segunda será *ecommerce*. Esta contendrá la ĺógica del endpoint de los
|
||
|
*items* y ordenes.
|
||
|
|
||
|
```sh
|
||
|
cd backend
|
||
|
python manage.py startapp core
|
||
|
```
|
||
|
|
||
|
### Editar configuración del proyecto
|
||
|
|
||
|
Archivo [./backend/drf_course/settings.py](./backend/drf_course/settings.py).
|
||
|
|
||
|
Importar `.env` usando *python-dotenv*.
|
||
|
|
||
|
```py
|
||
|
from dotenv import load_dotenv
|
||
|
import os
|
||
|
|
||
|
load_dotenv()
|
||
|
```
|
||
|
|
||
|
Reemplazar `ALLOWED_HOSTS`, `SECRET_KEY` y `DEBUG`.
|
||
|
|
||
|
```py
|
||
|
SECRET_KEY = os.environ.get("SECRET_KEY")
|
||
|
DEBUG = int(os.environ.get("DEBUG", default=0))
|
||
|
ALLOWED_HOSTS = os.environ.get("DJANGO_ALLOWED_HOSTS").split(" ")
|
||
|
```
|
||
|
|
||
|
Añadir aplicaciones
|
||
|
```py
|
||
|
INSTALLED_APPS = [
|
||
|
'django.contrib.admin',
|
||
|
'django.contrib.auth',
|
||
|
'django.contrib.contenttypes',
|
||
|
'django.contrib.sessions',
|
||
|
'django.contrib.messages',
|
||
|
'django.contrib.staticfiles',
|
||
|
'django_extensions', # <---
|
||
|
'django_filters', # <---
|
||
|
'rest_framework', # <---
|
||
|
'core', # <---
|
||
|
]
|
||
|
|
||
|
```
|
||
|
|
||
|
Añadir variables del framework REST al final del arhivo.
|
||
|
|
||
|
```py
|
||
|
REST_FRAMEWORK = {
|
||
|
'EXCEPTION_HANDLER': 'rest_framework_json_api.exceptions.exception_handler',
|
||
|
'DEFAULT_PARSER_CLASSES': (
|
||
|
'rest_framework_json_api.parsers.JSONParser',
|
||
|
),
|
||
|
'DEFAULT_RENDERER_CLASSES': (
|
||
|
'rest_framework_json_api.renderers.JSONRenderer',
|
||
|
'rest_framework.renderers.BrowsableAPIRenderer',
|
||
|
),
|
||
|
'DEFAULT_METADATA_CLASS': 'rest_framework_json_api.metadata.JSONAPIMetadata',
|
||
|
'DEFAULT_FILTER_BACKENDS': (
|
||
|
'rest_framework_json_api.filters.QueryParameterValidationFilter',
|
||
|
'rest_framework_json_api.filters.OrderingFilter',
|
||
|
'rest_framework_json_api.django_filters.DjangoFilterBackend',
|
||
|
'rest_framework_json_api.filters.SearchFilter',
|
||
|
),
|
||
|
'SEARCH_PARAM': 'filter[search]',
|
||
|
'TEST_REQUEST_RENDERER_CLASSES': (
|
||
|
'rest_framework_json_api.renderers.JSONRenderer',
|
||
|
),
|
||
|
'TEST_REQUEST_DEFAULT_FORMAT': 'vnd.api+json'
|
||
|
}
|
||
|
```
|
||
|
|
||
|
En caso de utilizar MariaDB, cambiar la declaración de *DATABASES*, para usar
|
||
|
las variables de entorno declaradas en [./backend/env](./backend/.env)
|
||
|
|
||
|
```py
|
||
|
DATABASES = {
|
||
|
'default': {
|
||
|
'ENGINE': 'django.db.backends.mysql',
|
||
|
'NAME': os.environ.get("MARIADB_DBASE"),
|
||
|
'USER': os.environ.get("MARIADB_USER"),
|
||
|
'PASSWORD': os.environ.get("MARIADB_PASS"),
|
||
|
'HOST': os.environ.get("MARIADB_HOST"),
|
||
|
'PORT': os.environ.get("MARIADB_PORT"),
|
||
|
}
|
||
|
}
|
||
|
```
|
||
|
|
||
|
Modificar [./backend/drf_course/urls.py](./backend/drf_course/urls.py)
|
||
|
|
||
|
```py
|
||
|
from django.contrib import admin
|
||
|
from django.urls import path
|
||
|
from rest_framework import routers
|
||
|
|
||
|
router = routers.DefaultRouter()
|
||
|
|
||
|
urlpatterns = router.urls
|
||
|
|
||
|
urlpatterns += [
|
||
|
path('admin/', admin.site.urls),
|
||
|
]
|
||
|
```
|
||
|
|