天天看點

django RESTful研究一第一個測試例子(用序列化器編寫原生的Django視圖函數)

    讓我們看看通過 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&lt;pk&gt;[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