Django Restフレームワークは、ページネーションの制限とオフセットを検証します

xtreak

デフォルトでは、Djangoの残りFrameworkが無効のために発生した例外ツバメの限界オフセット彼らが整数でない場合でも値を、デフォルトの制限値とオフセット値を返します。
また、全く存在しないmin_offsetmin_limit、したがってそれが限界とオフセットに負の値を可能にします。
APIでこれらのケースにエラーをスローする必要があります。
私はオーバーライドカスタムページネーションクラス内蔵されているpaginate_queryset方法を、そこに私の検証を行いました。最小制限値と最小オフセット値を検証するAPIはありますか?私は自分でそれを検証する以下のコードを持っています。

ドキュメントからの言及がないため、メソッド内にpaginatorの検証を記述しても大丈夫ですか、それともビューセットメソッド自体の内部で検証する必要がありますか?

class CustomPagination(pagination.LimitOffsetPagination):
    default_limit = 25
    max_limit = 50
    min_limit = 1
    min_offset = 1
    max_offset = 50

    def paginate_queryset(self, queryset, request, view=None):
        limit = request.query_params.get('limit')
        offset = request.query_params.get('offset')

        if limit:
            limit = int(limit)
            if limit > self.max_limit:
                raise serializers.ValidationError({"limit" : ["Limit should be less than or equal to {0}".format(self.max_limit)]})
            elif limit < self.min_limit:
                raise serializers.ValidationError({"limit" : ["Limit should be greater than or equal to {0}".format(self.min_limit)]})
        if offset:
            offset = int(offset)
            if offset > self.max_offset:
                raise serializers.ValidationError({"offset" : ["Offset should be less than or equal to {0}".format(self.max_offset)]})
            elif offset < self.min_offset:
                raise serializers.ValidationError({"offset" : ["Offset should be greater than or equal to {0}".format(self.min_offset)]})

        return super(self.__class__, self).paginate_queryset(queryset, request, view)
ジョン・ムタフィス

あなたは上のDRFコードを見てみた場合LimitOffsetPagination、あなたはそれを解析するために2つのメソッドを利用していることがわかりますlimitoffset

  • get_limit()

    def get_limit(self, request):
        if self.limit_query_param:
            try:
                return _positive_int(
                    request.query_params[self.limit_query_param],
                    strict=True,
                    cutoff=self.max_limit
                )
            except (KeyError, ValueError):
                pass
    
        return self.default_limit
    
  • get_offset()

    def get_offset(self, request):
        try:
            return _positive_int(
                request.query_params[self.offset_query_param],
            )
        except (KeyError, ValueError):
            return 0
    

ご覧のとおり、考えられる例外はこれら2つのメソッド内で処理されます。

したがって、あなたは簡単にそれらのメソッドをオーバーライドすることができますし、いずれかの車輪を再発明する必要はありません。
メソッドに例外をキャッチさせ、raiseそれを再度キャッチします

class CustomPagination(pagination.LimitOffsetPagination):
    default_limit = 25
    max_limit = 50
    min_limit = 1
    min_offset = 1
    max_offset = 50

    def get_limit(self, request):
        if self.limit_query_param:
            try:
                return _positive_int(
                    request.query_params[self.limit_query_param],
                    strict=True,
                    cutoff=self.max_limit
                )
            except (KeyError, ValueError) as e:
                raise e  # Re-raise the caught exception

        return self.default_limit

    def get_offset(self, request):
        try:
            return _positive_int(
                request.query_params[self.offset_query_param],
            )
        except (KeyError, ValueError) as e:
            raise e  # Re-raise the caught exception

注:
前述の機能はありますが、ユーザーが誤った引数を渡すたびにアプリケーションがクラッシュするのは非常に不便なので、使用を検討する必要があります。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Django Restフレームワーク:ModelViewSetでページネーションをオフ/オンにする方法

django Restフレームワーク-セッション認証とトークン認証、csrf

Django RESTフレームワーク:オブジェクトへのユーザーアクセスを制限する

Django Rest Framework-オプションのForeingKeyフィールドクエリセットを制限しますか?

Django RESTフレームワーク:セッションベースの認証を適切に使用する方法は?

djangoレストフレームワーク:SlugRelatedFieldオプション-ユーザーによる制限

Django RESTフレームワーク-ネストされたシリアライザーのクエリ制限?

/ o / applicationsを無効または制限します(django restフレームワーク、oauth2)

django restフレームワークでオブジェクトを作成するときに、ネストされたシリアライザーのシリアライザーにユーザーデータを渡します

djangoレストフレームワークImageFieldのカスタム検証エラーメッセージ

Django:Django Restフレームワークを既存のアプリケーションに統合する方法は?

RESTフレームワークなしのdjangoトークン認証

PlayフレームワークとDjangoの間でセッションを共有する

Django RESTフレームワークのGETネストされたシリアライザーはエラーを生成します: 'RelatedManager'オブジェクトには属性がありません 'datafile_set' "

アクションごとのDjango残りフレームワーク権限

Django RESTフレームワークシリアライザー:逆の関係の最新のオブジェクトを表示します

Django Rest Framework:ViewModelのページネーションをオンにします(ModelViewSetページネーションと同様)。

Djangoは、クエリセットのフィルターとリレーションマネージャーは同じものですか?

Django RESTフレームワークチュートリアルは、パート1でページが見つかりませんを送信します

djangoのRESTフレームワークにオブジェクトの配列を投稿する方法は?

djangoは、クラスベースビュー(ListView)でフォームセットをレンダリングおよび検証します

ページネーションと生のクエリセットを使用したdjangoエラー

Django Restフレームワークでは、lookup_fieldにいくつかのオプションを設定できます

Django RESTフレームワークPOSTネストオブジェクト

トークン認証をswagger + django restフレームワークに追加する方法は?

400の不正なリクエストエラーが発生するのはなぜですか?Django Restフレームワークをバックエンドとして使用し、ReactをWebアプリケーションのフロントエンドとして使用する

Django Restフレームワーク、シリアライザー-POSTメソッドで送信した後はホームページに戻りません

ランダムクエリセットを使用したdjangoページネーション、ルートとは異なる?page = 1コンテンツ

DjangoレストフレームワークでModelSerializerフィールドをオプションにする方法

TOP 一覧

  1. 1

    セレンのモデルダイアログからテキストを抽出するにはどうすればよいですか?

  2. 2

    Chromeウェブアプリのウェブビューの高さの問題

  3. 3

    Railsで宝石のレイアウトを使用するにはどうすればよいですか?

  4. 4

    Windows 10 Pro 1709を1803、1809、または1903に更新しますか?

  5. 5

    Ansibleで複数行のシェルスクリプトを実行する方法

  6. 6

    アンドロイド9 - キーストア例外android.os.ServiceSpecificException

  7. 7

    Postmanを使用してファイル付きの(ネストされた)jsonオブジェクトを送信する

  8. 8

    tkinterウィンドウを閉じてもPythonプログラムが終了しない

  9. 9

    GoDaddyでのCKEditorとKCfinderの画像プレビュー

  10. 10

    Python / SciPyのピーク検出アルゴリズム

  11. 11

    Swiftのブロックのパラメーターに関するドキュメントのマークアップ形式は何ですか?

  12. 12

    Windows 7では、一部のプログラムは「ビジュアルテーマを無効にする」レジストリ設定を行いませんか?

  13. 13

    Google Playストア:アプリページにリーダーボードと実績のアイコン/バッジが表示されない

  14. 14

    ezdxf pythonパッケージを使用して既存のdxfファイルを変更するにはどうすればよいですか?

  15. 15

    PyCharmリモートインタープリターはプロジェクトタブにサイトパッケージのコンテンツを表示しません

  16. 16

    MySQLでJSON_LENGTHとJSON_EXTRACTを組み合わせる方法は?

  17. 17

    Get-ADGroupMember:このリクエストのサイズ制限を超えました

  18. 18

    ZScalerと証明書の問題により、Dockerを使用できません

  19. 19

    Dynamics365からローカルファイルにアクセスできます。ローカルリソースは許可されていません

  20. 20

    Eclipseプロジェクトをエクスポートすると、不適切なテクスチャリングとクラッシュが発生します。

  21. 21

    CSSのみを使用して三角形のアニメーションを作成する方法

ホットタグ

アーカイブ