“detail”:“方法”GET \“不允许。在django中调用端点

时间:2018-03-14 02:08:46

标签: python django python-3.x django-rest-framework

我正在使用django.rest_framework。我有一个特定视图的get_or_create方法,

class LocationView(views.APIView):
    def get_or_create(self, request):
        try:
            location = Location.objects.get(country=request.data.get("country"), city=request.data.get("city"))
            Response(location, status=status.HTTP_200_OK)
        except Location.DoesNotExist:
            serializer = LocationSerializer(data=request.data)
            if serializer.is_valid():
                serializer.save()
                return Response(serializer.data, status=status.HTTP_201_CREATED)
            else:
                Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

这是位置模型,

class Location(models.Model):
    country = models.CharField(max_length=255)
    city = models.CharField(max_length=255, unique=True)
    latitude = models.CharField(max_length=255)
    longitude = models.CharField(max_length=255)

    class Meta:
        unique_together = ('country', 'city')

这是我的网址,

url(r'^location/$', LocationView.as_view(), name='location'),

当我以下列方式调用此端点时,  http://127.0.0.1:8000/api/v1/bouncer/location/?country=USA&&city=Sunnyvale&&latitude=122.0363&&longitude=37.3688

这就是我得到的,

{
    "detail": "Method \"GET\" not allowed."
}

我在这里缺少什么。

3 个答案:

答案 0 :(得分:8)

Method not allowed错误是因为它在您的API类中搜索get()方法,但找不到它。
API类的一般格式如下

class LocationView(views.APIView):
    def get(self, request):
        #do something with 'GET' method
        return Response("some data")

    def post(self, request):
        #do something with 'POST' method
        return Response("some data")


如果你想在某个时候调用get_or_create()方法,你可以像任何其他方法那样进行,

class LocationView(views.APIView):
    def get_or_create(self, request):
        # do some "get or create" stuff
        return "some data"

    def get(self, request):
        if condition:
            self.get_or_create(request)
            # do some stuff
            return Response(" some special data related to get or create")
        return Response("some data")

答案 1 :(得分:2)

您需要为getpost提供单独的方法。如果您的get方法也创建了一个实例,那么您只需在get_or_createget方法中调用当前的post

class LocationView(views.APIView):

    def get_or_create(self, request):
        # your current definition here

    def get(self, request):
       return self.get_or_create(request)

    def post(self, request):
       return self.get_or_create(request)

答案 2 :(得分:0)

对于我的情况,我按照我的预期正确发送了一个请求,一个 POST。但问题出在 http/s 上。我在我的应用程序上设置了从 httphttps 的永久重定向,因此向 POST 版本发送 http 以某种方式导致 GET服务器正在重定向。

TL;DR

HTTP 而不是 HTTPS