ViewSets
têm métodos automáticos para listar, recuperar, criar, atualizar, excluir, ...
Eu gostaria de desabilitar alguns deles, e a solução que encontrei provavelmente não é boa, já que OPTIONS
ainda afirma aqueles como permitidos.
Alguma ideia de como fazer isso da maneira certa?
class SampleViewSet(viewsets.ModelViewSet):
queryset = api_models.Sample.objects.all()
serializer_class = api_serializers.SampleSerializer
def list(self, request):
return Response(status=status.HTTP_405_METHOD_NOT_ALLOWED)
def create(self, request):
return Response(status=status.HTTP_405_METHOD_NOT_ALLOWED)
UpdateModelMixin
. Se você quiser usar a atualização, mas não o patch, atualmente posso pensar em duas maneiras. Você pode substituir os métodos permitidos na visualização e remover "patch" ou pode substituir opartial_update
método e chamarhttp_method_not_allowed(request, *args, **kwargs)
. Eu não testei isso, então não tenho certeza se funcionaclass SampleViewSet(viewsets.ReadOnlyModelViewSet)
.Você pode continuar usando
viewsets.ModelViewSet
e definirhttp_method_names
em seu ViewSet.Exemplo
Depois de adicionar
http_method_names
, você não será capaz de fazerput
epatch
mais.Se você quiser,
put
mas não quiserpatch
, você pode manterhttp_method_names = ['get', 'post', 'head', 'put']
Internamente, as visualizações DRF estendem-se do Django CBV. Django CBV tem um atributo chamado http_method_names. Portanto, você também pode usar http_method_names com visualizações DRF.
[Shameless Plug]: Se esta resposta foi útil, você gostará da minha série de postagens sobre DRF em https://www.agiliq.com/blog/2019/04/drf-polls/ .
fonte
python3
eDjango 1.10
muito bem.mixins.UpdateModelMixin
Embora já faça um bom tempo para este post, de repente descobri que, na verdade, é uma maneira de desabilitar essas funções, você pode editá-la diretamente no views.py.
Fonte: https://www.django-rest-framework.org/api-guide/viewsets/#viewset-actions
fonte
Se você está tentando desativar o método PUT de um conjunto de visualizações DRF, pode criar um roteador personalizado:
Ao desabilitar o método no roteador, a documentação do seu esquema de API estará correta.
fonte
Como desativar o método "DELETE" para ViewSet em DRF
PS Isso é mais confiável do que especificar explicitamente todos os métodos necessários, então há menos chance de esquecer alguns dos métodos importantes OPTIONS, HEAD, etc.
PPS por padrão DRF tem
http_method_names = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace']
fonte
super
no nível da classe, não háself
.No Django Rest Framework 3.xx você pode simplesmente habilitar cada método para o qual deseja habilitar
ModelViewSet
, passando um dicionário para oas_view
método. Neste dicionário, a chave deve conter o tipo de solicitação (GET, POST, DELETE, etc) e o valor deve conter o nome do método correspondente (list, retrieve, update, etc). Por exemplo, digamos que você queira que oSample
modelo seja criado ou lido, mas não queira que ele seja modificado. Então isso significa que você querlist
,retrieve
ecreate
método seja permitir (e você quer que os outros para ser desativado.)Tudo que você precisa fazer é adicionar caminhos
urlpatterns
como estes:Como você pode ver que não há é
delete
eput
solicitação na acima configurações de roteamento, por exemplo, se você envia umaput
solicitação para o URL, resposta que você com 405Method Not Allowed
:fonte
Se você está planejando desabilitar os métodos put / post / destroy, você pode usar
fonte