デフォルトでは、Djangoの残りFrameworkが無効のために発生した例外ツバメの限界とオフセット彼らが整数でない場合でも値を、デフォルトの制限値とオフセット値を返します。
また、全く存在しないmin_offset
とmin_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つのメソッドを利用していることがわかりますlimit
とoffset
:
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
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]
コメントを追加