リード
RESTfulなに関する質問は、最近のインタビューで、多くに遭遇し、一定の理解の前にありましたが、分析した体系はありません。だから今、このプロセスの知識の一部をコーミングしながら、RESTfulなの理解を深めてジャンゴRESTframeworkと組み合わせます。
RESTfulなとは何ですか?
その後、方言のポイントは、リソースの表現状態転送され、「表現状態転送」:この問題は、我々は最初の問題を分析しなければならない、と考える可能性が最も高い、インターネットは、REST(のRepresentational State転送)、中国語の翻訳についての他の記事話をされます。最初に、我々は、我々は知識がより重要なニーズを学んだポイントを見て、大きな頭を持ってここを参照してください。
資源(リソース)
ここでのリソースは、ネットワーク上の各エンティティを指し、各エンティティは、対応するURI(Uniform Resource Identifier)を持っている、あなたはリソースにアクセスする必要がある場合、あなたがすることができURIを介してアクセスすることができます。
表現(プレゼンテーション層)
そのようなので上の画像、HTML、テキスト、およびなどのリソースの単純現れ、。
状態転送(状態の変換)
クライアントは、HTTP動詞をDELETE、GET、POST、PUTを使用して、リソースを操作することができます。
概要
HTTP動詞を通じて、ネットワーク全体の資源の観点から見て、その後、URIによって識別されたネットワーク内のノードに配布し、クライアントとサーバは、いくつかの配信リソースのプレゼンテーション層であり、クライアントにREST、サーバリソース達成するための操作、「状態の変換式を。」(式:クライアントがリソースを要求し、リソースを取得するためにサーバによって)
、これらのアプリケーションの上記の制約と原則を満たすか、デザインはRESTfulなです。つまりRESTfulなは規範と制約のアーキテクチャです。
RESTfulなAPI
デザインのAPI利用規約、RESTfulなは、一般的にWebデータ・インタフェースを設計するために使用される一般的な設計仕様は、今です。ここでは、インターネットからのデザインのいくつかのRESTful APIの一般的な概要の詳細について話をします。
URI设计
1、動詞+オブジェクト
クライアントが使用する「動詞+オブジェクト」サーバ・リソースを操作する構造を、動詞は、オブジェクトがリソースを参照、HTTP動詞を指します。HTTP動詞操作に対応したサーバリソース:
- GET(SELECT):サーバー(1以上)からリソースを削除します。
- POST(CREATE):サーバ上に新しいリソース。
- PUT(UPDATE):サーバーに(クライアントが提供する完全なリソースを変更した後)リソースを更新します。
- PATCH(UPDATE):(プロパティを変更するには、クライアントによって提供される)の更新リソースサーバーインチ
- DELETE(削除):サーバーからリソースを削除します。
図2に示すように、オブジェクトは名詞でなければなりません
API URI内のオブジェクトは、HTTP動詞の役割の対象であるので、名詞ではなく動詞でなければなりません。
3、复数URI
URIのために複数の使用をお勧めします
図3に示すように、マルチレベルURIを避けます
ステータスコード
すべてのクライアント要求は、サーバーの応答が与えられ、応答のHTTPステータスコードは二つの部分とデータを備えています。
HTTPステータスコードの意味:
- 1xx:情報
- 2XX:成功した操作
- 300番台:リダイレクション
- 4XX:クライアントエラー
- 5xxの:サーバーエラー
サーバーの応答
1、プレーンテキストに戻りません。
APIが返すデータフォーマットはJSONオブジェクトである必要があり、プレーンテキストではありません、これは構造化されたプロセスと一致しています。同じプロパティの同じサーバ応答HTTPのContent-Typeヘッダは、アプリケーション/ JSONに設定されます。
2、エラーが発生した場合、200のステータスコードを返しません。
これは、データ操作が失敗した完全体分析を知る必要につながるため、エラーが発生した場合、それは、データボリューム上のエラーメッセージ、その後、200のステータスコードを返すべきではありません。
ジャンゴRestFramework
ジャンゴRestFrameworkは非常に適切である開発モデルの面で「前の分離および後端部」のように彼らのAPIをテストするために、また簡単に、独自のテストページでDjangoのウェブAPIに沿ってRESTfulなスタイルを構築するに基づいています。
分離の前後端に
リア分離爪の前後端はデータ・インターフェースを提供するだけで、もはやテンプレートをレンダリングしていない、と遠位端部は、データのみのプレゼンテーションが必要です。これは多くの利点があります。
- デカップリング前端と後端、多重化インターフェース、開発を低減量
- 効率を向上させ、同期開発の終了前と後に、その職務を遂行、優れたインタフェース仕様になります
- デバッグ、テストおよび運用・保守のためのより有用
ジャンゴRestFrameworkプロフィール
残りのフレームワークの基本コンポーネント:
- APIView
- パーサ構成要素:データ要求を解析し、要求が異なるタイトルに従って解析されます
- シリアライゼーションコンポーネント:Djangoのフォームと同様に、所望のデータがカスタム・アクションの形によって得ることができます
- Viewクラス(ミックスイン)
- 認定コンポーネント
- 権限のコンポーネント
- 周波数成分
- ページングコンポーネント
- 応答アセンブリ
- URLレジストラ
プロセスフロー
Djangoのビュー関数について、に基づくことができるFBVモードもCBVモードに基づくことができます。
- FBVモード:Djangoのルートマップテーブルを関連付けるURLとビュー機能
- CBVモード:とCBVモデルは、(、、ポストを得る置く、削除などviews.pyビュークラス、ビュークラスでビュー機能、で定義されている ) など、
DjangoのRESTFrameworkがベースとCBVモードを、Djangoのhttpリクエストが到着したとき、この方法は、最初のミドルウェアを行い、その後、一致するルートを行います。
ルート一致が、カスタムクラス行う場合as_view()メソッドがある場合、親クラスは、その後の呼び出し、as_view()メソッドをコールしません()ディスパッチ異なる方法を実行し、異なる要求リクエストを処理するための方法。(ジャンゴCBVモード処理この処理の流れ、ならびに知識のいくつかのソースに設計されました)
ジャンゴRESTframework使用
プロジェクトの構成
Djangoのrestframeworkをインストールします。
pip install djangorestframework
新しいプロジェクト、新しいアプリケーションは、settings.pyを修正します
django-admin startproject Crawl
cd Crawl
python manage.py startapp music
settings.py(rest_frameworkはINSTALLED_APPSに追加されます)
(その他の構成は、言語、タイムゾーンを変更し、データベースを変更、ない1リストされている)
のプロジェクトファイルツリー:
プロジェクトデータベースの設計
设计一个有关于存储歌曲的详细信息表(music/models.py):
from django.db import models
class Music(models.Model):
music_author = models.CharField(max_length=50, verbose_name='歌唱者')
music_name = models.CharField(max_length=100, verbose_name='歌曲名')
music_album = models.CharField(max_length=100, verbose_name='专辑')
music_time = models.CharField(max_length=10, verbose_name='歌曲时间')
music_type = models.CharField(
max_length=100, null=True, verbose_name='歌曲类型', default=None)
music_lyrics = models.CharField(
max_length=100, blank=True, verbose_name='作词者')
music_arranger = models.CharField(
max_length=100, blank=True, verbose_name='作曲者')
同步数据库:
python manage.py makemigrations
python manage.py migrate
Serializers
创建一个序列化Serialier类,提供序列化和反序列化的途径,使之可以转化为如json的表现形式,类似于Django的Form表单的原理。在music目录下,创建serializers.py:
from rest_framework import serializers
from music.models import *
class MusicSerializer(serializers.ModelSerializer):
class Meta:
fields = '__all__'
model = Music
Views.py和Urls.py
通过前面提到的CBV模式,设计视图处理函数和路由映射:
Crawl/urls.py
from django.contrib import admin
from django.urls import path, include
import music
urlpatterns = [
path('admin/', admin.site.urls),
path('api/', include('music.urls')),
]
music/urls.py
from django.urls import path
from music.views import *
urlpatterns = [
path('', MusicList.as_view()),
path('<int:pk>/', MusicDetail.as_view()),
]
music/views.py
from django.shortcuts import render
from rest_framework import generics
from rest_framework.views import APIView
from rest_framework.response import Response
from music.models import *
from music.serializers import MusicSerializer
# Create your views here.
class MusicList(APIView):
def get(self, request):
queryset = Music.objects.all()
ret = MusicSerializer(queryset, many=True)
return Response(ret.data)
def post(self, request):
music = MusicSerializer(data=request.data)
if music.is_valid():
music.save()
return Response(music.data)
else:
return Response(music.errors)
class MusicDetail(generics.RetrieveAPIView):
queryset = Music.objects.all()
serializer_class = MusicSerializer
代码详解:
代码比较简单,主要就是继承restframework框架的通用视图函数generics,或者APIView。如果先省事,建议generics,因为提供的通用视图可以允许你快速构建与数据相关的API视图,当然如果觉得通用视图不适合自己的API需求,可以使用APIView类。
(在这里两种方式都用到了,可以对比他们的区别)
测试结果
模拟请求API接口(GET、POST请求)
自带的测试页面:
总结
刚开始接触到RESTful方面的知识还是非常懵的,对网上很多文章感觉讲的也不是很全面,所以索性总结一下,然后接触到RESTFramework框架也发现到了很多在Django方面不熟悉的地方,如CBV模式,以及工作的原理,有些都牵扯到框架内的源码,也是从网上一些优秀的文章一点点慢慢了解到,之后对Django RESTframework相关知识也会继续总结学习,下面是我在网上参考的一些文章,有兴趣的可以了解一下。
参考链接:
https://www.cnblogs.com/renpingsheng/p/9531649.html
https://www.cnblogs.com/renpingsheng/p/9534984.html#FeedBack
https://www.jianshu.com/p/08a998f74ac7