私はdjango-rest-frameworkを使用しています。素晴らしいDjango管理スタイルのブラウズ可能な自己文書化APIを提供します。しかし、誰でもこれらのページにアクセスし、インターフェースを使用してデータを追加できます(POST)。どうすれば無効にできますか?
私はdjango-rest-frameworkを使用しています。素晴らしいDjango管理スタイルのブラウズ可能な自己文書化APIを提供します。しかし、誰でもこれらのページにアクセスし、インターフェースを使用してデータを追加できます(POST)。どうすれば無効にできますか?
回答:
ビューでサポートされているレンダラーのリストから、参照可能なAPIレンダラーを削除するだけです。
一般的に:
REST_FRAMEWORK = {
'DEFAULT_RENDERER_CLASSES': (
'rest_framework.renderers.JSONRenderer',
)
}
ビュー単位:
class MyView(...):
renderer_classes = [renderers.JSONRenderer]
余談:
多くの場合、閲覧可能なAPIを無効にすることを選択するのは残念なことです。これは、APIに取り組んでいる開発者にとって大きな助けとなり、それ以外の場合に許可されているよりも多くの権限が付与されないためです。私はでそうするためのビジネス上の理由があるかもしれないことを見ることができますいくつかの例が、一般的に、私はそれの巨大な資産を検討したいです。ただし、非公開APIが公開したくない詳細(カスタムアクションの名前など)が表示される場合もあります。
参照可能なAPIレンダラーを開発に制限する方法の詳細については、以下の回答も参照してください。
it's a big aid to any developers working on the API
。開発用と本番用の設定ファイルを用意する必要はありませんか?開発中は、ブラウズ可能なAPIを有効にします。
この質問に対する受け入れられた答えは、言葉どおりの質問には答えますが、それは当面の問題を解決するものではないと感じています。
この回答を完全にするために、ブラウズ可能なHTML APIを無効にするには、次のようにレンダラークラスから削除します。
REST_FRAMEWORK = {
'DEFAULT_RENDERER_CLASSES': (
'rest_framework.renderers.JSONRenderer',
)
}
ただし、質問が暗示する実際の問題は、認証なしでAPIに投稿できることです。フォームを削除するとわかりにくくなりますが、この回答はAPIエンドポイントを保護しません。
少なくとも、誰かがこの質問を見つけて、未認証または無許可のPOST送信からAPIを保護しようとしています。API権限を変更しようとしています
以下は、ユーザーが認証されない限り、すべてのエンドポイントを読み取り専用に設定します。
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.IsAuthenticatedOrReadOnly',
)
}
ユーザーがログインしていない限り、APIを完全に非表示にする場合は、も使用できますIsAuthenticated
。
参考:これは、フォームがアクセス許可に応答するため、HTMLブラウズ可能APIからも削除されます。認証されたユーザーがログインすると、フォームは再び使用可能になります。
ボーナスラウンド:
devで参照可能なHTML APIのみを有効にします。
DEFAULT_RENDERER_CLASSES = (
'rest_framework.renderers.JSONRenderer',
)
if DEBUG:
DEFAULT_RENDERER_CLASSES = DEFAULT_RENDERER_CLASSES + (
'rest_framework.renderers.BrowsableAPIRenderer',
)
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.IsAuthenticatedOrReadOnly',
),
'DEFAULT_RENDERER_CLASSES': DEFAULT_RENDERER_CLASSES
}
REST_FRAMEWORK['DEFAULT_RENDERER_CLASSES'].append('rest_framework.renderers.BrowsableAPIRenderer')
import rest_framework
For Production Only
REST_FRAMEWORK = {
'DEFAULT_RENDERER_CLASSES': (
'rest_framework.renderers.JSONRenderer',
)
}
これをSettings.pyに追加するだけで、Browsable APIが無効になります!