Estou com problemas para entender como os novos CBVs funcionam. Minha pergunta é esta: preciso solicitar o login em todas as visualizações e, em algumas delas, em permissões específicas. Nas visualizações baseadas em funções, faço isso com @permission_required () e o atributo login_required na visualização, mas não sei como fazer isso nas novas visualizações. Existe alguma seção nos documentos do django explicando isso? Eu não encontrei nada. O que há de errado no meu código?
Tentei usar o @method_decorator, mas ele respondeu " TypeError em / spaces / prueba / _wrapped_view () leva pelo menos 1 argumento (0 dado) "
Aqui está o código (GPL):
from django.utils.decorators import method_decorator
from django.contrib.auth.decorators import login_required, permission_required
class ViewSpaceIndex(DetailView):
"""
Show the index page of a space. Get various extra contexts to get the
information for that space.
The get_object method searches in the user 'spaces' field if the current
space is allowed, if not, he is redirected to a 'nor allowed' page.
"""
context_object_name = 'get_place'
template_name = 'spaces/space_index.html'
@method_decorator(login_required)
def get_object(self):
space_name = self.kwargs['space_name']
for i in self.request.user.profile.spaces.all():
if i.url == space_name:
return get_object_or_404(Space, url = space_name)
self.template_name = 'not_allowed.html'
return get_object_or_404(Space, url = space_name)
# Get extra context data
def get_context_data(self, **kwargs):
context = super(ViewSpaceIndex, self).get_context_data(**kwargs)
place = get_object_or_404(Space, url=self.kwargs['space_name'])
context['entities'] = Entity.objects.filter(space=place.id)
context['documents'] = Document.objects.filter(space=place.id)
context['proposals'] = Proposal.objects.filter(space=place.id).order_by('-pub_date')
context['publication'] = Post.objects.filter(post_space=place.id).order_by('-post_pubdate')
return context
fonte
message
a ele?Aqui está minha abordagem, eu crio um mixin que está protegido (isso é mantido na minha biblioteca de mixin):
Sempre que você deseja proteger uma visualização, basta adicionar a combinação apropriada:
Apenas certifique-se de que seu mixin seja o primeiro.
Atualização: Eu publiquei isso no caminho de volta em 2011, começando com a versão 1.9. O Django agora inclui este e outros mixins úteis (AccessMixin, PermissionRequiredMixin, UserPassesTestMixin) como padrão!
fonte
Aqui está uma alternativa usando decoradores baseados em classe:
Isso pode ser usado da seguinte maneira:
fonte
class_view_decorator(my_decorator(*args, **kwargs))
. Quanto à correspondência condicional do método - você pode modificar o class_view_decorator para aplicar-se a eleView.get
ou aoView.post
invés deleView.dispatch
.Sei que esse tópico é um pouco datado, mas aqui estão meus dois centavos de qualquer maneira.
com o seguinte código:
agora temos uma maneira de corrigir um decorador, para que ele se torne multifuncional. Isso significa efetivamente que, quando aplicado a um decorador de vista comum, é assim:
esse decorador ainda funcionará quando usado da maneira como foi originalmente planejado:
mas também funcionará corretamente quando usado da seguinte maneira:
Isso parece funcionar bem em vários casos que encontrei recentemente, incluindo este exemplo do mundo real:
A função ajax_view é gravada para modificar uma visão (baseada em função), de modo que gera um erro 404 sempre que essa visão é visitada por uma chamada que não seja ajax. Simplesmente aplicando a função de patch como um decorador, este decorador está pronto para funcionar também em visualizações baseadas em classe
fonte
Para aqueles de vocês que usam Django> = 1.9 , que já está incluído no
django.contrib.auth.mixins
comoAccessMixin
,LoginRequiredMixin
,PermissionRequiredMixin
eUserPassesTestMixin
.Portanto, para aplicar o LoginRequired ao CBV (por exemplo
DetailView
):Também é bom ter em mente a ordem do GCBV Mixin: os mixins devem ir no lado esquerdo e a classe de vista base deve ir no lado direito . Se a ordem for diferente, você poderá obter resultados quebrados e imprevisíveis.
fonte
Use chaves do Django. Ele fornece muitos mixins úteis que estão facilmente disponíveis. Tem documentos bonitos. Experimente.
Você pode até criar seus mixins personalizados.
http://django-braces.readthedocs.org/en/v1.4.0/
Código de exemplo:
fonte
Se é um site em que a maioria das páginas exige que o usuário esteja logado, você pode usar um middleware para forçar o login em todas as visualizações, exceto em algumas que são especialmente marcadas.
Antes do Django 1.10 middleware.py:
views.py:
As visualizações de terceiros que você não deseja agrupar podem ser excluídas nas configurações:
settings.py:
fonte
No meu código, escrevi este adaptador para adaptar funções-membro a uma função não-membro:
Você pode simplesmente usá-lo assim:
fonte
method_decorator
é). Parece uma maneira agradável e legível de conseguir isso.Isso é super fácil com o django> 1.9 vindo com suporte
PermissionRequiredMixin
eLoginRequiredMixin
Basta importar da autenticação
views.py
Para mais detalhes, leia Autorização no django
fonte
Já faz um tempo agora e agora o Django mudou muito.
Confira aqui como decorar uma exibição baseada em classe.
https://docs.djangoproject.com/en/2.2/topics/class-based-views/intro/#decorating-the-class
A documentação não incluiu um exemplo de "decoradores que aceitam qualquer argumento". Mas os decoradores que aceitam argumentos são assim:
portanto, se quisermos usar o mydec como um decorador "normal" sem argumentos, podemos fazer isso:
Da mesma forma, para usar
permission_required
commethod_decorator
nós podemos fazer:
fonte
Se você estiver executando um projeto que requer vários testes de permissão, poderá herdar esta classe.
fonte
Fiz essa correção com base na solução de Josh
Uso da amostra:
fonte
Aqui a solução para o decorador permission_required:
fonte