Archivos en MEDIA Django 1.11+ privados (requerir autenticación)

A menudo querremos ofrecer archivos privados en nuestra aplicación Django. La solución más sencilla a esta función es hacer una redirección vía regex a una función que lleve el decorador require_login, de la librería de Django.

Dicha redirección deberá ser incluida en el archivo urls.py principal de nuestro proyecto. Un ejemplo de implementación de esta funcionalidad es el siguiente:

urlpatterns = [
    url(r'^admin/', admin.site.urls),
]

@login_required
def protected_serve(request, path, document_root=None, show_indexes=False):
    print("Serving " + path)
    return serve(request, path, document_root, show_indexes)

urlpatterns += [
    url( r'^%s(?P<path>.*)$'% settings.MEDIA_URL[1:], protected_serve, {'document_root': settings.MEDIA_ROOT}),
]

Modificando la ruta podrás distinguir qué archivos quedan privados y cuáles no. Si tengo tiempo escribiré un par de ejemplos. Gracias por leerme 😉

Fuente: http://blog.majsky.cz/django-protected-media-files/

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.