2015-06-22 93 views
1

我使用tastypie 0.12.2-dev为我的django网站创建API。我写了一个类授权(ApprovedLaptopsAuthorization),并将其用在我的ModelResource(RecordResource)类中。 RecordResource的终点是http://myserver/book/api/recordtastypie obj_create和授权

HTTP GET对该端点的请求工作正常。 (在ApprovedLaptopsAuthorization类的read_list()方法中检查权限)。现在我尝试通过发送正确的JSON数据来检查HTTP POST请求。问题是ApprovedLaptopsAuthorization方法(create_list(),create_detail())在该操作期间没有运行。因此,我不能限制访问来创建对象操作,任何用户都可以随时创建对象。我的代码中的错误在哪里?

class ApprovedLaptopsAuthorization(Authorization): 
    """ 
    Авторизация путем проверки наличия разрешения на использоание планшета, с которого осуществляется запрос 
    """ 

    def __init__(self): 
     pass 

    def read_list(self, object_list, bundle): 
     if not bundle.request.user.laptop.approved: 
      raise Unauthorized(u"Доступ планшета к данным не подтвержден администратором.") 
     return object_list 

    def read_detail(self, object_list, bundle): 
     if not bundle.request.user.laptop.approved: 
      raise Unauthorized(u"Доступ планшета к данным не подтвержден администратором.") 
     return True 

    def create_list(self, object_list, bundle): 
     print "create list" 
     if not bundle.request.user.laptop.approved: 
      raise Unauthorized(u"Доступ планшета к данным не подтвержден администратором.") 
     return object_list 

    def create_detail(self, object_list, bundle): 
     print "create detail" 
     raise BadRequest(u"Выполнение данной операции запрещено.") 

    def update_list(self, object_list, bundle): 
     raise BadRequest(u"Выполнение данной операции запрещено.") 

    def update_detail(self, object_list, bundle): 
     raise BadRequest(u"Выполнение данной операции запрещено.") 

    def delete_list(self, object_list, bundle): 
     raise BadRequest(u"Выполнение данной операции запрещено.") 

    def delete_detail(self, object_list, bundle): 
     raise BadRequest(u"Выполнение данной операции запрещено.")  


class RecordResource(ModelResource): 
    """ 
    Точка доступа к записям 
    """ 

    pages = ToManyField(PageResource, 'pages', full=True) 

    class Meta: 
     queryset = Record.objects.all() 
     limit = 0 
     max_limit = 0 
     resource_name = 'record' 
     list_allowed_methods = ['get', 'post'] 
     detail_allowed_methods = [] 
     authentication = ApiKeyAuthentication() 
     authorization = ApprovedLaptopsAuthorization() 
     serializer = CommonSerializer(formats=['json']) 
     always_return_data = True 

    def detail_uri_kwargs(self, bundle_or_obj): 
     return {} 

    @staticmethod 
    def unauthorized_result(exception): 
     raise ImmediateHttpResponse(
      response=HttpUnauthorized(
       json.dumps({'error': exception.message}, ensure_ascii=False).encode('utf-8') 
      ) 
     ) 

    def obj_get_list(self, bundle, **kwargs): 
     """ 
     :param bundle: tastypie bundle 
     :param kwargs: tastypie params 
     :return: Возвращает список записей и страниц на них 
     """ 
     bundle.request.user.laptop.ip = ip_from_bundle(bundle) 
     bundle.request.user.laptop.save() 
     return super(RecordResource, self).obj_get_list(bundle, **kwargs) 

    def obj_create(self, bundle, **kwargs): 
     """ 
     :param bundle: tastypie bundle 
     :param kwargs: tastypie params 
     :return: Создает запись и страницы на основе переданного JSON-а 
     """ 
     bundle.request.user.laptop.ip = ip_from_bundle(bundle) 
     bundle.request.user.laptop.save() 

     records = bundle.data.get('records', '') 
     if not records: 
      raise BadRequest(u"Поле записей для загрузки на сервер (records) не заполнено") 
     for recidx, record in enumerate(records): 
      pages = record.get('pages', '') 
      if not pages: 
       raise BadRequest(u"Поле страниц для загрузки на сервер (pages) не заполнено (запись {})".format(recidx)) 
      for pageidx, page in enumerate(pages): 
       image = page.get('image', '') 
       if not image: 
        BadRequest(u"Поле картинки для загрузки на сервер (image) не заполнено (запись {}, страница {})". 
           format(recidx, pageidx)) 

     for record in records: 
      new_rec = Record.objects.create(author=BookConfiguration.get_solo().record_author_default + 
              ' (' + timezone.localtime(timezone.now()).strftime('%Y-%m-%d %H:%M:%S') + ')') 
      new_rec.save() 
      pages = record['pages'] 
      for page in pages: 
       new_page = Page.objects.create(image=SimpleUploadedFile(page['image']['name'], 
               base64.b64decode(page['image']['file']), 
               page['image'].get('content_type', 
               'application/octet-stream')), record=new_rec, updated=timezone.now()) 
       new_page.save() 
     bundle.obj = new_rec 
     return bundle 

回答

0

我还没有得到答复我的问题,并增加这些线路的方法RecordResource.obj_create()的顶部:

if not bundle.request.user.laptop.approved: 
    raise Unauthorized(u"Доступ планшета к данным не подтвержден администратором.")