Django-Rest-Framework
Django-Rest框架是構建Web API強大而靈活的工具包。
簡單粗暴,直奔主題。
pip install djangopip install djangorestframeworkpip install pygments # 代碼顯示高亮
pip安裝好需要的工具包之后,我們就開始創建一個框架。
打開終端。 cd ~ 切換到根目錄下, (那個目錄頁可以,看自己想往哪里創建)django-admin.py startproject test_restframework # 創建工程 創建好之后切換進工程里邊。cd test_restframework
工程已經創建好了,需要cd進工程里邊,關鍵是manage.py在工程里邊,我們就需要借用manage.py來進行其他的操作了。
給工程添加api
python manage.py startapp test_restapi # 創建api
創建好之后,接下來,我們需要對django框架進行一些設置了(settings.py)
進入工程目錄(test_restframework)找到settings.py,點開找見(INSTALLD_APPS)這個配置元祖,然后添加
INSTALLD_APPS = (...'rest_framework','test_restframework.apps.SnippetsConfig', # 這里需要注意的就是 ,不添加有可能會出錯)
配置添加完成之后,接下來我們改創建model了。
目錄: ? test_restapi/model.py
from django.db import models
from pygments.lexers import get_all_lexers
from pygments.styles import get_all_styleaLEXERS = [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, default='')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',)
model模型已經建好, 我們還需要模型遷移,并同步數據庫。
注意:同步數據庫命令是在 test_restframework下執行python manage.py makemigrations test_restapipython manage.py migrate
數據庫已經同步了,我們還需要在Web API 上添加一些序列化和反序列化的實例的方法,例如 json ,我們可以通過聲明序列化器來實現這一點,這些序列化器的工作方式與Django的表單相似,在test_restapi目錄中創建一個serializer.py文件,添加以下代碼。
from rest_framework import serializers
from test_restapi.models import Snipper, LANGUAGE_CHOICES, STYLE_CHOICESclass SnippetSerialiazer(zerializers.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.object.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()時如何創建或修改完全成熟的實例,
serializer類非常類似于django form類,它包括在不同的字段上的類似驗證標志,如required、max_length和default。
字段標志還可以控制在某些情況下序列化程序的顯示方式,比如向HTML呈現的情況。
使用序列化器
在使用之前我們需要進入Django-shell。
python manage.py shell
進入shell之后我們需要輸入:
from test_restapi.models import Snippet
from test_restapi.serializers import SnippetSerializer
from rest_framework.renders import JSONRenderer
from rest_framework.parsers import JSONParsersnippet = Snippet(code='foo = "bar"\n')
snippet.save()snippet = Snippet(code='print "hello world"\n')
snippet.save()
我們已經有了一些可以使用的片段實例,讓我們來看看序列化其中的一個實例吧。
serializer = SnippetSerializer(snippet)
serializer.data
# {'id': 2, 'title': u'', 'code': u'print "hello, world"\n', 'linenos': False,
'language': u'python', 'style': u'friendly'
我們已經將模型實例轉化為python原生數據類型,為了完成序列化過程, 我們將數據轉化為json。
content = JSONRenderer().render(serializer.data)
content
# '{"id": 2, "title": "", "code": "print \\"hello, world\\"\\n", "linenos": false,
"language": "python", "style": "friendly"}'
反序列化是相似的,首先我們解析一個流到python原生數據類型。
from django.utils.six import BytesIOstream = BytesIO(content)
data = JSONParser().parse(stream)
然后我們將這些本機數據類型,還原為一個完全填充的對象實例。
serializer = SnippetSerializer(data=data)
serializer.is_valid()
# True
serializer.validated_data
# OrderedDict([('title', ''), ('code', 'print "hello, world"\n'),
('linenos', False), ('language', 'python'), ('style', 'friendly')])
serializer.save()
# <Snippet: Snippet object>
我們還可以序列化querysets而不是模型實例,為此, 我們只需要在序列化器中添加 many=True的標記。
serializer = SnippetSerializer(Snippet.objects.all(), many=True)
serializer.data
# [OrderedDict([('id', 1), ('title', u''), ('code', u'foo = "bar"\n'), ('linenos', False), ('language', 'python'), ('style', 'friendly')]), OrderedDict([('id', 2), ('title', u''), ('code', u'print "hello, world"\n'), ('linenos', False), ('language', 'python'), ('style', 'friendly')]), OrderedDict([('id', 3), ('title', u''), ('code', u'print "hello, world"'), ('linenos', False), ('language', 'python'), ('style', 'friendly')])]
使用ModelSerializers
將test_restapi/serializers.py文件里的代碼替換為:
class SnippetSerializer(serializers.ModelSerializer):class Meta:model = Snippetfields = ('id', 'title', 'code', 'linenos', 'language', 'style')
序列器有一個很好的屬性,可以同過它來打印它的表示,來檢查序列化器實例中所有的字段,打開 Django shell
python manage.py shell
from test_restapi.serializers import SnippetSerializer
serializer = SnippetSerializer()
print(repr(serializer))
重要的是要記住ModelSerializer類并沒有做什么特別神奇的事情,它們只是創建序列化的快捷方式。
使用序列化器編寫常規的django視圖
目錄: test_restapi/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@csrf_exempt
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 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)@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)
最后定義路由,將視圖連接起來。
目錄: ?test_restapi/urls.py
from django.conf.urls import url
from snippets import viewsurlpatterns = [url(r'^snippets/$', views.snippet_list),url(r'^snippets/(?P<pk>[0-9]+)/$', views.snippet_detail),
]
目錄: ?test_restframework/urls.py
from django.conf.urls import url, includeurlpatterns = [url(r'^', include('test_resrapi.urls')),
]
安裝httpie,我們可以通過curl來測試api,但是httpie也是一種很友好的測試包。
pip install httpie
最后啟動工程
python manage.py runserver
工程起來之后,打開瀏覽器,輸入url就可以看到結果了。 ?^.^
以上資料來自官網。如有 不明白之處,可以查詢官網示例: ?http://www.django-rest-framework.org/tutorial/1-serialization/
?