チュートリアル2:要求と応答
この時点から、私たちは本当にコアRESTフレームワークをカバーするために開始されます。私たちはいくつかの基本的なビルディング・ブロックを紹介しましょう。
リクエストオブジェクト
RESTフレームワークが導入されRequest
、正規拡張ターゲットHttpRequest
、及びより柔軟な要求解像度を。Request
オブジェクトの中核機能はあるrequest.data
に似ているプロパティ、request.POST
ウェブAPIを使用するが、より便利。
request.POST # Only handles form data. Only works for 'POST' method.
request.data # Handles arbitrary data. Works for 'POST', 'PUT' and 'PATCH' methods.
レスポンスオブジェクト
RESTフレームワークも紹介しResponse
たオブジェクトTemplateResponse
提示し、クライアントに返される正しいコンテンツタイプを決定するために、コンテンツネゴシエーションを使用していないコンテンツを使用していますが。
return Response(data) # Renders to content type as requested by the client.
ステータスコード
エラーコードがエラーであれば常に、重要な測定値を示していないビューでデジタルHTTPステータスコードを使用して、それに気づくことは容易です。RESTフレームワークは、例えば、各ステータスコードのより具体的な識別子を提供するHTTP_400_BAD_REQUEST
でstatus
モジュール。これは、数値識別子を使用して、これらの代わりに使用することが常に最善の方法です。
ビューパッケージAPI
RESTフレームワークでは、2つのパックは、APIのビューを書き込むために使用することができる提供します。
-
@api_view
デコレータビューの機能に基づいて、処理のために。 APIView
労働者階級とクラスベースのビュー。
これらのパッケージは、このようなことを確実にすることなどの機能の数を提供Request
ビューの受信インスタンスを、そしてするResponse
コンテンツネゴシエーションを実行することができるコンテキスト・オブジェクトに追加します。
包装はまた、例えば、動作を提供405 Method Not Allowed
適切な、および不正な入力を処理して応答を返しParseError
異常がアクセス中に発生しますrequest.data
。
一緒に
さて、先に行くと、いくつかの意見を書くために、これらの新しいコンポーネントを使用して起動してみましょう。
私たちは、もはや私たちの必要はありませんJSONResponse
レッスンをviews.py
、ので、それを削除します。完了したら、我々は少し私たちの見解を再構築するために始めることができます。
from rest_framework import status
from rest_framework.decorators import api_view
from rest_framework.response import Response
from snippets.models import Snippet
from snippets.serializers import SnippetSerializer
@api_view(['GET', 'POST'])
def snippet_list(request):
"""
List all code snippets, or create a new snippet.
"""
if request.method == 'GET':
snippets = Snippet.objects.all()
serializer = SnippetSerializer(snippets, many=True)
return Response(serializer.data)
elif request.method == 'POST':
serializer = SnippetSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
私たちのインスタンスビューは、前の例を改良したものです。これは、それほど冗長で、そして今、我々は、フォームのAPIコードを使用していることは非常によく似ています。また、応答より明白理にかなっているという名前の状態コードを使用します。
以下は、views.py
単一のコードセグメント内のモジュールの図。
@api_view(['GET', 'PUT', 'DELETE'])
def snippet_detail(request, pk):
"""
Retrieve, update or delete a code snippet.
"""
try:
snippet = Snippet.objects.get(pk=pk)
except Snippet.DoesNotExist:
return Response(status=status.HTTP_404_NOT_FOUND)
if request.method == 'GET':
serializer = SnippetSerializer(snippet)
return Response(serializer.data)
elif request.method == 'PUT':
serializer = SnippetSerializer(snippet, data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
elif request.method == 'DELETE':
snippet.delete()
return Response(status=status.HTTP_204_NO_CONTENT)
従来のDjangoのビューを使用して大差はない - これは非常に精通する必要があります。
私たちはもはや、明示的に指定したコンテンツタイプに私たちの要求や応答をバインドされていないことに注意してください。request.data
これは、着信処理できるjson
要求を、それはまた、他のフォーマットを扱うことができます。同様に、我々はデータとレスポンスオブジェクトを返しますが、RESTフレームワークは、正しいコンテンツタイプに応じて、私たちに提示されることができます。
私達のURLの接尾辞で、オプションの形式を追加
私たちの私たちはAPI形式のAPIエンドポイントサフィックスに追加しているという事実の単一のコンテンツタイプに配線ないで応答するために。接尾辞のフォーマットは私達が私達のために、このようなAPIを扱うことができるようになることを意味フォーマット指定されたURLへの明確な言及提供使っようhttp://example.com/api/items/4.json URLを。
まず、format
次のように、両方のビューでキーワードパラメータを追加します。
def snippet_list(request, format=None):
と
def snippet_detail(request, pk, format=None):
今snippets/urls.py
まで少しアップデートファイルを添付format_suffix_patterns
従来のURL以外のグループ。
from django.conf.urls import url
from snippets import views
from rest_framework.urlpatterns import format_suffix_patterns
urlpatterns = [
path('snippets/', views.snippet_list),
path('snippets/<int:pk>', views.snippet_detail),
]
urlpatterns = format_suffix_patterns(urlpatterns)
私たちは、必ずしもこれらの追加URLモードを追加する必要はありませんが、それは私たちが特定のフォーマットを参照するためのシンプルでクリーンな方法を提供します。
テストAPI
我々として、コマンドラインAPIをテストするために続行チュートリアルパート1が行っていました。けれども、私たちは無効な要求を送信しますが、我々はいくつかの優れたエラー処理方法を持っています。
我々は以前のように、すべてのコードセグメントのリストを取得することができます。
http http://127.0.0.1:8000/snippets/
HTTP/1.1 200 OK
...
[
{
"id": 1,
"title": "",
"code": "foo = \"bar\"\n",
"linenos": false,
"language": "python",
"style": "friendly"
},
{
"id": 2,
"title": "",
"code": "print(\"hello, world\")\n",
"linenos": false,
"language": "python",
"style": "friendly"
}
]
我々は使用することができAccept
、我々が取得レスポンスヘッダのフォーマットを制御します:
http http://127.0.0.1:8000/snippets/ Accept:application/json # Request JSON
http http://127.0.0.1:8000/snippets/ Accept:text/html # Request HTML
追加のフォーマットまたはサフィックスによって:
http http://127.0.0.1:8000/snippets.json # JSON suffix
http http://127.0.0.1:8000/snippets.api # Browsable API suffix
同様に、我々は使用することができContent-Type
、私たちからの制御要求のヘッダフォーマットを。
# POST using form data
http --form POST http://127.0.0.1:8000/snippets/ code="print(123)"
{
"id": 3,
"title": "",
"code": "print(123)",
"linenos": false,
"language": "python",
"style": "friendly"
}
# POST using JSON
http --json POST http://127.0.0.1:8000/snippets/ code="print(456)"
{
"id": 4,
"title": "",
"code": "print(456)",
"linenos": false,
"language": "python",
"style": "friendly"
}
あなたがいる場合--debug
にhttp
スイッチ上の追加要求は、要求ヘッダーの要求の種類を見ることができます。
さて、アクセスすることによりhttp://127.0.0.1:8000/snippets/ Webブラウザで、オープンなAPIを。
ます。https://www.jianshu.com/p/c192740aa7c4で再現