DRFフレームワーク - 基本

DRFフレームワーク

インポート

  • httpプロトコル

    httpプロトコルは、アプリケーション層のプロトコルに基づいています

    要求に応じて、要求が身体を要求し、最初の行、最初の要求を持っている必要があります

    特徴:いいえ、接続、および最初のクライアントが要求を開始している、サーバーは、応答します

  • WSGI契約

    主には、データが解析される方法を指定する、などは、要求分析パッケージにHTTPリクエストを取得しています

    機能ビューを返す場合、そのデータは、HTTPプロトコル受信広がりによって要求されるフォーマットにパッケージされています

インターフェースは何ですか

クライアントのニーズに適切なインタフェースを呼び出し、ルート一致を戻し、データを行うインタフェースが完了し、所望の形式で返されます。

  • インターフェイスは、特定のURLリンクを持っています
  • マナー対応する要求:、ポスト、入れて、パッチ、削除します
  • 受信パラメータ要求
  • 最終応答

安らかなインタフェース仕様

  1. インタフェースはデータ上で動作しているので、一般的に、使用するセキュリティプロトコル

  2. インタフェースのURLにキーワードを反映するためにapi、このような:

    http://api.baidu.com若しくはhttp://www.baidu.com/api

  3. データインタフェースは、複数のリソースを用いてデータ受信を要求するために、リソースを呼び出したとき

    http://api.baidu.com/books/若しくはhttp://www.baidu.com/api/books

  4. 資源の方法で動作Linkインタフェースは、途中でリソース要求の動作モードを決定するために、通常、表示することはできません

    5つのインタフェース:

    • 取得:すべてを取得
    • 取得:取得
    • ポスト:追加
    • 置く|パッチ:全体を修正|セクションを修正
    • 削除:削除
  5. リソースデータの複数のバージョンが存在する場合、インターフェイスはバージョン管理を行うには

    http://api.baidu.com/books/v1/

  6. リソースの制約は応答:スクリーニングを、ソート......

    http://api.baidu.com/books/?publish=1&ordering=-price&limit=3

  7. ネットワークへの同様のステータスコード、ステータスコードに対応するデータ、規則は0であります

    {‘status’: 0 | 1 | 2}

    - SUCCESS(0、 "クエリ成功した")
    - NODATA(1、 "間違った、データが、基本的な情報を表示しない")
    - FEAILED(2、 "クエリに失敗しました")

  8. 結果は、必要な応答情報を記述しました

    {'status': 0, 'msg': 'success'}

  9. 応答の結果

    • すべてを取得する:すべてのリソースを返します
    • 取得:リソースを返します。
    • 記事を追加:追加のリソースを返します。
    • リソースの変更を返す:パッチレビュー|を置きます
    • 削除:任意のリターンなし

注:する必要があるドキュメントをインターフェースはフロントデスクは不可欠とオプションのパラメータの配信を告げ、およびデータ内容構造が返さ

Djangoはネイティブインターフェイスを実装します

新しいDjangoのプロジェクトを作成し、デフォルトのアプリを作成し、APIと呼ばれます

# 主路由urls.py

from django.conf.urls import url, include
from django.contrib import admin
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^api/', include('api.urls')),
]

# 子路由 api/urls.py

from django.conf.urls import url
from . import views
urlpatterns = [
    # as_view() 本质拿到 view函数地址,
    # view内部通过dispatch分发请求给具体的(get|post|delete)方法处理请求
    # 处理完后的响应结果会一层层返回
    url(r'^books/$', views.BookView.as_view()),
    url(r'^books/(?P<pk>.*)/$', views.BookView.as_view()),
]

# 模型层 api/models.py

from django.db import models
class Book(models.Model):
    name = models.CharField(max_length=64)
    price = models.DecimalField(max_digits=5, decimal_places=2)
    class Meta:
        db_table = 'old_boy_book'
        verbose_name = '书籍'
        verbose_name_plural = verbose_name
    def __str__(self):
        return self.name
# 模型层创建完成之后,完成数据库的迁移
# python manage.py makemigrations
# python manage.py migrate
    
# 视图层 api/views
from django.views import View
from django.http import JsonResponse
from . import models
class BookView(View):
    def get(self, request, *args, **kwargs):
        pk = kwargs.get('pk')
        if pk:  # 通过是否有主键决定获取单个或是全部资源
            book_dic_list = models.Book.objects.filter(pk=pk).values('name', 'price')
            if not book_dic_list:
                return JsonResponse({
                    'status': 2,
                    'msg': 'pk值有误',
                    'results': {}
                })
            return JsonResponse({
                'status': 0,
                'msg': 'ok',
                'results': book_dic_list[0]
            })

        book_dic_list = models.Book.objects.all().values('name', 'price')
        if not book_dic_list:
            return JsonResponse({
                'status': 2,
                'msg': '无数据',
                'results': {}
            })
        return JsonResponse({
            'status': 0,
            'msg': 'ok',
            'results': list(book_dic_list)
        })

DRFフレームワーク

  • インストール

    pip install djangorestframework

  • 設定

    # 注册drf app
    # settings.py
    NSTALLED_APPS = [
        # ...
        'rest_framework',
    ]
  • 特長

    # 具体功能在具体模块下
    from rest_framework.request import Request
    from rest_framework.response import Response
    from rest_framework.exceptions import APIException
    from rest_framework.filters import OrderingFilter
    from rest_framework.views import APIView
    from rest_framework.pagination import PageNumberPagination
    from rest_framework.settings import APISettings
    
    
    # 自定义drf配置 - 在自己的settings.py
    REST_FRAMEWORK = {
        # 自定义修改drf的配置们
    }

ジャンゴCBVとDRF CBVコントラスト

  • ジャンゴCBV

    1. 継承Viewビュークラスを
    2. よるas_view()ビュー機能アドレスを取得します
    3. 要求した後、ビュー関数を呼び出し、内線通話の発信機能要求分布を完了する
    4. 同じ名前のビュークラスのメソッドにマッピングされた要求ディスパッチ機能は、要求の処理が、対応を与えるために、終了します
    5. リターン結果の最後に、それぞれの層
  • DRF CBV

    1. 継承されAPIViewたクラス
    2. よるas_view()(继承自django的as_view)ビュー機能アドレスを取得するが、ローカル無効にCSRFの認証の機能の観点から
    3. 関数呼び出し、内線通話(表示する要求APIView类的)機能が要求ディスパッチ分布を完了するために
    4. ディスパッチ機能第2のパッケージ要求は3つの認証のために、要求は、同じ名前のビュークラスのメソッドにマッピングされ、要求の処理が完了し、対応を与えるため、再度対応する描画処理を行います
    5. リターン結果の最後に、それぞれの層

応答のレンダリングモジュールで

データはの形式で返されます:JSONとブラウザインタフェースページ

分析

# 入口: APIView类的dispatch函数
self.response = self.finalize_response(request, response, *args, **kwargs)
--> neg = self.perform_content_negotiation(request, force=True)
--> renderers = self.get_renderers()
--> self.renderer_classes
--> APISetting:DEFAULT_RENDERER_CLASSES

ローカル設定

from rest_framework.views import APIView
from rest_framework.response import Response

from rest_framework.renderers import JSONRenderer
from rest_framework.renderers import BrowsableAPIRenderer
class UserAPIView(APIView):
    # 局部配置:只有该视图类起作用
    renderer_classes = [JSONRenderer]  # 只提供JSON数据渲染
    pass

グローバルコンフィギュレーション

# drf配置
REST_FRAMEWORK = {
    # 响应的渲染模块
    'DEFAULT_RENDERER_CLASSES': [
        'rest_framework.renderers.JSONRenderer',
        'rest_framework.renderers.BrowsableAPIRenderer',
    ],
}

リクエストデータ解析モジュール

データフロントエンドモード要求の解析:JSON、フォームデータ、URLエンコード

分析

# 入口:APIView类的dispatch函数
request = self.initialize_request(request, *args, **kwargs)
--> parsers=self.get_parsers()
--> self.parser_classes
--> APISetting:DEFAULT_PARSER_CLASSES

ローカル設定

from rest_framework.views import APIView
from rest_framework.response import Response

from rest_framework.parsers import JSONParser
from rest_framework.parsers import FormParser
from rest_framework.parsers import MultiPartParser
class UserAPIView(APIView):
    # 局部配置:只有该视图类起作用
    parser_classes = [JSONParser]  # 只提供JSON解析
    pass

グローバルコンフィギュレーション

# drf配置
REST_FRAMEWORK = {
    # 请求数据解析模块
    'DEFAULT_PARSER_CLASSES': [
        'rest_framework.parsers.JSONParser',  # 'application/json'
        'rest_framework.parsers.FormParser',  # 'application/x-www-form-urlencoded'
        'rest_framework.parsers.MultiPartParser'  # multipart/form-data
    ],
}

位置データ要求の分析

  1. パケットはすべてrequest.dataを解決することである場合
  2. URLは場合/?参数request.query_paramsで解決されます

応答モジュール

# 响应可以设置响应数据、响应网络状态码、响应头、响应数据类型等
data = {
    'status': 0,
    'msg': 'get ok',
    'results': [],
    'token': '123.12321.231'
}
return Response(
    data=data,
    status=status.HTTP_200_OK,
    headers={'Token': '123as.masd21.asd213sd'},
    content_type='application/json'  # 默认就是application/json
)

おすすめ

転載: www.cnblogs.com/Hades123/p/11455876.html