1

私は現在、クライアントに Android を使用し、Web サーバーに Django を使用するプロジェクトに取り組んでいます。私はピストン ジャンゴを使用して REST API 認証を作成することにし、次の指示に従いました: ジャンゴ ピストン クライアントを作成する正しい方法は何ですか? 独自のハンドラー (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によると、メソッドはreadGET で呼び出され、メソッドcreateは POST で呼び出されます。したがって、クライアントが新しい API キーを作成したい場合。request.userAPI キーがまだ存在しない場合、クライアントは 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 に答える