日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

初次就这么给了你(Django-rest-framework)

發(fā)布時(shí)間:2023/12/10 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 初次就这么给了你(Django-rest-framework) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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 instance

 serializer類的第一部分定義了被序列化反序列化的字段,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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。