2012-06-07 6 views
8

私がしようとしているのは、ユーザーがすでにAPIキーを生成しているかどうかにかかわらず、ユーザーがAPIキーを要求するたびに、システムが全く新しいキーを生成することです。TastypieにはAPIキーを生成するヘルパー関数がありますか?

ApiKey.objects.create()を呼び出すと、生成されていないAPIキーが生成されます。ただし、ユーザーがある場合、.create()メソッドを呼び出すとエラーが発生します。

この場合、私は自分のキージェネレータを書くことが最善であると考えました。しかし、私はここで誰かが、私がランダムなAPIキーを生成することを可能にするヘルパー関数を知っている可能性があり、それをデータベースに手動で保存させてくれることを期待しています。

誰でもこのようなヘルパー機能を知っているだろうか?

答えて

5

私はそれを理解しました。

まず、ユーザーのAPIキーを取得しようとします。存在する場合、エラーはスローされません。再生成するには、取得したユーザーのキーの値をNoneに設定し、キーを保存します。

エラーがスローされた場合は、単に新しいキーを作成します。

try: 
    api_key = ApiKey.objects.get(user=someuser) 
    api_key.key = None 
    api_key.save() 

except ApiKey.DoesNotExist: 
    api_key = ApiKey.objects.create(user=someuser) 
+0

が、私は 'api_key.key = Noneを移動することはないと思います。 api_key。あなたがしようとしていることについて可能な限り正確になるように、tryブロックの中からsave()を実行してください。 – Jamey

4

はい、鍵を生成するためのコードは、あなたが直接使用できるインスタンスメソッドApiKey.generate_key()として定義されます。

ここでは、ユーザーが既に存在するかどうかの推測を取り入れて、暗黙のうちにApiKey.save()ではなく、ApiKey.generate_key()を直接使用しています。これは達成しようとしていることをもう少し明確にしてくれます。

api_key = ApiKey.objects.get_or_create(user=someuser) 
api_key.key = api_key.generate_key() 
api_key.save() 

UPDATE:

したがって、最短のバージョンがある:

return ApiKey.objects.get_or_create(user=someuser)[0].key 

これは、新しいキーを生成するか、既存のキーを返します。

+7

注意してください。 'get_or_create'を呼び出すと、' ApiKey'オブジェクトで作成されたタプルと 'ApiKey'オブジェクトではなくブール値が返されるので、あなたのコードは動作しません。キーは最初の文でまだ作成されているので、 'generate_key()'メソッドを再度呼び出す必要はありません。 'api_key [0] .key'と打つことで、最初の文で生成されたキーを見ることができます。 –

6

それとも、あなただけの組み込みコマンドtastypieの使用することができます。常に、作り付けの機能を利用するために、その方法はあまりにも簡単

python manage.py backfill_api_keys 
0

を。 TastypieにApiキーを生成するには、Tastypie s ApikeyAuthenticationの "create_api_key"を使用します。

あなただけtastypie.models から「create_api_key」をインポートしてdjango-signalによって、またはuが必要ですにつきとしてそれを呼び出す必要があります。

すなわち、詳細なとでより簡単で説明

signals.post_save.connect(create_api_key, sender=User) 

http://django-tastypie.readthedocs.org/en/latest/authentication.html#apikeyauthentication

関連する問題