Enviar archivos multiform | Django Rest Framework

Creé este snippet para un proyecto en el que necesitaba enviar audio a un servidor vía API REST empleando el formato multipart / form data.

views.py

En el archivo de vistas se encuentra la clase AnswerCreate, que no se encarga ni más ni menos que de crear respuestas de un examen y redirigirlas para almacenarlas debidamente en la base de datos. Dicha clase hereda de CreateAPIView, una clase genérica de DRF sobre la cuál puedes leer aquí, aunque resumiento estipula que sólo podrá ser usada para crear (ni actualizar, ni listar, etc). En nuestro queryset tenemos todas las respuestas actualmente almacenadas en la BD, y en la lista de permisos indicamos que sólo usuarios autenticados podrás crear respuestas.

En nuestra lista de parsers encontramos los necesarios para admitir cabeceras que incluyan archivos. Puedes informarte en mayor profundidad sobre los parsers de DRF aquí.

Lo que encontramos a continuación es el método perform_create sobrescrito para adaptarlo a nuestras necesidades. El resto del código, junto con los ejemplos de Postman son bastante legibles.

class AnswerCreate(generics.CreateAPIView): 
    queryset = Answers.objects.all()
    serializer_class = AnswerSerializer
    # Sólo usuarios autenticados
    permission_classes = (permissions.IsAuthenticated,)
    parser_classes = (MultiPartParser,FormParser,)
    
    def perform_create(self, serializer):
        owner = self.request.user

        # audio-answer es la <em>key</em> de la petición http
        if self.request.data.get('audio-answer') is not None:
            audio_answer = self.request.data.get('audio-answer')
            serializer.save(audio_answer = audio_answer)
        else:
            raise Exception("Al audio no pudo ser enviado")

serializers.py

class AnswerSerializer(serializers.ModelSerializer):
    class Meta:
        model = Answers
        fields = ('id', 'student_name',)

models.py

class Answers(models.Model):
    student_name = models.TextField(default="Test student")
    audio_answer = models.FileField(upload_to='uploads')

Dejo adjuntas un par de capturas con una petición de prueba hecha en postman:

La mejor forma de insertar código en artículos de WordPress

Una de las ventajas de emplear el servicio de WordPress.com es la facilidad con que se pueden introducir fragmentos de código en artículos para así mostrarlos a tus visitantes, algo que en un wordpress instalado por ti mismo no viene, por alguna razón, por defecto. Sin embargo el sistema que usan en WordPress.com parece ser el de un proyecto open source que un trabajador de Auttomatic (Vipper007) tine publicado en GitHub.

La cosa es que resulta que también está, a modo de plugin en la librería de plugins de WordPress.org; tan sólo tienes que buscar SyntaxHighlighter Evolved e instalarlo. Una vez lo instales verás que el funcionamiento se basa en envolver entre dos etiquetas ‘code’ todo tu código. Puedes ver más información acerca de su uso haciendo clic aquí (sí, funcina exactamente igual que la versión de WordPress.com). Hasta ahora había usado para esta y otras webs el plugin Syntax Crayon que tampoco está nada mal pero que a mi parecer es más engorroso de configurar y algo más lento de renderizar.

 

 

Posting Source Code

[Solución ] “Error getting audio” en Chrome

Cualquier librería javascript que use APIs potentes en el sentido de que estas sean capaces de controlar aspectos sensibles o físicos de tu ordenador (como la API GetUserMedia que por ejemplo permite grabar la voz del cliente a través de su micrófono, o su imagen en directo como con una webcam) requieren de conexiones seguras a través del protocolo https.

Es decir, que si tratas de grabar audio desde http://example.com, te saltará el error ya que la conexión no es segura y ello implica que cualquiera podría estar grabando tu voz con el fin que quisiera. Por tanto la solución a este problema es configurar nuestro servidor para que acepte conexiones https. Hasta entonces será imposible lograrlo gracias a los sistemas de seguridad de Google Chrome / Chromium / Firefox.

Notar que en entornos de desarrollo (localhost) no tendremos este problema. Una buena solución para el despliegue de nuestro proyecto de forma gratuita es usar Heroku, que desde el principio provee conexiones seguras. Si estás desarrollando tu app con Django y necesitas una guía de cómo desplegar en Heroku pincha aquí.

Acceder a servidor local Django desde otro ordenador

En esta breve guía explicaré cómo podemos iniciar un servidor de desarrollo (o producción) Django y permitir el acceso a otras máquinas desde tu misma red o el exterior.

Para ello iniciamos nuestro servidor de desarrollo Django indicándole que escuche en nuestra interfaz de red:

python manage.py runserver 0.0.0.0:8000

Si ahora queremos que otras máquinas de nuestra red local se conecten a nuestro servidor, tan sólo necesitaremos conocer cuál es la ip de la computadora donde esté corriendo el servidor (mediante por ejemplo ifconfig en linux) para luego concatenar el puerto que estemos usando, 8000 en el caso base de tal forma que quedara, por ejemplo 192.168.10.4:8000.

Accediendo a 192.168.10.4:8000 podremos acceder a nuestra web.

¿Cuál es mi IP?

[spb_column width=”1/3″ el_position=”first”] [/spb_column] [spb_column width=”1/3″] [spb_raw_html width=”1/1″ el_position=”first last”]JTNDc2NyaXB0JTIwbGFuZ3VhZ2UlM0QlMjJKYXZhU2NyaXB0JTIyJTIwdHlwZSUzRCUyMnRleHQlMkZqYXZhc2NyaXB0JTIyJTIwc3JjJTNEJTIyaHR0cCUzQSUyRiUyRnd3dy52ZXJtaWlwLmVzJTJGdmVybWlpcCUyRm11ZXN0cmFpcC5waHAlMjIlM0UlM0MlMkZzY3JpcHQlM0UlMEElM0Nub3NjcmlwdCUzRSUzQ2ElMjBocmVmJTNEJTIyaHR0cCUzQSUyRiUyRnd3dy5lcndvbC5jb20lMjIlMjB0YXJnZXQlM0QlMjJfYmxhbmslMjIlM0UuLS4lM0MlMkZhJTNFJTNDJTJGbm9zY3JpcHQlM0U=[/spb_raw_html] [/spb_column] [spb_column width=”1/3″ el_position=”last”] [/spb_column]

Prueba tu diseño web en distintos dispositivos

Uno de los tantos quebraderos de cabeza que el auge de los dispositivos móviles ha traído consigo a los desarrolladores web es la infinita variedad de resoluciones de pantalla que se encuentran disponibles y a las cuales toca adaptarse. Al finalizar un proyecto querremos que este se visualice de forma correcta tanto en una pantalla de escritorio convencional, como en un smartphone o una tablet. Incluso si tuviéramos una gran variedad de dispositivos con distintas resoluciones de pantalla sería una pesadilla probar todas las posibles opciones de forma manual.

Debido a esto cada vez hay más webs que te permiten probar tu página (ya online) en distintos dispositivos con tan sólo hacer un par de clics. En mis andanzas por este tipo de sitios he encontrado todo tipo de configuraciones del servicio: las hay que muestran resultados que luego no concuerdan con la realidad, otras te piden una suscripción y otras te llenan el navegador de anuncios.

Finalmente he dado con http://mobiletest.me/, una plataforma que te ofrece un servicio tremendamente amigable para el público al que está destinado. El funcionamiento no podría ser más sencillo:

  1. Entras en la web y seleccionas un dispositivo.
  2. Introduces la url de la web que quieras visualizar y pulsas enter.
  3. En tan sólo unos segundos verás el aspecto real que tu web tendrá al ser cargada desde el dispositivo que seleccionaste en el paso 1. Ahora, usando los controles disponibles en la barra superior podrás usar unas sencillas opciones que te permitirán ver el aspecto del sitio según la inclinación del dispositivo móvil o según si tu diseño es adaptable (responsive) o no.

Si tienes una mejor alternativa no dudes en presentarla 😉