22日目drf関連の使用

22日目drf関連の使用

1.インストール

画像-20201104143250581

注意:drfをインストールすると、djangoは自動的に最新バージョンにアップグレードされます。バージョンが低い場合は元に戻す必要があります。もう1つのポイントは、drfとdjangoのバージョンは互換性があるため、djangoに適したdrfを見つける必要があります。

登録済み

ダウンロード後、設定でアプリの下に登録する必要があります

画像-20201104200550244

2、安らかな仕様

RESTはテクノロジーとは関係がなく、アーキテクチャスタイル(リソース指向アーキテクチャ)を表します。RESTはRepresentational State Transferの略語で、中国語で「RepresentationalStateTransfer」と翻訳されています。

  • Representational State Transfer:Representational State Transfer
  • Web APIインターフェースのデザインスタイルは、フロントエンドとバックエンドが分離されているアプリケーションモードに特に適しています。
  • 言語やプラットフォームに関係なく、どのフレームワークでも、RESTful仕様に準拠するAPIインターフェースを記述できます。

10のルール

  • **データセキュリティ:** URLリンクは通常、送信にhttpsプロトコルを使用します

  • インターフェイス機能のパフォーマンス:apiキーワードの識別(これは一目でわかりますAPIインターフェース
    -Https://api.baidu.com/books/
    -https://www.baidu.com/api/books/

  • マルチバージョンの共存:インターフェースのバージョンはURLリンクで識別されます(Xuと同様)マルチバージョン使用したばかりのソフトウェアは引き続き使用できます異なるインターフェース
    -https://api.baidu.com/v1/books/
    -https://api.baidu.com/v2/books/

  • データはリソースであり、名詞を使用します(複数形) ***********-
    インターフェースは通常、フロントデータとバックデータの相互作用を完了するために使用されます。インタラクティブデータはリソースと呼ばれます-一般的に
    推奨されます複数形のリソース、DOは使用しないで動詞
    -queryすべてbooks-
    ます。https
    ://api.baidu.com/books/-https://api.baidu.com/get_all_books/#エラーdemonstration-
    https://api.baidu.com/delete --user
    エラーのデモンストレーション-https //api.baidu.com/user#ユーザーを削除する例:質問:削除するのですか、それとも確認するのですか?

  • リソースの操作は、リクエストメソッドによって決定されます。

    https://api.baidu.com/books       - get请求:获取所有书
    
     https://api.baidu.com/books/1     - get请求:获取主键为1的书 
    
     https://api.baidu.com/books       - post请求:新增一本书书  
    
    https://api.baidu.com/books/1     - put请求:整体修改主键为1的书  
    
    https://api.baidu.com/books/1     - patch请求:局部修改主键为1的书
    
    https://api.baidu.com/books/1     - delete请求:删除主键为1的书
    
  • URLにパラメータをアップロードして、検索条件をフィルタリングして渡します

    	https://api.example.com/v1/zoos?limit=10         :指定返回记录的数量
    
    	https://api.example.com/v1/zoos?offset=10&limit=3:指定返回记录的开始位置
    
     	https://api.example.com/v1/zoos?page=2&per_page=100:指定第几页,以及每页的记录数
    
      	https://api.example.com/v1/zoos?sortby=name&order=asc:指定返回结果按照哪个属性排序,以及排序顺序
    
    	 https://api.example.com/v1/zoos?animal_type_id=1:指定筛选条件
    
  • 返された結果のエラーメッセージ
    -{'code':100、 'msg': 'Failed due to xx')

  • 返される結果は、次の仕様を満たす必要があります

    		GET /collection:返回资源对象的列表(数组)
            GET /collection/resource:返回单个资源对象(字典)
            POST /collection:返回新生成的资源对象    (新增后的对象字典)
            PUT /collection/resource:返回完整的资源对象 (修改后的对象字典)
            PATCH /collection/resource:返回完整的资源对象 (修改后的对象字典)
            DELETE /collection/resource:返回一个空文档   ()
    
  • 返されたデータのリンクアドレス

-查询id为1的图书接口,返回结果示例
    	{'code':100,
         'msg':'成功',
         'result':
             {'title':'superstar',
              'price':12.3,
              'publish':'https://127.0.0.1/api/v1/publish/3'
             }
        }

3、APIviewソースコード分析

1. APIview的as_view

内部的には、Vewのクロージャ関数ビューが実行されます

無効なcsrf

すべてがオブジェクトであり、関数もオブジェクトであり、函数地址.name = ssd

2.ネイティブViewクラスのas_viewのクロージャ関数ビュー

基本的に実行されself.dispatch(request, *args, **kwargs)、APIViewのディスパッチが実行されます

3.APIViewのディスパッチ

def dispatch(self, request, *args, **kwargs):

        # DRF的Request类的对象,内部有request._request,是原生request

        request = self.initialize_request(request, *args, **kwargs)
        self.request = request
	try:
        self.initial(request, *args, **kwargs)
        '''
        #认证,权限,频率
        self.perform_authentication(request)
    	self.check_permissions(request)
    	self.check_throttles(request)
        '''
        if request.method.lower() in self.http_method_names:
            handler = getattr(self, request.method.lower(),
                              self.http_method_not_allowed)
        else:
            handler = self.http_method_not_allowed

        response = handler(request, *args, **kwargs)

    except Exception as exc:
        # 全局的异常捕获
        response = self.handle_exception(exc)
	# 把视图函数(类)返回的response,又包装了一下
    self.response = self.finalize_response(request, response, *args, **kwargs)
    return self.response

画像-20201104172436751

4、リクエスト分析

1 Request类
	-request._request:原生request
    -request.data    : post请求提交的数据(urlencoded,json,formdata)
    -request.user    :不是原生的user了
    -request.query_params :原生的request.GET,为了遵循restful规范
    -requset.FILES   :新的
    -重写了__getattr__,新的request.原来所有的属性和方法,都能直接拿到
        def __getattr__(self, attr):
            return getattr(self._request, attr)

5、シリアル化コンポーネントの紹介

1.シリアル化

シリアライザーはモデルオブジェクトを辞書に変換し、応答後にjson文字列をプログラムします

2.逆シリアル化

Buckhuadanが送信するのはデータであり、要求後に辞書になります。シリアライザーは辞書をモデルに変換できます。

json形式のデータ---- drf:リクエスト---->辞書-シリアライザー->ブック

3.逆シリアル化、完全なデータ検証機能

6、使いやすいシリアル化グループ

1.シリアル化されたpyファイルを作成します

serializer.py

2. serializers.Serializerを継承するクラスを作成し、クラスでシリアル化するフィールドを作成します

from rest_framework import serializers


class BookSerializer(serializers.Serializer):
    id = serializers.IntegerField(required=True)
    name = serializers.CharField(max_length=32, min_length=3)
    price = serializers.DecimalField(max_digits=5, decimal_places=2)
    publish = serializers.CharField(max_length=10)

3.関連

# modles.py

class Book(models.Model):
    name = models.CharField(max_length=32)
    price = models.DecimalField(max_digits=5, decimal_places=2)
    publish = models.CharField(max_length=32)
# views.py

class Book(APIView):
    # get 接口 用来查询所有
    def get(self, request, *args, **kwargs):
        result = models.Book.objects.all()
        # 借助序列化器
        # 如果是多条,就是many=True
        # 如果是单个对象,就不写
        ser = serializer.BookSerializer(instance=result, many=True)
        print(type(ser))  # rest_frameword.serializers.ListSerializer
        print(ser.data)   # 得到的是一个通过序列器的字典
        
        return Response(ser.data)  # 这是使用的是自己的Response
# urls.py

    url(r'^book/', views.Book.as_view()),

7つのシリアル化クラスのフィールドタイプとフィールドパラメータ

フィールドタイプ(以下の要点)

  • IntegerField
  • チャーフィールド
  • DecimalField
  • DateTimeField
  • …非常に多くがモデルのものと似ています

共通フィールドパラメータ

オプションパラメータ

  • max_length最大長
  • min_length最小長
  • allow_blankを空にすることができるかどうか(通常は使用されません)
  • trim_whitespace空白文字を切り捨てるかどうか(通常、spripと同等ではありません)
  • max_value maximum
  • min_value最小

一般的なパラメータ

フォーカス

  • read_onlyは、フィールドがシリアル化された出力にのみ使用されることを示します。デフォルトはFalseです。
  • write_onlyは、フィールドが入力の逆シリアル化にのみ使用されることを示します。デフォルトはFalseです。

把握

  • requiredは、逆シリアル化中にフィールドに入力する必要があることを示します。デフォルトはTrueです。
  • default逆シリアル化時に使用されるデフォルト値
  • allow_nullは、フィールドの受け渡しが許可されているかどうかを示します。デフォルトはFalseです。

理解するために

  • バリデーターフィールドで使用されるバリデーター
  • error_messagesエラー番号とエラーメッセージを含む辞書

8.シリアライザーの保存機能

    def post(self, request):
        print(request.data)
        # 反序列化后的数据
        ser = serializer.BookSerializer(data=request.data)
        if ser.is_valid():  # 校验数据是否可用
            ser.save()  # 保存到数据库(仅仅是save无法保存 要在序列化类中 写一个create方法)
            # 根据resful规范 返回数据 返回新生成的资源对象    (新增后的对象字典)
            return Response(ser.data)
        else:
            # 返回错误信息
            return Response(ser.errors)

次に、postmanを使用してリクエストをシミュレートします

画像-20201104193212767

バックエンドはデータを取得しましたが、作成エラーを報告しました

画像-20201104193246283

画像-20201104193128944

次に、createメソッドを実装します

class BookSerializer(serializers.Serializer):
    id = serializers.IntegerField(required=False)
    name = serializers.CharField(max_length=32, min_length=3)
    price = serializers.DecimalField(max_digits=5, decimal_places=2)
    publish = serializers.CharField(max_length=10)
    
    def create(self, validated_data):
        # 创建对象  validated_data 校验后的数据
        result = models.Book.objects.create(**validated_data)
        print(result)
        return result  # 最后把结果返回

リクエストを再送信してください

画像-20201104193551684

データベースにもデータがあります

画像-20201104193641077

ナイン、シリアライザーのフィールド検証機能

フィールドパラメータで言及しました

validators 该字段使用的验证器それを使ってみましょう

def length_limit(data):
    if data.startswith('xxx'):
        raise ValidationError('名字不能以xxx开头')
    else:
        return data


class BookSerializer(serializers.Serializer):
    id = serializers.IntegerField(required=False)
    # 给名字添加 长度限制
    name = serializers.CharField(max_length=32, min_length=3, validators=[length_limit, ])
    price = serializers.DecimalField(max_digits=5, decimal_places=2)
    publish = serializers.CharField(max_length=32)
    
    def create(self, validated_data):
        # 创建对象  validated_data 校验后的数据
        result = models.Book.objects.create(**validated_data)
        print(result)
        return result  # 最后把结果返回
    
    # 局部钩子
    # z这里与form表单不同的是 局部钩子 所带的参数 就是要校验参数 不用取值
    def validate_price(self, data):
        if data > 20:
            raise ValidationError('定价过高')
        else:
            return data
    
    # 全局钩子
    # 与 form 表单用法相同
    def validate(self, attrs):
        name = attrs.get('name')
        publish = attrs.get('publish')
        if name == publish:
            raise ValidationError('书名不能和出版社同名!')
        else:
            return attrs

postmanを使用してテストしましょう

画像-20201104195302334

これらはチェックフィールドの3つの機能です

  • フィールド独自の検証ルール(max_length ...)
  • バリデーターの検証
  • '針'

十、read_only和write_only

read_onlyは、フィールドがシリアル化された出力にのみ使用されることを示します。デフォルトはFalseです。

    id = serializers.IntegerField(required=False)
    # 给名字添加 长度限制
    name = serializers.CharField(max_length=32, min_length=3, validators=[length_limit, ], read_only=True)
    price = serializers.DecimalField(max_digits=5, decimal_places=2)
    publish = serializers.CharField(max_length=32)

したがって、投稿データを送受信する場合、名前フィールドはデータベースに書き込まれません。したがって、このレコードは返されるデータには表示されません。読み取り専用

画像-20201104200057846

画像-20201104195744566

write_onlyは、フィールドが入力の逆シリアル化にのみ使用されることを示します。デフォルトはFalseです。

公開するために追加します 書くだけ その後、リクエストを受け取ったときにこのフィールドを表示できません

    id = serializers.IntegerField(required=False)
    # 给名字添加 长度限制
    name = serializers.CharField(max_length=32, min_length=3, validators=[length_limit, ])
    price = serializers.DecimalField(max_digits=5, decimal_places=2)
    publish = serializers.CharField(max_length=32, write_only=True)

Postmanはgetリクエストの送信をシミュレートしますが、実際にはそうではありません。

画像-20201104200322294

おすすめ

転載: blog.csdn.net/A1L__/article/details/109498033