【问题标题】:DJANGO REST - CLASS BASED VIEW - POST,GET requests do not work as they are definedDJANGO REST - 基于类的视图 - POST、GET 请求不按定义工作
【发布时间】:2020-07-16 22:28:18
【问题描述】:

我已经设置了一个基于类的视图来处理所有请求

  • views.py
#Imports

from django.shortcuts import render
from .serializers import UserSerializer
from rest_framework import viewsets
from django.contrib.auth.models import User
from rest_framework.decorators import api_view
from  django.http import HttpResponseForbidden
from rest_framework.response import Response
from rest_framework import status

#Imports End

class UserApiView(viewsets.ModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer

    def get(self, request, format=None):
        raise HttpResponseForbidden("Get Requests are not allowed here")

    def post(self, request, format=None):
        if request.is_ajax():
            serializer = UserSerializer(data=request.data)
            if serializer.is_valid():
                serializer.save()
                return Response(serializer.data, status=status.HTTP_201_CREATED)

        else:
            raise HttpResponseForbidden("You are not allowed to acess this page")

  • 这是序列化程序类( serializers.py
from rest_framework import serializers
from django.contrib.auth.models import User

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ['username','email','password']
        
  • urls.py 正在被 DefaultRouter() 处理
from django.urls import include, path
from rest_framework import routers
from .views import UserApiView

router = routers.DefaultRouter()
router.register(r'user',UserApiView,basename="takis")


urlpatterns = [
    path('', include(router.urls)),
]


我希望后端像帖子中所说的那样处理视图并获取请求方法,但它们似乎没有被执行。

我可以正常访问 url ,没有被禁止的错误,它接受请求,即使它们不是 ajax。

【问题讨论】:

    标签: json django ajax http django-rest-framework


    【解决方案1】:

    我不太清楚你想做什么,我知道你想接受post请求并拒绝get。你可以扩展APIView 而不是ModelViewSet

    from rest_framework.views import APIView
    
    class UserApiView(APIView):
      
        def get(self, request, format=None):
            # handle get
    
        def post(self, request, format=None):
            # handle post
    

    【讨论】:

      【解决方案2】:

      仅当您覆盖其中一种方法时,视图集才有用。

      • create()
      • retrieve()
      • update()
      • partial_update()
      • destroy()
      • list()

      如果您需要覆盖getpost 方法,最好使用APIViewGenericAPIView

      【讨论】:

      • Api View 和任何继承它的东西似乎都不起作用,因为它会抛出一个 AttributeError: type object 'UserApiView' has no attribute 'get_extra_actions'
      猜你喜欢
      • 1970-01-01
      • 2018-06-26
      • 2020-04-15
      • 2021-08-10
      • 1970-01-01
      • 2016-08-19
      • 2020-02-16
      • 1970-01-01
      • 2015-01-23
      相关资源
      最近更新 更多