2016-03-15 15 views
10

Tôi mới trong khung công tác REST của Django. Ai đó có thể giải thích lý do tại sao tôi nhận được lỗi như vậy, nếu tôi thực hiện một yêu cầu POST để '/ api/index /'405 "Không cho phép phương thức POST" trong khung công tác REST của Django

405 Method Not Allowed 
{"detail":"Method \"POST\" not allowed."} 

Mã của tôi là như sau:

# views.py 
class ApiIndexView(APIView): 
    permission_classes = (permissions.AllowAny,) 

    def post(self, request, format=None): 
     return Response("ok") 

# urls.py 
urlpatterns = [ 
    url(r'^api/index/$', views.ApiIndexView.as_view()), 
] 

# settings.py 
REST_FRAMEWORK = { 
    'DEFAULT_PERMISSION_CLASSES': (
     'rest_framework.permissions.DjangoModelPermissions', 
    ), 
    'DEFAULT_AUTHENTICATION_CLASSES': (
     'rest_framework.authentication.SessionAuthentication', 
     'rest_framework.authentication.TokenAuthentication', 
    ) 
} 

Nhưng nếu tôi thêm <pk> vào mô hình của tôi , mọi thứ đều hoạt động tốt:

# views.py 
class ApiIndexView(APIView): 
    permission_classes = (permissions.AllowAny,) 

    def post(self, request, pk, format=None): 
     return Response("ok") 

# urls.py 
urlpatterns = [ 
    url(r'^api/index/(?P<pk>\d+)/$', views.ApiIndexView.as_view()), 
] 

Tôi hoàn toàn bối rối. Tại sao cần sử dụng <pk> và có cách nào để tránh sử dụng tham số này trong mẫu URL không?

+1

Lạ. Mã bạn đăng đang hoạt động cho tôi. Đây có phải là mã đầy đủ không? – ilse2005

+0

Không chính xác, tôi đặt các bộ phận mà tôi thấy quan trọng. Bất kỳ ý tưởng, nơi tôi có thể sai? – Fomalhaut

+2

Tôi đã sao chép mã từ câu hỏi của bạn và nó hoạt động. Phải có một số vấn đề khác. Bạn đang sử dụng phiên bản DRF nào? – ilse2005

Trả lời

1

Bạn cần thay đổi chỉ:

# views.py 
class ApiIndexView(UpdateView): 
    permission_classes = (permissions.AllowAny,) 

    def post(self, request, format=None): 
     return Response("ok") 
2

Hãy chắc chắn rằng bạn có "POST" trong http_method_names. Ngoài ra, bạn có thể viết như sau:

def allowed_methods(self): 
    """ 
    Return the list of allowed HTTP methods, uppercased. 
    """ 
    self.http_method_names.append("post") 
    return [method.upper() for method in self.http_method_names 
      if hasattr(self, method)] 
Các vấn đề liên quan