讓我們看看通過 Serializer 類怎樣來編寫 API 的視圖函數,現在我們不會使用 REST 架構中的特性,僅僅寫原生的Django視圖函數。
一.我們建立一個 HttpResponse 的子類,用來将任何資料轉換成 JSON格式.
編輯<code>snippets/views.py,如下:</code>
<code>from</code> <code>django.http </code><code>import</code> <code>HttpResponse</code>
<code>from</code> <code>django.views.decorators.csrf </code><code>import</code> <code>csrf_exempt</code>
<code>from</code> <code>rest_framework.renderers </code><code>import</code> <code>JSONRenderer</code>
<code>from</code> <code>rest_framework.parsers </code><code>import</code> <code>JSONParser</code>
<code>from</code> <code>snippets.models </code><code>import</code> <code>Snippet</code>
<code>from</code> <code>snippets.serializers </code><code>import</code> <code>SnippetSerializer</code>
<code>class</code> <code>JSONResponse(HttpResponse):</code>
<code> </code><code>"""</code>
<code> </code><code>An HttpResponse that renders its content into JSON.</code>
<code> </code><code>def</code> <code>__init__(</code><code>self</code><code>, data,</code><code>*</code><code>*</code><code>kwargs):</code>
<code> </code><code>content </code><code>=</code><code>JSONRenderer().render(data)</code>
<code> </code><code>kwargs[</code><code>'content_type'</code><code>]</code><code>=</code><code>'application/json'</code>
<code> </code><code>super</code><code>(JSONResponse, </code><code>self</code><code>).__init__(content,</code><code>*</code><code>*</code><code>kwargs)</code>
二.我們API的目的是,可以通過view來列舉全部的Snippet的内容,或者建立一個新的snippet
<code>@csrf_exempt</code>
<code>def</code> <code>snippet_list(request):</code>
<code> </code><code>List all code snippets, or create a new snippet.</code>
<code> </code><code>if</code> <code>request.method </code><code>=</code><code>=</code><code>'GET'</code><code>:</code>
<code> </code><code>snippets </code><code>=</code><code>Snippet.objects.</code><code>all</code><code>()</code>
<code> </code><code> serializer </code><code>=</code><code>SnippetSerializer(snippets,many</code><code>=</code><code>True</code><code>)</code>
<code> </code><code>return</code> <code>JSONResponse(serializer.data)</code>
<code> </code><code>elif</code> <code>request.method </code><code>=</code><code>=</code><code>'POST'</code><code>:</code>
<code> </code><code> data </code><code>=</code><code>JSONParser().parse(request)</code>
<code> </code><code>serializer </code><code>=</code><code>SnippetSerializer(data</code><code>=</code><code>data)</code>
<code> </code><code> </code><code>if</code> <code>serializer.is_valid():</code>
<code> </code><code>serializer.save()</code>
<code> </code><code> </code><code>return</code> <code>JSONResponse(serializer.data, status</code><code>=</code><code>201</code><code>)</code>
<code> </code><code> </code><code>return</code> <code>JSONResponse(serializer.errors, status</code><code>=</code><code>400</code><code>)</code>
注意,因為我們要通過client向該view post一個請求,是以我們要将該view 标注為csrf_exempt, 以說明不是一個CSRF事件。它不同于以往的正常的視圖函數,REST架構的視圖函數事實上使用更加敏感的行為,它現在隻是為了達到我們的目的。
三.我們還要一個視圖函數來為單獨的 snipet 執行個體服務,用來恢複,更新和删除 snippet
<code>def</code> <code>snippet_detail(request, pk):</code>
<code> </code><code>"""</code>
<code> </code><code> Retrieve, update or delete a code snippet.</code>
<code> </code><code> """</code>
<code> </code><code>try</code><code>:</code>
<code> </code><code>snippet </code><code>=</code><code>Snippet.objects.get(pk</code><code>=</code><code>pk)</code>
<code> </code><code>except</code> <code>Snippet.DoesNotExist:</code>
<code> </code><code>return</code> <code>HttpResponse(status</code><code>=</code><code>404</code><code>)</code>
<code> </code><code>if</code> <code>request.method </code><code>=</code><code>=</code><code>'GET'</code><code>:</code>
<code> </code><code>serializer </code><code>=</code> <code>SnippetSerializer(snippet) </code>
<code> </code><code>return</code> <code>JSONResponse(serializer.data)</code>
<code> </code><code>elif</code> <code>request.method </code><code>=</code><code>=</code><code>'PUT'</code><code>:</code>
<code> </code><code>data </code><code>=</code><code>JSONParser().parse(request)</code>
<code> </code><code>serializer </code><code>=</code><code>SnippetSerializer(snippet, data</code><code>=</code><code>data)</code>
<code> </code><code>if</code> <code>serializer.is_valid(): </code>
<code> </code><code>serializer.save()</code>
<code> </code><code>return</code> <code>JSONResponse(serializer.data)</code>
<code> </code><code>return</code> <code>JSONResponse(serializer.errors, status</code><code>=</code><code>400</code><code>)</code>
<code> </code><code>elif</code> <code>request.method </code><code>=</code><code>=</code><code>'DELETE'</code><code>:</code>
<code> </code><code>snippet.delete()</code>
<code> </code><code>return</code> <code>HttpResponse(status</code><code>=</code><code>204</code><code>)</code>
四.将views.py儲存,在Snippets目錄下面建立urls.py,添加以下内容:
<code>from</code> <code>django.conf.urls </code><code>import</code> <code>patterns, url</code>
<code>urlpatterns </code><code>=</code> <code>patterns(</code><code>'snippets.views'</code><code>,</code>
<code> </code><code>url(r</code><code>'^snippets/$'</code><code>,</code><code>'snippet_list'</code><code>),</code>
<code> </code><code>url(r</code><code>'^snippets/(?P<pk>[0-9]+)/$'</code><code>,</code><code>'snippet_detail'</code><code>),</code>
<code>)</code>
四.測試
<code>python manage.py runserver</code>
在另外的終端中:
<code>curl http:</code><code>/</code><code>/</code><code>127.0</code><code>.</code><code>0.1</code><code>:</code><code>8000</code><code>/</code><code>snippets</code><code>/</code><code>[{</code><code>"id"</code><code>: </code><code>1</code><code>, </code><code>"title"</code><code>: "</code><code>", "</code><code>code</code><code>": "</code><code>foo </code><code>=</code> <code>\</code><code>"bar\"\n"</code><code>, </code><code>"linenos"</code><code>: false, </code><code>"language"</code><code>: </code><code>"python"</code><code>, </code><code>"style"</code><code>:</code>
<code> </code><code>"friendly"</code><code>}, {</code><code>"id"</code><code>: </code><code>2</code><code>, </code><code>"title"</code><code>: "</code><code>", "</code><code>code</code><code>": "</code><code>print</code> <code>\</code><code>"hello, world\"\n"</code><code>, </code><code>"linenos"</code><code>: false, </code><code>"language"</code><code>:</code>
<code> </code><code>"python"</code><code>, </code><code>"style"</code><code>: </code><code>"friendly"</code><code>}]</code>
本文轉自 luoguo 51CTO部落格,原文連結:http://blog.51cto.com/luoguoling/1688166