摘要:測試這是一個測試鏈接。注意編寫注釋是一個好的習慣。包括各個字段的驗證標記,例如。字段標記也能夠控制在某些環(huán)境中如何顯示,例如呈現為之前的標記相當于中的。類似于有和類,也包含和兩個類。
Serialization——序列化
官網地址
前言本教程將會介紹創(chuàng)建一個簡單webAPI。在整個學習的過程中,將會逐一介紹到REST framework的各種組件,讓你全面的了解所有東西是如果組合在一起的。
這個教程將會相當的詳細,所以在開始之前,你應該去來點餅干,再喝上一些你喜歡的飲料。如果你只是想快速概覽,你應該查看Quickstart.
注意:本教程的代碼可以在GitHub的 tomchristie/rest-framework-tutorial中找到。測試,這是一個測試鏈接。
使用 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
我們需要添加 snippets 和 rest_framework 到 INSTALLED_APPS,在 tutorial/settings.py文件中:
INSTALLED_APPS = { ... "rest_framework", "snippets.apps.SnippetsConfig", }
注意:如果你使用的django<1.9,你需要替換 snippets.apps.SnippetsConfig為snippets。
我們可以繼續(xù)上路了。
在本教程中,我們將創(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也包含Serializer和ModelSerializer兩個類。
讓我們來使用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
摘要:測試這是一個測試鏈接。注意編寫注釋是一個好的習慣。包括各個字段的驗證標記,例如。字段標記也能夠控制在某些環(huán)境中如何顯示,例如呈現為之前的標記相當于中的。類似于有和類,也包含和兩個類。 Serialization——序列化 官網地址 前言 本教程將會介紹創(chuàng)建一個簡單webAPI。在整個學習的過程中,將會逐一介紹到REST framework的各種組件,讓你全面的了解所有東西是如果組合在一...
摘要:測試這是一個測試鏈接。注意編寫注釋是一個好的習慣。包括各個字段的驗證標記,例如。字段標記也能夠控制在某些環(huán)境中如何顯示,例如呈現為之前的標記相當于中的。類似于有和類,也包含和兩個類。 Serialization——序列化 官網地址 前言 本教程將會介紹創(chuàng)建一個簡單webAPI。在整個學習的過程中,將會逐一介紹到REST framework的各種組件,讓你全面的了解所有東西是如果組合在一...
摘要:本文主要是用來記錄自己學習的過程。其中可能會有很多自己的錯誤理解。這里主要會用到的知識有百度百科阮一峰理解架構其余請自行百度。所有的全局設置都放在的字典中。使用標準的權限,未認證的用戶只讀權限不要忘記將添加到你的中。 本文主要是用來記錄自己學習django-rest-framework的過程。其中可能會有很多自己的錯誤理解。 這里主要會用到的知識有 1. [django](https:...
摘要:本文主要是用來記錄自己學習的過程。其中可能會有很多自己的錯誤理解。這里主要會用到的知識有百度百科阮一峰理解架構其余請自行百度。所有的全局設置都放在的字典中。使用標準的權限,未認證的用戶只讀權限不要忘記將添加到你的中。 本文主要是用來記錄自己學習django-rest-framework的過程。其中可能會有很多自己的錯誤理解。 這里主要會用到的知識有 1. [django](https:...
摘要:我們將會創(chuàng)建一個簡單的,來讓管理員能夠查看和編輯和。我們將會在接下來的例子中使用這個賬戶。創(chuàng)建一個新的模塊叫。但是是一個好的設計。最后,我們使用來導入默認的登錄登出這是可選的。我們想啟用分頁和只有用戶能夠調用。 Quickstart 我們將會創(chuàng)建一個簡單的API,來讓管理員能夠查看和編輯Users和Groups。 項目開始 創(chuàng)建一個新的項目叫 tutorial,然后創(chuàng)建一個app叫qu...
閱讀 1512·2021-11-24 09:38
閱讀 3366·2021-11-18 10:02
閱讀 3253·2021-09-22 15:29
閱讀 2937·2021-09-22 15:15
閱讀 1037·2021-09-13 10:25
閱讀 1834·2021-08-17 10:13
閱讀 1971·2021-08-04 11:13
閱讀 1973·2019-08-30 15:54