初次就这么给了你(Django-rest-framework)
Django-Rest-Framework
Django-Rest框架是構(gòu)建Web API強(qiáng)大而靈活的工具包。
簡(jiǎn)單粗暴,直奔主題。
pip install djangopip install djangorestframeworkpip install pygments # 代碼顯示高亮pip安裝好需要的工具包之后,我們就開(kāi)始創(chuàng)建一個(gè)框架。
打開(kāi)終端。 cd ~ 切換到根目錄下, (那個(gè)目錄頁(yè)可以,看自己想往哪里創(chuàng)建)django-admin.py startproject test_restframework # 創(chuàng)建工程 創(chuàng)建好之后切換進(jìn)工程里邊。cd test_restframework工程已經(jīng)創(chuàng)建好了,需要cd進(jìn)工程里邊,關(guān)鍵是manage.py在工程里邊,我們就需要借用manage.py來(lái)進(jìn)行其他的操作了。
給工程添加api
python manage.py startapp test_restapi # 創(chuàng)建api創(chuàng)建好之后,接下來(lái),我們需要對(duì)django框架進(jìn)行一些設(shè)置了(settings.py)
進(jìn)入工程目錄(test_restframework)找到settings.py,點(diǎn)開(kāi)找見(jiàn)(INSTALLD_APPS)這個(gè)配置元祖,然后添加
INSTALLD_APPS = (...'rest_framework','test_restframework.apps.SnippetsConfig', # 這里需要注意的就是 ,不添加有可能會(huì)出錯(cuò))配置添加完成之后,接下來(lái)我們改創(chuàng)建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模型已經(jīng)建好, 我們還需要模型遷移,并同步數(shù)據(jù)庫(kù)。
注意:同步數(shù)據(jù)庫(kù)命令是在 test_restframework下執(zhí)行python manage.py makemigrations test_restapipython manage.py migrate數(shù)據(jù)庫(kù)已經(jīng)同步了,我們還需要在Web API 上添加一些序列化和反序列化的實(shí)例的方法,例如 json ,我們可以通過(guò)聲明序列化器來(lái)實(shí)現(xiàn)這一點(diǎn),這些序列化器的工作方式與Django的表單相似,在test_restapi目錄中創(chuàng)建一個(gè)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 instanceserializer類的第一部分定義了被序列化反序列化的字段,create()和update()方法定義了在調(diào)用serializer.save()時(shí)如何創(chuàng)建或修改完全成熟的實(shí)例,
serializer類非常類似于django form類,它包括在不同的字段上的類似驗(yàn)證標(biāo)志,如required、max_length和default。
字段標(biāo)志還可以控制在某些情況下序列化程序的顯示方式,比如向HTML呈現(xiàn)的情況。
使用序列化器
在使用之前我們需要進(jìn)入Django-shell。
python manage.py shell進(jìn)入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()我們已經(jīng)有了一些可以使用的片段實(shí)例,讓我們來(lái)看看序列化其中的一個(gè)實(shí)例吧。
serializer = SnippetSerializer(snippet) serializer.data # {'id': 2, 'title': u'', 'code': u'print "hello, world"\n', 'linenos': False,'language': u'python', 'style': u'friendly'
我們已經(jīng)將模型實(shí)例轉(zhuǎn)化為python原生數(shù)據(jù)類型,為了完成序列化過(guò)程, 我們將數(shù)據(jù)轉(zhuǎn)化為json。
content = JSONRenderer().render(serializer.data) content # '{"id": 2, "title": "", "code": "print \\"hello, world\\"\\n", "linenos": false,"language": "python", "style": "friendly"}'
反序列化是相似的,首先我們解析一個(gè)流到python原生數(shù)據(jù)類型。
from django.utils.six import BytesIOstream = BytesIO(content) data = JSONParser().parse(stream)然后我們將這些本機(jī)數(shù)據(jù)類型,還原為一個(gè)完全填充的對(duì)象實(shí)例。
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而不是模型實(shí)例,為此, 我們只需要在序列化器中添加 many=True的標(biāo)記。
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')序列器有一個(gè)很好的屬性,可以同過(guò)它來(lái)打印它的表示,來(lái)檢查序列化器實(shí)例中所有的字段,打開(kāi) Django shell
python manage.py shell from test_restapi.serializers import SnippetSerializer serializer = SnippetSerializer() print(repr(serializer))重要的是要記住ModelSerializer類并沒(méi)有做什么特別神奇的事情,它們只是創(chuàng)建序列化的快捷方式。
使用序列化器編寫(xiě)常規(guī)的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)最后定義路由,將視圖連接起來(lái)。
目錄: ?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,我們可以通過(guò)curl來(lái)測(cè)試api,但是httpie也是一種很友好的測(cè)試包。
pip install httpie最后啟動(dòng)工程
python manage.py runserver工程起來(lái)之后,打開(kāi)瀏覽器,輸入url就可以看到結(jié)果了。 ?^.^
以上資料來(lái)自官網(wǎng)。如有 不明白之處,可以查詢官網(wǎng)示例: ?http://www.django-rest-framework.org/tutorial/1-serialization/
?
總結(jié)
以上是生活随笔為你收集整理的初次就这么给了你(Django-rest-framework)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: cad2016中选择全图字体怎么操作_在
- 下一篇: 如何注册CSDN博客