IES-Valle-Jerte / teleasistencia

GNU General Public License v3.0
0 stars 17 forks source link

Propuesta alumno PFC (API Rest + Postman) #6

Open fsangar opened 3 years ago

fsangar commented 3 years ago
  1. La idea genérica sería ir haciendo las peticiones en Postman y ofrecer los datos desde la API Rest utilizando django. Las peticiones son:

    • GET
    • POST
    • PUT (Falta crearlo en Postman)
    • DELETE
  2. Investigar para automatizar pruebas con Postman y así comprobar si todas las peticiones funcionan correctamente.

  3. Definir Roles en la API Rest. Limitar las acciones en función del usuario:

    • Profesor (puede realizar todas las acciones)
    • Teleoperador

Documentación django:

Para alguna de estas partes del proyecto necesitamos conocer los ficheros que vamos a tocar. Estos son:

1. urls.py Contiene las urls de la aplicación a las que va a devolver respuesta. Dentro de este fichero podemos ver:

router = routers.DefaultRouter(trailing_slash=False)
router.register(r'users', views_rest.UserViewSet)
...
router.register(r'persona', views_rest.Persona_ViewSet)

urlpatterns = [
    ...
    path('api-rest/', include(router.urls)),
    ...
]

De esta forma vamos a poder recibir peticiones de la siguiente forma:

http://localhost:8000/api-rest/users    
http://localhost:8000/api-rest/persona

La respuesta sobre las  peticiones serán devuelta por las clases UserViewSet y  Persona_ViewSet (para el ejemplo que estamos tratando) definidas en el fichero view_rest

2. serializers.py En este fichero podemos encontrar clases que permiten devolver instancias de objetos, además se puede indicar el modelo, campos y profundidad (esto sirve si hay relaciones entre objetos, ejemplo Persona con dirección).

class Persona_Serializer(serializers.ModelSerializer):
class Meta:
    model = Persona
    fields = '__all__' #Indica todos los campos
    depth = 1

3. utils.py Encontramos definidas dos funciones que nos permite obtener los parámetros pasados por URL sobre una petición GET y organizarlos para poder buscar en base de datos las coincidencias de todos o algunos estos parámetros sobre la base de datos.

En el caso de que queramos que la búsqueda pueda coincidir con TODOS de los valores def getQueryAnd(params):

En el caso de que queramos que la búsqueda pueda coincidir con ALGUNO de los valores def getQueryOr(params):

4. view_rest.py Como estructura del fichero podemos encontrar la siguiente línea en la cual se define la clase, el conjunto de valores a devolver y la clase que lo serializa, opcionalmente podemos indicar los permisos para la petición.

class Persona_ViewSet(viewsets.ModelViewSet):
    """
    API endpoint para las empresas
    """
    queryset = Persona.objects.all()
    serializer_class = Persona_Serializer
    #permission_classes = [permissions.IsAdminUser] # Si quieriéramos para todos los registrados: IsAuthenticated]

Adicionalmente podemos definir el compartimiento sobre algunas peticiones como son GET, POST, PUT…

A viewset that provides default create(), retrieve(), update(),partial_update(), destroy() and list() actions.

Algunos ejemplos de personalización son:

Obtenemos el listado de personas filtrado por los parámetros GET

def list(self, request, *args, **kwargs):
    # Hacemos una búsqueda por los valores introducidos por parámetros
    query = getQueryAnd(request.GET)
    if query:
        queryset = Persona.objects.filter(query)
# En el caso de que no hay parámetros y queramos devolver todos los valores
    else:
        queryset = self.get_queryset()

    serializer = self.get_serializer(queryset, many=True)
    return Response(serializer.data)

# Creamos una persona con por POST
def create(self, request, *args, **kwargs):
    # Comprobamos si los datos se introducen para una dirección ya existente,
    id_direccion=request.data.get("id_direccion")

    # En el caso de ser una dirección nueva
    if id_direccion is None:
        # Obtenemos los datos de dirección y los almacenamos
        direccion_serializer = Direccion_Serializer(data=request.data.get("direccion"))
        if direccion_serializer.is_valid():
            direccion = direccion_serializer.save()
        else:
            return Response("Error: direccion")

    # en el caso de ser una dirección existente
    else:
        direccion = Direccion.objects.get(pk=id_direccion)
        # Creamos la persona con la dirección y la devolvemos
    return Response(Assignar_Persona_Direccion(request.data, direccion).data)
JaviFernandezMar commented 3 years ago

Hola, me lo asigno: Javier Fernández Martín