python - decorators - Cómo escribir un decorador personalizado en django?
django decorators (5)
El problema -
@is_premium_user
def sample_view:
.......
......
Quiero que ciertos puntos de vista solo sean accesibles para los usuarios premium del sitio web.
¿Y cómo puedo usar este decorador en varias aplicaciones de mi proyecto?
Gracias a arie, la respuesta ayudó mucho, pero no funcionó para mí.
Cuando encontré este fragmento, lo hice funcionar correctamente: http://djangosnippets.org/snippets/983/
Esta solución funcionó para mí:
La función auxiliar
Esta función tiene el beneficio de ser reutilizable en otros lugares, como una sustitución del user.is_authenticated
. Podría, por ejemplo, exponerse como una etiqueta de plantilla.
def my_custom_authenticated(user):
if user:
if user.is_authenticated():
return user.groups.filter(name=settings.MY_CUSTOM_GROUP_NAME).exists()
return False
El decorador
Acabo de poner esto en la parte superior de mi views.py
, ya que es muy corto.
def membership_required(fn=None):
decorator = user_passes_test(my_custom_authenticated)
if fn:
return decorator(fn)
return decorator
Usándolo
@membership_required
def some_view(request):
...
Jugué con los diversos enlaces de arriba y no pude ponerlos en funcionamiento y luego encontré este muy simple que adapté. http://code.activestate.com/recipes/498217-custom-django-login_required-decorator/
from django.http import HttpResponseRedirect
def authors_only(function):
def wrap(request, *args, **kwargs):
profile = request.user.get_profile()
if profile.usertype == ''Author'':
return function(request, *args, **kwargs)
else:
return HttpResponseRedirect(''/'')
wrap.__doc__=function.__doc__
wrap.__name__=function.__name__
return wrap
No tiene que escribir su propio decorador para esto ya que user_passes_test
ya está incluido en Django.
Y hay un fragmento ( group_required_decorator
) que amplía este decorador y que debería ser bastante apropiado para su caso de uso.
Si realmente quieres escribir tu propio decorador, hay mucha documentación buena en la red.
Y bueno, para (re) usar el decorador simplemente coloque su decorador en un módulo en su camino y puede importarlo desde cualquier otro módulo.
Ver ejemplos en django mismo:
http://code.djangoproject.com/browser/django/trunk/django/contrib/auth/decorators.py
Su ejemplo particular probablemente sea solo una versión de ''user_passes_test'' donde la prueba será membresía del grupo ''premium''.
Para usar en cualquier lugar, cree un paquete de Python e impórtelo desde allí. Siempre y cuando esté en tu sys.path, se encontrará.
http://www.makina-corpus.org/blog/permission-required-decorator-django
Me basé en esa publicación de blog.
Pegue eso en un archivo en la ruta de Python o en una aplicación "util" e impórtelo a las vistas:
p.ej
project_dir
|_ app1
|_ app2
|_ utils
|_ __init__.py
|_ permreq.py
from util.permreq import permission_required
@permmission_required(''someapp.has_some_perm'', template=''denied.html'')
def some_view(request):
blah blah