簡體   English   中英

Django Rest Framework自定義帖子不允許

[英]Django rest framework custom post not allowed

我將Django REST框架用於API服務。 我在views.py中使用viewset。

我可以在viewset類中定義自定義的get函數,但是當我定義自定義的post函數時,不允許拋出POST方法。

下面的代碼

from rest_framework.decorators import detail_route
from rest_framework.decorators import list_route
from rest_framework.permissions import IsAuthenticated

from models import movies
from rest_framework import viewsets
from serializers import MoviesSerializer
from rest_framework import filters
from rest_framework.response import Response

class MoviesViewSet(viewsets.ModelViewSet):
    """
    API endpoint that allows users to be viewed or edited.
    """
    queryset = movies.objects.all()
    serializer_class = MoviesSerializer
    filter_backends = (filters.DjangoFilterBackend,)
    filter_fields = ('status', 'userID','avgRating')


    @list_route(methods=['get'])
    def movieList(self, request):
    print "mm"
        recent_users = movies.objects.all()
        page = self.paginate_queryset(recent_users)
        if page is not None:
            serializer = self.get_serializer(page, many=True)
            return self.get_paginated_response(serializer.data)

        serializer = self.get_serializer(recent_users, many=True)
        return Response(serializer.data)

    @detail_route(methods=['post'], permission_classes=[IsAuthenticated])
    def set_password(self, request, pk=None):
        print "ms"

======== urls.py

    from quickstart.views import MoviesViewSet
    from rest_framework import viewsets
    from rest_framework.response import Response
    from rest_framework.authtoken import views

    router = routers.DefaultRouter()
    router.register(r'movies', MoviesViewSet)


    urlpatterns = [
        url(r'^', include(router.urls)),
        url(r'^admin/', include(admin.site.urls)),
            url(r'^api-token-auth/', views.obtain_auth_token),

]


=============  models.py

from django.db import models
from django.db.models.signals import post_save
from django.dispatch import receiver
from rest_framework.authtoken.models import Token
from django.conf import settings


@receiver(post_save, sender=settings.AUTH_USER_MODEL)
def create_auth_token(sender, instance=None, created=False, **kwargs):
    if created:
        Token.objects.create(user=instance)

# Create your models here.

class movies(models.Model):
        class Meta:
                db_table = 'movies'

        shortDesc = models.CharField(max_length=200)
        productionYear = models.CharField(max_length=4)
        longDesc = models.TextField()
        moderatorComments = models.TextField(null=True)
        uploaded = models.DateTimeField('date published')
        modified = models.DateTimeField('date published')
        moderated = models.DateTimeField('date published',null=True)
        userID = models.IntegerField(default=0)
        private = models.IntegerField(default=0)
        avgRating = models.IntegerField(default=0)
        ratingCount = models.IntegerField(default=0)
        runtime = models.IntegerField(default=0)
        moderatorID = models.IntegerField(null=True)
        status  = models.CharField(max_length=100)
        active  = models.CharField(max_length=100)
        credits  = models.CharField(max_length=100)
        def __unicode__(self):
                return self.shortDesc


class sources(models.Model):
    class Meta:
        db_table = "sources"

    eventID = models.IntegerField(db_column="eventID")
    brandID = models.IntegerField(db_column="brandID")
    sponsorID = models.IntegerField(db_column="sponsorID")
    termsID = models.IntegerField(db_column="termsID")
    tripBudget = models.IntegerField(db_column="tripBudget")
    name = models.CharField(max_length=40)
    webfilename = models.CharField(max_length=50)
    status = models.CharField(max_length=50)
    hidden = models.CharField(max_length=50)
    custom = models.CharField(max_length=50)
    instructions = models.TextField()
    bgcolor = models.CharField(max_length=10)
    startDate =  models.DateTimeField('date published') 
    endDate =  models.DateTimeField('date published')
    closeDate = models.DateField()
    createdDate = models.DateTimeField()



class movieSources(models.Model):

        class Meta:
                db_table = "movieSources"
        movieID = models.ForeignKey(movies, related_name="movieSources", db_column="movieID", primary_key=True)
        sourceID = models.ForeignKey(sources, related_name="movieSources",db_column='sourceID',primary_key=True)


        def __unicode__(self):
            return "Event: %s" %(self.sourceID.eventID) + "," + "Source: %s" % (self.sourceID.id)

========

curl -X post http://127.0.0.1:8000/movies/set_password/ -H 'Authorization: Token 176307c4203472abda4c60a115ad3951b0301710'

您的@detail_route應該適用於單個對象,實際上您正在創建如下網址:

/movies/123/set_password/

因此,請更正客戶端上的url,或者,如果要更改queryset而不是單個對象,請使用@list_route裝飾視圖。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM