login_required decorators decoradores python django permissions decorator

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.



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