三の認定コンポーネント

三の認定コンポーネント

認証認証

あなたは、グローバル・コンフィギュレーション・ファイルのデフォルトの認証方式を設定することができます

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.SessionAuthentication',  # session认证
        'rest_framework.authentication.BasicAuthentication',   # 基本认证
    )
}

プロパティは、各ビュー内に配置されたauthentication_classessを提供することができます

from rest_framework.authentication import SessionAuthentication, BasicAuthentication
from rest_framework.views import APIView

class ExampleView(APIView):
    # 类属性
    authentication_classes = [SessionAuthentication, BasicAuthentication]
    ...

認証は、2つの可能な戻り値がありませんでした:

  • 401認証されていない不正な
  • 403許可拒否アクセス権が禁止されています

権限権限

アクセス制御は、特定のオブジェクトのデータを表示し、アクセスするためのユーザアクセスを制限することができます。

  • 発送()メソッドの実装の正面視において、最初のビューへのアクセスを判断します
  • GET_OBJECT()によって特定のオブジェクトを取得する際には、モデルオブジェクトへのアクセスを決定するために行われます

使用

あなたはこのような、構成ファイル内のグローバル管理クラスのデフォルトの権限を設定することができます

REST_FRAMEWORK = {
    ....
    
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated',
    )
}

指定されていない場合は、次のように、デフォルトの設定があります

'DEFAULT_PERMISSION_CLASSES': (
   'rest_framework.permissions.AllowAny',
)
    

それはまたのように、特定のプロパティpermission_classesビューで設定することができます

from rest_framework.permissions import IsAuthenticated
from rest_framework.views import APIView

class ExampleView(APIView):
    permission_classes = (IsAuthenticated,)
    ...
    pass

権限の提供

  • AllowAnyは、すべてのユーザーを許可します
  • isAuthenticated認証されたユーザーのみ
  • 管理者ユーザーのみIsAdminUser
  • IsAuthenticatedOrReadOnlyユーザログイン認証は、すでにデータの操作への追加や削除は、何のログイン認証は、データだけを表示することはできませんすることができます。

例えば

from rest_framework.authentication import SessionAuthentication
from rest_framework.permissions import IsAuthenticated
from rest_framework.generics import RetrieveAPIView

class StudentAPIView(RetrieveAPIView):
    queryset = Student.objects.all()
    serializer_class = StudentSerializer
    authentication_classes = [SessionAuthentication]
    permission_classes = [IsAuthenticated]
    

カスタム権限

カスタムの権限についてrest_framework.permissions.BasePermissionの親クラスを継承する必要がある、とのいずれかまたは全てに次の2つのメソッドを実装します

  • .has_permission(self, request, view)

    私は、ビューにアクセスすることができ、ビューには、現在のビューオブジェクトを表し

  • .has_object_permission(self, request, view, obj)

    あなたは、ビューは、データオブジェクトとしてobjを、現在のビューを表し、データオブジェクトにアクセスすることができます

例えば:

現在のサブアプリケーションでは、ファイルのアクセス権のカスタムパーミッションクラスpermissions.py宣言を作成します。

from rest_framework.permissions import BasePermission

class IsXiaoMingPermission(BasePermission):
    def has_permission(self, request, view):
        if( request.user.username == "xiaoming" ):
            return True
        
from .permissions import IsXiaoMingPermission
class StudentViewSet(ModelViewSet):
    queryset = Student.objects.all()
    serializer_class = StudentSerializer
    permission_classes = [IsXiaoMingPermission]
    

スロットルを制限

あなたは、サーバー上の圧力を緩和するために、アクセスインタフェースの頻度を制限することができます。

一般的に、周波数の投票を使用してシーンの支払いに使用。

使用

設定ファイルであってもよく、使用DEFAULT_THROTTLE_CLASSESしてDEFAULT_THROTTLE_RATESグローバルに設定、

REST_FRAMEWORK = {
    'DEFAULT_THROTTLE_CLASSES': (
        'rest_framework.throttling.AnonRateThrottle',
        'rest_framework.throttling.UserRateThrottle'
    ),
    'DEFAULT_THROTTLE_RATES': {
        'anon': '100/day',
        'user': '1000/day'
    }
}

DEFAULT_THROTTLE_RATESあなたは使用することができるsecondminutehourまたはdayサイクルを示すために。

また、特定の中で見ることができますthrottle_classessよう、構成プロパティに

from rest_framework.throttling import UserRateThrottle
from rest_framework.views import APIView

class ExampleView(APIView):
    throttle_classes = (UserRateThrottle,)
    ...
    pass

オプションの制限クラス

1)AnonRateThrottle

すべての匿名ユーザーは、ユーザーを区別するためにIPの不正使用を制限します。

使用DEFAULT_THROTTLE_RATES['anon']周波数を設定します

2)UserRateThrottle

区別するためのユーザーIDを使用して、ユーザー認証を制限します。

使用DEFAULT_THROTTLE_RATES['user']周波数を設定します

3)ScopedRateThrottle

各ビューに対するユーザのアクセス頻度を制限し、又はユーザIDを使用してIP。

例えば:

class ContactListView(APIView):
    throttle_scope = 'contacts'
    ...

class ContactDetailView(APIView):
    throttle_scope = 'contacts'
    ...

class UploadView(APIView):
    throttle_scope = 'uploads'
    ...
REST_FRAMEWORK = {
    'DEFAULT_THROTTLE_CLASSES': (
        'rest_framework.throttling.ScopedRateThrottle',
    ),
    'DEFAULT_THROTTLE_RATES': {
        'contacts': '1000/day',
        'uploads': '20/day'
    }
}

アクセス頻度は、グローバルコンフィギュレーションを設定されています

    'DEFAULT_THROTTLE_RATES': {
        'anon': '3/minute',
        'user': '10/minute'
    }
from rest_framework.authentication import SessionAuthentication
from rest_framework.permissions import IsAuthenticated
from rest_framework.generics import RetrieveAPIView
from rest_framework.throttling import UserRateThrottle

class StudentAPIView(RetrieveAPIView):
    queryset = Student.objects.all()
    serializer_class = StudentSerializer
    authentication_classes = [SessionAuthentication]
    permission_classes = [IsAuthenticated]
    throttle_classes = (UserRateThrottle,)

フィルターのフィルタリング

リストのためのフィールドデータに基づいてフィルタリングする必要があり、我々はサポートジャンゴ・fitlterの拡張子を追加することによって向上させることができます。

pip install django-filter

コンフィギュレーション・ファイルで提供されたフィルタの後端を増やします:

INSTALLED_APPS = [
    ...
    'django_filters',  # 需要注册应用,
]

REST_FRAMEWORK = {
    ...
    'DEFAULT_FILTER_BACKENDS': ('django_filters.rest_framework.DjangoFilterBackend',)
}

ビューでfilter_fieldsプロパティを追加し、指定したフィールドをフィルタリングすることができます

class StudentListView(ListAPIView):
    queryset = Student.objects.all()
    serializer_class = StudentSerializer
    filter_fields = ('age', 'sex')

# 127.0.0.1:8000/four/students/?sex=1

シーケンス

データのリストについては、RESTフレームワークが提供OrderingFilter指定したフィールドに基づいてソートされたデータを素早く示すために私たちを助けるためにフィルタを。

どのように使用するには:

クラスビューでfilter_backends、使用に配置されrest_framework.filters.OrderingFilter含まれている場合のパラメータは、クエリ文字列パラメータの発注依頼、発注パラメータでソートフィールドのソートデータセット指定されたパラメータに応じて発注を含めるかどうかをフィルタ、RESTフレームワークのチェックを。

またordering_fieldsに指定する必要のフロントエンドを渡すことができるパラメータフィールド値を注文。

例:

class StudentListView(ListAPIView):
    queryset = Student.objects.all()
    serializer_class = StudentModelSerializer
    filter_backends = [OrderingFilter]
    ordering_fields = ('id', 'age')

# 127.0.0.1:8000/books/?ordering=-age
# -id 表示针对id字段进行倒序排序
# id  表示针对id字段进行升序排序

あなたは、ろ過後に再度ソートする必要がある場合は、両方の組み合わせを必要とします!

from rest_framework.generics import ListAPIView
from students.models import Student
from .serializers import StudentModelSerializer
from django_filters.rest_framework import DjangoFilterBackend
class Student3ListView(ListAPIView):
    queryset = Student.objects.all()
    serializer_class = StudentModelSerializer
    filter_fields = ('age', 'sex')
    # 因为局部配置会覆盖全局配置,所以需要重新把过滤组件核心类再次声明,
    # 否则过滤功能会失效
    filter_backends = [OrderingFilter,DjangoFilterBackend]
    ordering_fields = ('id', 'age')

ページネーションページネーション

RESTフレームワークでは、ページングのサポートを提供します。

私たちは、次のような設定ファイル、グローバルでのページングモードを設定することができます。

REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS':  'rest_framework.pagination.PageNumberPagination',
    'PAGE_SIZE': 100  # 每页数目
}

ページネーションクラスは、ページング動作から別のビューを追加してカスタマイズすることができます。ビューでpagination_clasプロパティを示します。

class LargeResultsSetPagination(PageNumberPagination):
    page_size = 1000
    page_size_query_param = 'page_size'
    max_page_size = 10000
class BookDetailView(RetrieveAPIView):
    queryset = BookInfo.objects.all()
    serializer_class = BookInfoSerializer
    pagination_class = LargeResultsSetPagination

注:ビューのページング機能をオフにした場合、ちょうど考慮して設定

pagination_class = None

オプションのフィニッシャー

1)PageNumberPagination

の形でフロントアクセスのWebサイト:

GET  http://127.0.0.1:8000/students/?page=4

属性は、サブクラスで定義することができます。

  • PAGE_SIZEページ番号
  • キーワード名のフロントページは、デフォルトは「ページ」で、送られpage_query_param
  • ページ名のpage_size_query_paramあたりのキーワードの数は、フロントエンドに送られ、デフォルトはNoneです
  • フロントMAX_PAGE_SIZEまで設定ページあたり
# 声明分页的配置类
from rest_framework.pagination import PageNumberPagination
class StandardPageNumberPagination(PageNumberPagination):
    # 默认每一页显示的数据量
    page_size = 2
    # 允许客户端通过get参数来控制每一页的数据量
    page_size_query_param = "size"
    max_page_size = 10
    # 自定义页码的参数名
    page_query_param = "p"

class StudentAPIView(ListAPIView):
    queryset = Student.objects.all()
    serializer_class = StudentModelSerializer
    pagination_class = StandardPageNumberPagination

# 127.0.0.1/four/students/?p=1&size=5

2)LimitOffsetPagination

の形でフロントアクセスのWebサイト:

GET http://127.0.0.1/four/students/?limit=100&offset=400

属性は、サブクラスで定義することができます。

  • default_limitのデフォルトの制限は、デフォルトの値とPAGE_SIZE設定がされています
  • limit_query_param limitパラメータ名、デフォルトの「リミット」
  • オフセットパラメータ名をoffset_query_param、デフォルトでは「オフセット」
  • max_limit上限の制限、デフォルトなし
from rest_framework.pagination import LimitOffsetPagination
class StandardLimitOffsetPagination(LimitOffsetPagination):
    # 默认每一页查询的数据量,类似上面的page_size
    default_limit = 2
    limit_query_param = "size"
    offset_query_param = "start"

class StudentAPIView(ListAPIView):
    queryset = Student.objects.all()
    serializer_class = StudentModelSerializer
    # 调用页码分页类
    # pagination_class = StandardPageNumberPagination
    # 调用查询偏移分页类
    pagination_class = StandardLimitOffsetPagination

例外処理の例外

RESTフレームワークでは、我々は独自の例外ハンドラができ、例外処理を提供します。

from rest_framework.views import exception_handler

def custom_exception_handler(exc, context):
    # 先调用REST framework默认的异常处理方法获得标准错误响应对象
    response = exception_handler(exc, context)

    # 在此处补充自定义的异常处理
    if response is None:
        response.data['status_code'] = response.status_code

    return response

例外処理を定義した設定ファイルからの声明で

REST_FRAMEWORK = {
    'EXCEPTION_HANDLER': 'my_project.my_app.utils.custom_exception_handler'
}

宣言されていない場合は、次のように、それは、デフォルトモードを使用します。

rest_frame / settings.py

REST_FRAMEWORK = {
    'EXCEPTION_HANDLER': 'rest_framework.views.exception_handler'
}

例えば:

補足データベースに関しては例外を処理

from rest_framework.views import exception_handler as drf_exception_handler
from rest_framework import status
from django.db import DatabaseError

def exception_handler(exc, context):
    response = drf_exception_handler(exc, context)

    if response is None:
        view = context['view']
        if isinstance(exc, DatabaseError):
            print('[%s]: %s' % (view, exc))
            response = Response({'detail': '服务器内部错误'}, status=status.HTTP_507_INSUFFICIENT_STORAGE)

    return response

RESTフレームワーク定義された例外

  • すべての例外のにApiExceptionの親クラス
  • ParseErrorの解析エラー
  • AuthenticationFailed認証失敗
  • まだ認定されていませんNotAuthenticated
  • PermissionDenied権利outrightly
  • NOTFOUND見つかりません
  • MethodNotAllowedリクエストメソッドがサポートされていません
  • データ形式を取得するためにNotAcceptableがサポートされていません。
  • ストリームの数を制限するよりも絞ら
  • ValidationErrorをチェックは失敗します

言い換えれば、多くは上記の例外に記載されていない、我々は中に、独自のカスタム例外に対処する必要があります。

インターフェイスのドキュメントの自動生成

RESTフレームワークは自動的にインターフェイスのドキュメントを生成するために、私たちを助けることができます。

Webページとして提示インタフェースのドキュメント。

インターフェイスのドキュメントの自動生成から継承することができAPIViewビューとそのサブクラス。

インストールが依存します

REST framewrok世代インターフェイスのドキュメントは、必要なcoreapiライブラリをサポートします。

pip install coreapi

インタフェースドキュメント・アクセス・パスの設定

全体的な経路におけるインターフェースドキュメントパスを追加します。

ビューに対応する文書ルーティング構成rest_framework.documentation.include_docs_urls

パラメータtitleタイトルインターフェースドキュメントサイトのため。

from rest_framework.documentation import include_docs_urls

urlpatterns = [
    ...
    path('docs/', include_docs_urls(title='站点页面标题'))
]

文書は説明説明の場所を定義します

ドキュメント文字列ビュー、ビュークラスを1として使用することができる)のような単一のプロセス、

class BookListView(generics.ListAPIView):
    """
    返回所有图书信息.
    """

2)などの複数のビューを含む方法、文書文字列クラスの観点から、別々に定義された方法は、

class BookListCreateView(generics.ListCreateAPIView):
    """
    get:
    返回所有图书信息.

    post:
    新建图书.
    """

3)設定ビューセットビューの場合、ストリングクラスのドキュメントビューは依然として開くように閉じられて定義され、それは、アクションの名前を区別するために使用される、など

class BookInfoViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin, GenericViewSet):
    """
    list:
    返回图书列表数据

    retrieve:
    返回图书详情数据

    latest:
    返回最新的图书数据

    read:
    修改图书的阅读量
    """

インターフェイスのドキュメントのページへのアクセス

ブラウザアクセス127.0.0.1:8000/docs/、あなたは自動的に生成されたインタフェースのマニュアルを参照してくださいすることができます。

??æ¥å£æ?? ???? ??æ¡£ç½é¡μ

ちょうど2ポイント:

1)表示設定ビューセットは、読み込んだドキュメントインターフェイスサイトと呼ばれる、名を取得します

:2)のパラメータの説明は、次のような、モデルオプションhelp_textにクラスまたはフィールドの配列のクラスで定義される必要があります

class Student(models.Model):
    ...
    age = models.IntegerField(default=0, verbose_name='年龄', help_text='年龄')
    ...

若しくは

class StudentSerializer(serializers.ModelSerializer):
    class Meta:
        model = Student
        fields = "__all__"
        extra_kwargs = {
            'age': {
                'required': True,
                'help_text': '年龄'
            }
        }

おすすめ

転載: www.cnblogs.com/Dr-wei/p/11735538.html