Obtener link de un ImageField en Django Rest Framework

ImageField difiere de FileField en cuanto a que el método .link no está disponible. Enviar vía DRF (Django Rest Framework) el link a una imagen no es un proceso “trivial”. Mi implementación se basa en usar Serializer Method Field. El código que sigue creo que es bastante esclarecedor:

serializers.py

from rest_framework import serializers
from .models import User, Avatar
from django.conf import settings

class AvatarSerializer(serializers.ModelSerializer):
    """ Returns all the avatars """
    download_link = serializers.SerializerMethodField()
    class Meta:
        model = Avatar
        fields = ('id', 'user', 'avatar', 'download_link')

    # GET Must be in front
    def get_download_link(self, obj):
        return '%s/%s' % (settings.MEDIA_ROOT , obj.avatar.name)

models.py

class Avatar(models.Model):
    """ Related_name must be set in order to catch related user avatars in the serializer"""
    user = models.ForeignKey(User, related_name='avatars')
    is_active = models.BooleanField(_('Show this avatar'), default=False)
    avatar = models.ImageField(_('Your profile picture'), blank=False, upload_to=set_avatar_directory, help_text=_('Let others see a picture or artwork that identifies you.'))

Aun así, es posible que exista una forma más óptima de llevar a cabo este proceso. Si la conoces no dudes en escribir un comentario o ponerte en contacto conmigo.

Fecha por defecto en modelo Django 1.11

Existen dos formas de incluir una fecha por defecto en Django. La primera, que había estado empleando en versiones del framework anteriores sería la siguiente:

import datetime
date_of_birth = models.DateField(_('Date of Birth'), default=datetime.date.today())

Sin embargo la forma óptima de establecer esta fecha por defecto es empleando el módulo de Django timezone:

from django.utils import timezone
date_of_birth = models.DateField(_('Date of Birth'), default=timezone.now)

El motivo tiene que ver con el sistema de zonas horarias que viene por defecto activado en Django. Si se emplea la primera opción, tu aplicación no operará de forma correcta cuando se trate de fechas en distintas partes del mundo o del año (cambios anuales).

Don’t be evil

the google guys say
life’s more than just the money
do good and do well

ruthless people say
“don’t be evil” is naive
greed obscures vision

gold rush in china
civil rights violations
rationalizing

not conventional?
don’t intend to become so?
re-evaluate

no more censorship
part of repressive program
hong kong redirect

back to core values
principled approach yields trust
trust is everything

net neutrality
all bits created equal
except wireless

“no direct access”
warrantless wiretapping
more transparency

born into bondage
idealism disrupts
splinter in your mind

a bit uncharted
trying to figure it out
positive impact

act honorably
do the right thing alphabet
too conventional

 

http://dontbeevil.com/

Configuración rápida mysql Django para Ubuntu 16 / 14

Enlazar mysql con Django puede dar más de un quebradero de cabeza si no se sigue un orden secuencial de instalación de paquetes.

En primer lugar, asegúrate de instalar un servidor de mysql en tu servidor o equipo de desarrollo. Instala tambén libmysqlclient-dev, necesario para conectar python con mysql.

sudo apt-get install mysql-server
sudo apt-get install libmysqlclient-dev

Ahora instala mediante pip o tu gestor de paquetes python la librería mysqlclient.

pip install mysqlclient

A continuación entra en tu proyecto Django y abre el archivo settings.py. En la sección DATABASES, introduce el siguiente fragmento de código:

DATABASES = {
'default': {
        'ENGINE': 'django.db.backends.mysql',
        'OPTIONS': {
            'read_default_file': os.path.join(BASE_DIR, 'db.cnf'),
        },
    }
}

Por último, crea un archivo con nombre db.cnf en el directorio raíz de tu aplicación Django, y copia el siguiente texto, sustituyendo las variables por tus datos de configuración:

[client]
database = nombre_de_tu_db
user = usuario_mysql
password = contraseña_usuario
default-character-set = utf8

Esto equivaldría a:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'USER': 'usuario_mysql',
        'PASSWORD': 'contraseña_usuario'
        'NAME': 'nombre_de_tu_db',
    },
}

La base de datos que introduzcas debe ser creada de forma manual, y tras iniciar el servidor y ver que todo funciona correctamente recuerda hacer todas las migraciones pertinentes.

Forzar conexiones HTTPS en WordPress (sin usar plugins)

Si ya añadiste el prefijo https en las opciones generales de tu wordpress pero aun así algunas páginas se resisten al cambio, puedes modificar el archivo .htaccess (directorio raíz de WordPress) con el siguiente código:

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{SERVER_PORT} 80 
RewriteRule ^(.*)$ https://www.tuweb.com/$1 [R,L]
</IfModule>

# END WordPress

Si en tu archivo .htaccess ya tenías algunas reglas, simplemente déjalas bajo las tres nuevas. Por ejemplo, mi .htaccess quedó así:

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{SERVER_PORT} 80 
RewriteRule ^(.*)$ https://www.erwol.com/$1 [R,L]
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress

Crear un modelo de autenticación personalizado en Django

A modo de apunte dejo los pasos a seguir para crear un modelo de autenticación en Django 1.11. No voy a ahondar en ningún detalle ya que estos se pueden encontrar en:

1: Registra la app en la cuál vayas a especificar tu modelo de usuario dentro de settings.py.

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'tu_app'
]

2: En models.py de ‘tu_app’ añade lo siguiente:

from django.db import models
from django.contrib.auth.models import AbstractUser

class User(AbstractUser):
    pass

3: De vuelta en settings.py añade la siguiente línea:

AUTH_USER_MODEL = 'tu_app.User'

(No importa en qué punto del documento la incluyas)

4: Entra en admin.py de ‘tu_app’ y registra la siguiente entrada:

from django.contrib import admin
from .models import User
from django.contrib.auth.admin import UserAdmin

admin.site.register(User, UserAdmin)

5: Migraciones.

python manage.py makemigrations
python manage.py migrate

Y listo.

La historia del cifrado César

El cifrado César es una de las técnicas de codificación más básicas que existen, si bien es una excelente e interesante forma de iniciarse en el mundo del cifrado. En su forma original consiste en trasladar las palabras del texto a cifrar un número determinado de posiciones en el alfabeto. Este número de posiciones será la clave que necesitaremos para descifrar más tarde nuestro mensaje. Así en un simple ejemplo si quisiéramos cifrar la letra con una clave 6, simplemente desplazaríamos nuestra letra 6 posiciones en el alfabeto: a, b, c, d, e, f, g. Para descifrar la g, repetiríamos el proceso pero en orden contrario: g, f, e, d, c, b, a.

En esta imagen se muestra la codificación de la palabra ‘HOLA’ con una clave = 13.
Mapa con las conquistas de Cayo Julio César

Como podrías estar pensando, el cifrado César algo tiene que ver con el César que todos conocemos: Cayo Julio César. Resulta que allá por el 80a.c, este indiscutible genio militar precisaba de un mecanismo seguro para comunicarse con sus generales. Como entenderás, por aquel entonces era difícil incluso encontrarse con un enemigo que supiera leer, y mucho más difícil que supiera leer latín. Pero como al imperio Romano le dio por poner, a base de sangre y fuego esta lengua de moda, nuestro amigo tuvo tomar precauciones y buscarse otra forma de comunicar sus famosas estrategias. Y mirando el mapa de sus conquistas de la derecha, suponemos que este mecanismo fue bastante eficiente. Algo digno de mencionar es que la clave que empleaba era siempre la misma: 3, pues de esta forma lograba sincronizar receptores y emisores sin necesidad de mandar mensajeros de más que transportaran una clave distinta junto a cada mensaje.

Si tenía que decir algo confidencial, lo escribía usando el cifrado, esto es, cambiando el orden de las letras del alfabeto, para que ni una palabra pudiera entenderse. Si alguien quiere decodificarlo, y entender su significado, debe sustituir la cuarta letra del alfabeto, es decir, la D por la A, y así con las demás.

Suetonio, Vida de los Césares 56
El cifrado César es, además, una bonita forma de iniciarse e el mundo de la programación. En el siguiente enlace podrás encontrar el código en Java de este cifrado: https://erwol.com/es/blog/cifrado-cesar-escrito-en-java/

Bloquear puertos League of Legends – Segunda opción

 

Esta guía parte desde el punto tercero de esta otra: https://erwol.com/es/blog/bloquea-el-league-of-legends-lol-en-tu-red/

Doy por hecho que ya has accedido a la configuración de tu router. Ahora debes acceder a la configuración de puertos de tu router y bloquear los siguientes:

Ten en cuenta que estos mismos puertos podrían ser usados por otras aplicaciones de tu sistema que, tras el bloqueo, se quedarán sin conexión. 

UDP: 5000 – 5500  – Cliente League of Legends

TCP: 8393 – 8400 – Master server

TCP: 2099 – PVP.Net

TCP: 5223 – PVP.Net

TCP: 5222 – PVP.Net

Como las opciones para cerrar puertos difieren de un modelo de router a otro, nuevamente tendrás que echar mano del manual del tuyo, aunque probablemente esta opción sí que esté disponible en tu modelo.

 

 

¿Cuál es la dirección IP local de mi router?

La dirección ip local de tu router no es más que la puerta de acceso por la que todos los dispositivos conectados al mismo (tu pc, móvil, impresora o tablet). La mayoría de las veces necesitamos saber esta dirección para arreglar problemas de conectividad o para realizar configuraciones al router.

Los pasos a seguir para obtener la dirección son los siguientes:

1. Aunque suene obvio, conectarnos a la red del router. Por ejemplo al WiFi de casa, o por cable directamente al aparato (si sabes hacerlo). En principio con estar conectado al WiFi vas bien.

2. Entra al “símbolo del sistema”. Para ello escribe en la búsqueda del menú de inicio de Windows la palabra cmd y haz clic en el resultado que tenga este aspecto:

3. Se abrirá una ventana negra en la que debes escribir ipconfig y pulsar la tecla enter. Una vez pulses la tecla enter aparecerá un resultado como el siguiente:

4: No te preocupes porque los números que aparezcan en tu pantalla sean distintos a los de la imagen.

4.1 Si estás conectado sólo por WiFi localiza el recuadro rojo “Adaptador de LAN inalámbrica Wi-Fi” y una vez lo encuentres encuentra el recuadro verde “Puerta de enlace predeterminada” y copia el número que haya a su derecha. En mi caso el 192.168.1.1. Listo, ya tienes tu ip lo cal. Si vienes de otra guía, puedes volver a la misma y continuar el proceso.

4.2 Si estás conectado por Ethernet (cable) debes encontrar la sección “Adaptador de Ethernet” y dentro, la “Puerta de enlace predeterminada“. En mi caso el 192.168.1.1 y listo, ya tienes tu ip local. Si vienes de otra guía, puedes volver a la misma y continuar el proceso.

Añadir un entorno virtual (virtualenv) a Pycharm

Si te encuentras trabajando con Pycharm y a la hora de hacer algún import te encuentras con errores como “Unresolved reference ‘django’“, probablemente se te haya pasado incluir en el path de Pycharm la ruta al entorno virtual con el que estés trabajando. También puede ocurrir que realmente se te haya pasado instalar la dependencia, pero esa es otra historia.

Para añadir tu virtualenv simplemente abre tu proyecto con Pycharm, haz clic en File > Settings > Project: nombre_de_tu_proyecto > Project Interpreter > Rueda dentada > Add local > Busca tu virtual env/bin/python > Ok

Y listo, ya no debería dar problemas.