国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

django rest framework個人學習筆記(三)————Tutorial1.Serial

Pink / 2170人閱讀

摘要:測試這是一個測試鏈接。注意編寫注釋是一個好的習慣。包括各個字段的驗證標記,例如。字段標記也能夠控制在某些環(huán)境中如何顯示,例如呈現為之前的標記相當于中的。類似于有和類,也包含和兩個類。

Serialization——序列化

官網地址

前言

本教程將會介紹創(chuàng)建一個簡單webAPI。在整個學習的過程中,將會逐一介紹到REST framework的各種組件,讓你全面的了解所有東西是如果組合在一起的。
這個教程將會相當的詳細,所以在開始之前,你應該去來點餅干,再喝上一些你喜歡的飲料。如果你只是想快速概覽,你應該查看Quickstart.
注意:本教程的代碼可以在GitHub的 tomchristie/rest-framework-tutorial中找到。測試,這是一個測試鏈接。

創(chuàng)建一個新的虛擬環(huán)境

使用 virtualenv創(chuàng)建一個虛擬環(huán)境.

virtualenv env
source env/bin/activate

然后我們在我們創(chuàng)建的虛擬環(huán)境中安裝需要的包。

pip install django
pip install djangorestframework
pip install pygments #使用它來代碼高亮

注意:使用 deactivate來隨時退出虛擬環(huán)境。更多的信息請查看Virtualenv documentation

準備

我們這邊開始編寫代碼了。先來創(chuàng)建一個項目吧~

cd ~
django-admin.py startproject tutorial
cd tutorial

接下來,我們創(chuàng)建一個app。

python manage.py startapp snippets

我們需要添加 snippetsrest_frameworkINSTALLED_APPS,在 tutorial/settings.py文件中:

INSTALLED_APPS = {
    ...
    "rest_framework",
    "snippets.apps.SnippetsConfig",
}

注意:如果你使用的django<1.9,你需要替換 snippets.apps.SnippetsConfigsnippets
我們可以繼續(xù)上路了。

創(chuàng)建model

在本教程中,我們將創(chuàng)建一個簡單的model,這個model將用于儲存代碼片段。
編輯 snippets/models.py文件。
注意:編寫注釋是一個好的習慣。

from django.db import models
from pygments.lexers import get_all_lexers
from pygments.styles import get_all_styles

LEXERS = [item for item in get_all_lexers() if item[1]]
LANGUAGE_CHOICES = sorted([(item[1][0], item[0]) for item in LEXERS])
STYLE_CHOICES = sorted((item, item) for item in get_all_styles())

class Snippet(models.Model):
    created = models.DateTimeField(auto_now_add=True)
    title = models.CharField(max_length=100,blank=True,defalut="")
    code = models.TextField()
    linenos = models.BooleanField(default=False)
    language = models.CharField(choices=LANGUAGE_CHOICES,default="python",max_length=100)
    style = models.CharField(choices=STYLE_CHOICES,default="friendly",max_length=100)
    
    class Meta:
        ordering = ("created")

執(zhí)行命令,創(chuàng)建數據表:

    python manage.py makemigrations snippets
    python manage.py migrate
創(chuàng)建Serializer

首先,我們需要給我們的web API 提供一種序列化和反序列化的呈現方式,如json
我們可以申明一個和django的forms差不多的serializers。創(chuàng)建一個Serializers.py文件。

from rest_framework import serializers
from snippets.models import Snippet, LANGUAGE_CHOICES, STYLE_CHOICES

class SnippetSerializer(serializers.Serializer):
    id = serializers.IntegerField(read_only=True)
    title = serializers.CharField(required=False,allow_blank=True,max_length=100)
    code = serializers.CharField(style={"base_template":"textarea.html"})
    linenos = serializers.BooleanField(required=False)
    language = serializers.ChoiceField(choices=LANGUAGE_CHOICES,default="python")
    style = serializers.ChoiceField(choices=STYLE_CHOICES,default="friendly")
    
    def create(self,validated_data):
        return Snippet.objects.create(**validated_data)
       
    def update(self,instance,validated_data):
        instance.title = validated_data.get("title", instance.title)
        instance.code = validated_data.get("code", instance.code)
        instance.linenos = validated_data.get("linenos", instance.linenos)
        instance.language = validated_data.get("language", instance.language)
        instance.style = validated_data.get("style", instance.style)
        instance.save()
        return instance

serializer的第一步是定義需要 序列化/反序列化 的字段。create()update()方法定義當serializer.save()時,如果創(chuàng)建和更新。
serializer類非常類似于Django的Form類。包括各個字段的驗證標記,例如 required,max_length,default
字段標記也能夠控制serializer在某些環(huán)境中如何顯示,例如呈現為HTML.
之前的{"base_template": "textarea.html"}標記相當于django Form中的widget=widgets.Textarea`。

其實我們使用ModelSerializer類更能夠節(jié)省我們的時間,但現在,我們還是顯示的定義我們的字段。

開始工作

在我們更進一步學習之前,我們將通過django shell來熟悉serializer。

python manage.py shell

我們需要導入我們需要的東西,然后創(chuàng)建兩個snippet。

from snippets.models import Snippet
from snippets.serializers import SnippetSerializer
from rest_framework.renderers import JSONRenderer
from rest_framework.parsers import JSONParser

snippet = Snippet(code="foo="bar"
")
snippet.save()

snippet = Snippet(code="print "hello, world"
")
snippet.save()

我們來看看我們創(chuàng)建的其中一個實例:

serializer = SnippetSerializer(snippet)
serializer.data
# {"id": 2, "title": u"", "code": u"print "hello, world"
", "linenos": False, "language": u"python", "style": u"friendly"}

在這里,我們翻譯這個model實例為python原生的數據類型,為了完成序列化,我們將數據呈現為JSON。

content = JSONRenderer().render(serializer.data)
content
# "{"id": 2, "title": "", "code": "print "hello, world"
", "linenos": false, "language": "python", "style": "friendly"}"

反序列化類似。首先,我們解析一個流為Python原生數據類型。

from django.utils.six import BytesIO
data = JSONParser().parse(stream)

然后我們還原原生數據類型到一個完全填充的對象實例中。

serializer = SnippetSerializer(data=data)
serializer.is_valid()
# True
serializer.validated_data
# OrderedDict([("title", ""), ("code", "print "hello, world"
"), ("linenos", False), ("language", "python"), ("style", "friendly")])
serializer.save()
# 

注意:這類似于forms.當我們編寫views使用serializer時,這會看起來更相似。

serializer = SnippetSerializer(Snippet.objects.all(), many=True)
serializer.data
# [OrderedDict([("id", 1), ("title", u""), ("code", u"foo = "bar"
"), ("linenos", False), ("language", "python"), ("style", "friendly")]), OrderedDict([("id", 2), ("title", u""), ("code", u"print "hello, world"
"), ("linenos", False), ("language", "python"), ("style", "friendly")]), OrderedDict([("id", 3), ("title", u""), ("code", u"print "hello, world""), ("linenos", False), ("language", "python"), ("style", "friendly")])]
使用ModelSerializers

我們的SnippetSerializer類復制了很多snippet中的東西。我們希望我們的代碼能夠保持干凈整潔。
類似于django有Form和ModelForm類,REST framework也包含SerializerModelSerializer兩個類。
讓我們來使用ModelSerializer來重構我們的serializer類。打開snippets/serializers.py,替換SinppetSerializer類:

class SnippetSerializer(serializers.ModelSerizer):
    class Meta:
        model = Snippet
        fields = ("id","title","code","linenos","language","style")

serializer擁有一個很好的屬性,你能夠通過打印查看一個serializer實例的所有字段。打開django shell(python manage.py shell):

from snippets.serializers import SnippetSerializer
serializer = SnippetSerializer()
print(repr(serializer))
# SnippetSerializer():
#    id = IntegerField(label="ID", read_only=True)
#    title = CharField(allow_blank=True, max_length=100, required=False)
#    code = CharField(style={"base_template": "textarea.html"})
#    linenos = BooleanField(required=False)
#    language = ChoiceField(choices=[("Clipper", "FoxPro"), ("Cucumber", "Gherkin"), ("RobotFramework", "RobotFramework"), ("abap", "ABAP"), ("ada", "Ada")...
#    style = ChoiceField(choices=[("autumn", "autumn"), ("borland", "borland"), ("bw", "bw"), ("colorful", "colorful")...

注意ModelSerializer不會做任何如魔法般的事情,它只是更快捷的創(chuàng)建serializer

自動的確定字段的設置

簡單的默認create()update()方法

使用Serializer寫一個常規(guī)的django views

讓我們使用我們新的serializer來寫一些API視圖吧。在這里,我們不會使用任何REST framework的其他特性,我們就寫一個常規(guī)的 django views。
來編寫 snippets/views.py文件吧:

from django.http import HttpResponse, JsonResponse
from django.views.decorators.csrf import csrf_exempt
from rest_framework.renderers import JSONRenderer
from rest_framework.parsers import JSONParser
from snippets.models import Snippet
from snippets.serializers import SnippetSerializer

我們的API將會支持查看所有數據和創(chuàng)建一個新的snippet

@csrf_exempt
def snippet_list(request):
    """
    顯示所有的代碼片段,或者創(chuàng)建一個新的片段
    """
    if request.method == "GET":
        snippets = Snippet.objects.all()
        serializer = SnippetSerializer(snippets, many=True)
        return JsonResponse(serializer.data, safe=False)

    elif request.method == "POST":
        data = JSONParser().parse(request)
        serializer = SnippetSerializer(data=data)
        if serializer.is_valid():
            serializer.save()
            return JsonResponse(serializer.data, status=201)
        return JsonResponse(serializer.errors, status=400)

注意:因為我們希望post能夠不通過CSRF token的驗證,所以我們使用了 csrf_exempt。事實上,這不會是你經常做的事情,并且REST framework views會更加明智的做這個事情。但是現在,他可以使用。

我們還需要這個視圖能夠檢索,更新和刪除。

@csrf_exempt
def snippet_detail(request, pk):
    """
    Retrieve, update or delete a code snippet.
    """
    try:
        snippet = Snippet.objects.get(pk=pk)
    except Snippet.DoesNotExist:
        return HttpResponse(status=404)

    if request.method == "GET":
        serializer = SnippetSerializer(snippet)
        return JsonResponse(serializer.data)

    elif request.method == "PUT":
        data = JSONParser().parse(request)
        serializer = SnippetSerializer(snippet, data=data)
        if serializer.is_valid():
            serializer.save()
            return JsonResponse(serializer.data)
        return JsonResponse(serializer.errors, status=400)

    elif request.method == "DELETE":
        snippet.delete()
        return HttpResponse(status=204)

最后,我們需要創(chuàng)建url,在snippets/urls.py文件中

from django.conf.urls import url
from snippets import views

urlpatterns = [
    url(r"^snippets/$", views.snippet_list),
    url(r"^snippets/(?P[0-9]+)/$", views.snippet_detail),
]

我們還需要在跟urls.py(tutorial/urls.py)上引入我們的urls.py

from django.conf.urls import url, include

urlpatterns = [
    url(r"^", include("snippets.urls")),
]

注意:我們的視圖有某些問題是還沒有做妥善的處理,比如發(fā)送的json格式不正確,或是調用視圖沒有的方法,那么我們就會返回一個500“服務器錯誤”的消息。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/45449.html

相關文章

  • django rest framework個人學習筆記)————Tutorial1.Serial

    摘要:測試這是一個測試鏈接。注意編寫注釋是一個好的習慣。包括各個字段的驗證標記,例如。字段標記也能夠控制在某些環(huán)境中如何顯示,例如呈現為之前的標記相當于中的。類似于有和類,也包含和兩個類。 Serialization——序列化 官網地址 前言 本教程將會介紹創(chuàng)建一個簡單webAPI。在整個學習的過程中,將會逐一介紹到REST framework的各種組件,讓你全面的了解所有東西是如果組合在一...

    FreeZinG 評論0 收藏0
  • django rest framework個人學習筆記)————Tutorial1.Serial

    摘要:測試這是一個測試鏈接。注意編寫注釋是一個好的習慣。包括各個字段的驗證標記,例如。字段標記也能夠控制在某些環(huán)境中如何顯示,例如呈現為之前的標記相當于中的。類似于有和類,也包含和兩個類。 Serialization——序列化 官網地址 前言 本教程將會介紹創(chuàng)建一個簡單webAPI。在整個學習的過程中,將會逐一介紹到REST framework的各種組件,讓你全面的了解所有東西是如果組合在一...

    ls0609 評論0 收藏0
  • django rest framework個人學習筆記(一)————Install

    摘要:本文主要是用來記錄自己學習的過程。其中可能會有很多自己的錯誤理解。這里主要會用到的知識有百度百科阮一峰理解架構其余請自行百度。所有的全局設置都放在的字典中。使用標準的權限,未認證的用戶只讀權限不要忘記將添加到你的中。 本文主要是用來記錄自己學習django-rest-framework的過程。其中可能會有很多自己的錯誤理解。 這里主要會用到的知識有 1. [django](https:...

    yuxue 評論0 收藏0
  • django rest framework個人學習筆記(一)————Install

    摘要:本文主要是用來記錄自己學習的過程。其中可能會有很多自己的錯誤理解。這里主要會用到的知識有百度百科阮一峰理解架構其余請自行百度。所有的全局設置都放在的字典中。使用標準的權限,未認證的用戶只讀權限不要忘記將添加到你的中。 本文主要是用來記錄自己學習django-rest-framework的過程。其中可能會有很多自己的錯誤理解。 這里主要會用到的知識有 1. [django](https:...

    yagami 評論0 收藏0
  • django rest framework個人學習筆記(二)————Quickstart

    摘要:我們將會創(chuàng)建一個簡單的,來讓管理員能夠查看和編輯和。我們將會在接下來的例子中使用這個賬戶。創(chuàng)建一個新的模塊叫。但是是一個好的設計。最后,我們使用來導入默認的登錄登出這是可選的。我們想啟用分頁和只有用戶能夠調用。 Quickstart 我們將會創(chuàng)建一個簡單的API,來讓管理員能夠查看和編輯Users和Groups。 項目開始 創(chuàng)建一個新的項目叫 tutorial,然后創(chuàng)建一個app叫qu...

    gghyoo 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<