1

我目前正在从事将 Android 用于客户端和 Django 用于 Web 服务器的项目。我决定使用活塞-django 来创建 REST API 身份验证,并遵循以下说明: 编写 django-piston 客户端的正确方法是什么? 并编写我自己的处理程序(api/handlers.py)来创建和返回 ApiKey,如下所示:

class ApiKeyhandler(Basehandler):
    model = ApiKey
    allowed_methods = ('GET', 'POST', 'PUT', 'DELETE')
    fields = ('user', 'keys')

    def create(self, request):
        attrs = self.flatten_dict(request.POST)

        if self.exists(**attrs):
            return rc.DUPLICATE_ENTRY
        else:
            apikey = ApiKey(user=request.user)
            apikey.save()

            return apikey

在 urls.py 我使用 HttpBasicAuthentication 这个处理程序:

 auth = HttpBasicAuthentication(realm="Authentication API")
 apikey = Resource(handler=ApiKeyHandler, authentication=auth)

但是当我用http://hurl.it测试它时

这是来自 GET 的响应

这是 POST 方法的响应

谁能告诉我如何为这个问题编写完整的代码或关于这个问题的任何建议?

4

1 回答 1

2

由于没有人回答这个问题,我自己想通了,并得到了朋友的帮助。我必须将 ApiKeyHandler 编辑为

class ApiKeyHandler(BaseHandler):
    model = ApiKey
    allowed_methods = ('GET', 'POST')
    fileds = ('user', 'key')

    def read(self, request):
        # Return the API key for request.user
        values_query_set = request.user.keys.values('key')
        api_key = list(values_query_set)[0]['key']
        return HttpResponse(api_key)

    def create(self, request):
        #Create a new API Key.

        # Check if API key already exists
        if request.user.keys.count() > 0:
            values_query_set = request.user.keys.values('key')
            api_key = list(values_query_set)[0]['key']
            return HttpResponse(api_key)
        else:
            # Create API key
            api_key = ApiKey(user=request.user)
            api_key.save()
        return HttpResponse(api_key)

根据django-piston doc方法read在 GETcreate上调用,在 POST 上调用方法。因此,当客户端想要创建新的 API 密钥时;request.user如果 API 密钥不存在,客户端需要请求 HTTP POST 来创建 API 密钥。

最后在 models.py 中,我需要将 ApiKey 模型编辑为

class ApiKey(models.Model):
    user = models.ForeignKey(User, related_name='keys', unique=True)
    key = models.CharField(max_length=KEY_SIZE, null=True, blank=True)

    def save(self, *args, **kwargs):
        self.key = User.objects.make_random_password(length=KEY_SIZE)

        while ApiKey.objects.filter(key__exact=self.key).count():
            self.key = User.objects.make_random_password(length=KEY_SIZE)

        super(ApiKey, self).save(*args, **kwargs)

    def __unicode__(self):
        return self.key

我们需要调用“真正的” save() 方法

super(ApiKey, self).save(*args, **kwargs)

APIKeyAuthenticatin 现在可以使用了。

最后但同样重要的是,在对用户进行身份验证时,客户端需要使用 HEADER ('Authorization', api_key) 请求 HTTP 请求。api_key必须与request.user.

于 2012-08-14T05:15:11.083 回答