初次就這么給了你(Django-rest-framework)

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/

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/257401.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/257401.shtml
英文地址,請注明出處:http://en.pswp.cn/news/257401.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

error和exception

Error&#xff08;錯誤&#xff09;表示系統級的錯誤和程序不必處理的異常&#xff0c;是java運行環境中的內部錯誤或者硬件問題。比如&#xff1a;內存資源不足等。對于這種錯誤&#xff0c;程序基本無能為力&#xff0c;除了退出運行外別無選擇&#xff0c;它是由Java虛擬機拋…

使用logminer分析日志文件

實驗環境 win7 64 oracle PL/SQL Release 11.2.0.1.0 - Productionhttp://blog.csdn.net/tianlesoftware/article/details/5604497--這些操作需要在sysdba身份執行1.執行分析之前需要添加補充日志SELECT SUPPLEMENTAL_LOG_DATA_MIN FROM V$DATABASE;查看補充日志是否開啟&…

linux c++ 獲取時間,詳解Linux下的C++時間類型:time_t

Unix時間戳(Unix timestamp)&#xff0c;或稱Unix時間(Unix time)、POSIX時間(POSIXtime)&#xff0c;是一種時間表示方式&#xff0c;定義為從格林威治時間1970年01月01日00時00分00秒起至現在的總秒數。Unix時間戳不僅被使用在Unix系統、類Unix系統中&#xff0c;也在許多其他…

程序員的國慶節如何安排,你想好了嗎?

2019獨角獸企業重金招聘Python工程師標準>>> 就要國慶放假了&#xff0c;國慶節是旅游的黃金期&#xff0c;同時也是我們買買買的幸福期&#xff0c;作為一名技術開發&#xff0c;除了要安排假期旅游行程外也不要忘記提升自己&#xff0c;準備好學習計劃&#xff0c…

Print! Print! Print!

print語句可以實現打印--只是對程序員友好的標準輸出流的接口而已。 從技術角度來講&#xff0c;這是把一個或多個對象轉換為其文本表達形式&#xff0c;然后發送給標準輸出或另一個類似文件的流。 更詳細地說&#xff0c;在Python中&#xff0c;打印與文件和流的概念緊密相連。…

C#讓TopMost窗體彈出并置頂層但不獲取當前輸入焦點的終極辦法

為了使程序在彈出窗口時置頂層且不獲取系統輸入焦點&#xff0c;避免影響用戶當前的操作&#xff0c;來電通來電彈屏軟件嘗試過N多種辦法&#xff0c;例如&#xff1a;彈出前保存當前焦點窗口句柄&#xff0c;彈出時因為使用TopMost系統默認將焦點交給了彈出窗口&#xff0c;彈…

微服務實戰(一):微服務架構的優勢與不足

本文講的是微服務實戰&#xff08;一&#xff09;&#xff1a;微服務架構的優勢與不足&#xff0c;【編者的話】本文來自Nginx官方博客&#xff0c;是微服務系列文章的第一篇&#xff0c;主要探討了傳統的單體式應用的不足&#xff0c;以及微服務架構的優勢與挑戰。正如作者所說…

linux創建zip+函數,linux+shell基礎知識

目錄&#xff1a;1.路徑&#xff1a;2.進程&#xff1a;3.清屏和退出當前命令操作&#xff1a;4.ls 參數&#xff1a;5.創建目錄\文件\復制文件&#xff1a;6.查看文件內容&#xff1a;7.linux通配符&#xff1a;8.grep:9.終止命令&#xff1a;10.搜索文件&#xff1a;11.查看網…

關于浮動float屬性和position:absolute屬性的區別

最近返回頭看了很多書籍&#xff0c;一直在糾結float屬性和absolute絕對定位的區別和使用的情況&#xff0c;給大家分享一下自己的心得和體會吧。 1&#xff0c;float屬性 float屬性意義是讓元素拜托獨占一行的霸道總裁&#xff0c;成為一個普普通通的人。比如下面這個例子 如圖…

Climbing Stairs

You are climbing a stair case. It takes n steps to reach to the top. Each time you can either climb 1 or 2 steps. In how many distinct ways can you climb to the top? 分析&#xff1a;考慮走第n步時的情況&#xff0c;可以從第n-1個臺階走一步&#xff0c;也可以從…

3dmax linux版本,如何安裝Linux版FLOW-3D及注意事項

如何安裝Linux版FLOW-3D及注意事項安裝Linux版的flow3d流程&#xff1a;1、復制flow3d安裝CD盤中unix文件夾到Linux系統桌面&#xff1b;(或從CD中直接安裝也可以)2、從terminal進入unix文件夾&#xff1b;3、./install或./install_flow3d4、提示是否接受license協議&#xff0…

高級組合技打造“完美” 捆綁后門

0x00 簡介 之前寫過一篇關于客戶端釣魚的文章&#xff1a;《使用powershell Client進行有效釣魚》中&#xff0c;在使用各個Client進行測試的過程中&#xff0c;個人發現CHM文件是最好用的一個&#xff0c;但是其缺點就是會彈黑框&#xff0c;這樣就會讓被攻擊者察覺。那么怎么…

使用友盟分享心得(SSO登陸,不能獲取accesstoken,不能跳轉APPSSO登陸的問題)

在xcode5中plist 文件是默認有 Bundle DisplayName的 而如果工程是在xcode6環境下開發的話。 這時候就會出現友盟無法跳轉微博跟QQSSO的問題。 solution&#xff1a;在plist中加入bundle DisplayName 轉載于:https://www.cnblogs.com/ZippoatiOS/p/4443933.html

linux單線程處理多個請求,redis是單線程的,如何處理并發請求?

疑問&#xff1a;redis是單線程的&#xff0c;如何并發處理多個請求&#xff1f;下面是我個人的理解。答案是&#xff1a;使用操作系統的多進程機制。也就是我們常說的&#xff0c;多路復用API&#xff0c;多路復用API本質上是對操作系統多路復用功能的封裝。什么是操作系統的多…

Cloudera Manager內部結構、功能包括配置文件、目錄位置等

2019獨角獸企業重金招聘Python工程師標準>>> 問題導讀 1.CM的安裝目錄在什么位置&#xff1f; 2.hadoop配置文件在什么位置&#xff1f; 3.Cloudera manager運行所需要的信息存在什么位置&#xff1f; 4.CM結構和功能是什么&#xff1f; 1. 相關目錄 /var/log/cloud…

python 學習筆記(一)

在Windows上安裝Python 首先&#xff0c;從Python的官方網站www.python.org下載最新的2.7.9版本&#xff0c;地址是這個&#xff1a; http://www.python.org/ftp/python/2.7.9/python-2.7.9.msi 然后&#xff0c;運行下載的MSI安裝包&#xff0c;在選擇安裝組件的一步時&#x…

An ffmpeg and SDL Tutorial

http://dranger.com/ffmpeg/轉載于:https://www.cnblogs.com/qwertWZ/p/4447141.html

linux模式匹配,sed的模式匹配用法探討

[rootsunsky Desktop]# cat sunskyabcdef[rootsunsky Desktop]# cat sunsky|sed 1,2d|sed 1,2def[rootsunsky Desktop]# cat sunsky|sed -e 1,2d -e 1,2ddef問題&#xff1a;sed中-e的意思是直接在指令列模式上進行sed的動作編輯按照&#xff0c;那么按照-e的含義&#xff0c;上…

Qualcomm QXDM工具簡介和log抓取

高通工具簡介QXDM 簡介QXDM 安裝QXDM 激活QXDM 使用AT打開Diagnostic口 QXDM 配置1 Message View ConfigurationMessage PacketsLog PacketsLog PacketsOTAEvent ReportsStrings2 Log View Config3 QXDM-保存配置文件4 QXDM-導入配置文件QPST 端口配置QXDM 抓取log QXDM LOG保存…

layout_gravity

layout_gravity——當前View&#xff0c;本身&#xff0c;在父一級的控件所分配的顯示范圍內的&#xff0c;對齊方式常用在&#xff1a; 當前控件&#xff08;在父一級LineLayout所分配給其的顯示范圍內&#xff09;的對齊方式需要注意的是&#xff0c;如果TableRow的gravity確…