2010-05-11 7 views
9

Quiero hacer que todos los objetos de usuario tengan el mismo comportamiento de base y para hacerlo necesito agregar un par de métodos/propiedades al usuario anónimo.¿Cuál es la mejor forma de extender el usuario anónimo en Django?

Ya he subclasificado el usuario para hacer objetos de usuario más ricos, pero me preguntaba si alguien ha hecho lo mismo con el usuario anónimo. ¡Y si hay formas preferidas de hacerlo!

+2

Creo que la forma preferida de extender el modelo de usuario no es subclasificar la clase 'User' sino crear una clase' UserProfile' separada, luego agregarle los campos deseados y establecer una relación ForeignKey con la clase 'User' . –

+1

Sí, puedo ver por qué sería preferible, pero AnonymousUser no tendría un perfil de usuario de todos modos ya que no hay ningún lugar donde FK. – Ross

Respuesta

8

Su sugerencia de middleware me hizo pensar, y ahora creo que la mejor idea es sobrescribir el estándar AuthenticationMiddleware. Esa clase asigna un objeto LazyUser a la solicitud, que se resuelve al usuario correcto, cuando se accede, llamando al contrib.auth.get_user. Este es probablemente el lugar correcto para anular las cosas, por lo que llama a su función personalizada get_user que devuelve su AnonymousUser subclasificado.

+1

¡Funciona un regalo, salud, Daniel! Aquí hay una copia de la prosperidad: [custom auth backend] (http://gist.github.com/397817) – Ross

+0

Posterity ,, sry de antemano, también, gracias – jfunk

0

Debería crear una subclase o crear un modelo que tenga una relación de uno a uno con el AnonymousUser class.

+0

subclases sería ideal, pero se trata más de los aspectos prácticos de hacerlo, ya que la clase AnonymousUser se importa directamente en una serie de lugares. – Ross

2

Estoy empezando a pensar que un middleware es probablemente la solución más fácil que verifica la clase request.user y si es AnonymousUser luego lo reemplaza con un usuario anónimo subclasificado que tiene las propiedades adicionales.

¿Suena razonable?

1

Un simple y más general (pero menos seguro) solución sería simplemente reemplazar django.contrib.auth.models.AnonymousUser con su propia clase:

class YourAnonymousUser(...): 
    ... 


import django.contrib.auth.models as django_auth_models 
django_auth_models.AnonymousUser = YourAnonymousUser 

A partir de 1.10.5, Django Las importaciones de perezosamente la clase de usuario anónimo, por lo que ganó No toparse con problemas con el núcleo de Django. Además, rara vez interactúa con AnonymousUser directamente, ya que puede usar .is_anonymous(), por lo que debe estar bien siempre que sepa cómo sus dependencias usan AnonymousUser.

1

La mejor manera es usar un paquete de Python (o escribir el suyo) que intercambiará la clase de usuario anónimo de Django con su propia clase. Puede implementar un middleware para esto (creo que es el mejor lugar).

Por ejemplo, puede usar django-custom-anonymous para proporcionar la personalización de AnonymousUser. También lo puede encontrar en pypi.

+0

Si bien este enlace puede responder a la pregunta, es mejor incluir el partes esenciales de la respuesta aquí y proporcionar el enlace de referencia. Las respuestas de solo enlace pueden dejar de ser válidas si la página vinculada cambia. - [De la crítica] (/ review/low-quality-posts/18949949) –

Cuestiones relacionadas