2012-10-18 3 views
2

Я пытаюсь реализовать простую службу Django с RESTful API, используя tastypie. Моя проблема в том, что когда я пытаюсь создать WineResource с PUT, он отлично работает, но когда я использую POST, он возвращает ошибку HTTP 501. Читая документацию на тастипию, кажется, что она должна просто работать, но это не так.tastypie PUT работает, но POST не

Вот мой api.py код:

class CustomResource(ModelResource): 
    """Provides customizations of ModelResource""" 
    def determine_format(self, request): 
    """Provide logic to provide JSON responses as default""" 
    if 'format' in request.GET: 
     if request.GET['format'] in FORMATS: 
     return FORMATS[request.GET['format']] 
     else: 
     return 'text/html' #Hacky way to prevent incorrect formats 
    else: 
     return 'application/json' 

class WineValidation(Validation): 
    def is_valid(self, bundle, request=None): 
    if not bundle.data: 
     return {'__all__': 'No data was detected'} 

    missing_fields = [] 
    invalid_fields = [] 

    for field in REQUIRED_WINE_FIELDS: 
     if not field in bundle.data.keys(): 
     missing_fields.append(field) 
    for key in bundle.data.keys(): 
     if not key in ALLOWABLE_WINE_FIELDS: 
     invalid_fields.append(key) 

    errors = missing_fields + invalid_fields if request.method != 'PATCH' \ 
     else invalid_fields 

    if errors: 
     return 'Missing fields: %s; Invalid fields: %s' % \ 
      (', '.join(missing_fields), ', '.join(invalid_fields)) 
    else: 
     return errors 

class WineProducerResource(CustomResource): 
    wine = fields.ToManyField('wines.api.WineResource', 'wine_set', 
       related_name='wine_producer') 
    class Meta: 
    queryset = WineProducer.objects.all() 
    resource_name = 'wine_producer' 
    authentication = Authentication() #allows all access 
    authorization = Authorization() #allows all access 

class WineResource(CustomResource): 
    wine_producer = fields.ForeignKey(WineProducerResource, 'wine_producer') 

    class Meta: 
    queryset = Wine.objects.all() 
    resource_name = 'wine' 
    authentication = Authentication() #allows all access 
    authorization = Authorization() #allows all access 
    validation = WineValidation() 
    filtering = { 
     'percent_new_oak': ('exact', 'lt', 'gt', 'lte', 'gte'), 
     'percentage_alcohol': ('exact', 'lt', 'gt', 'lte', 'gte'), 
     'color': ('exact', 'startswith'), 
     'style': ('exact', 'startswith') 

    } 

    def hydrate_wine_producer(self, bundle): 
    """Use the provided WineProducer ID to properly link a PUT, POST, 
    or PATCH to the correct WineProducer instance in the db""" 
    #Workaround since tastypie has bug and calls hydrate more than once 
    try: 
     int(bundle.data['wine_producer']) 
    except ValueError: 
     return bundle 
    bundle.data['wine_producer'] = '/api/v1/wine_producer/%s/' % \ 
         bundle.data['wine_producer'] 
    return bundle 

Любая помощь очень ценится! :-)

ответ

7

Обычно это означает, что вы отправляете POST на подробный uri, например. . Поскольку POST означает обработку закрытого объекта как подчиненного, отправка POST в список uri, например. /api/v1/wine/, возможно, вы хотите.

+0

Вау, спасибо, спасли меня много времени! –

Смежные вопросы