Django基礎之(十)DRF
DRF基礎之二
簡介
Requirements
REST framework requires the following:
- Python (2.7, 3.4, 3.5, 3.6, 3.7)
- Django (1.11, 2.0, 2.1)
- The following packages are optional:
coreapi (1.32.0+) - Schema generation support.
Markdown (2.1.0+) - Markdown support for the browsable API.
django-filter (1.0.1+) - Filtering support.
django-crispy-forms - Improved HTML display for filtering.
django-guardian (1.1.1+) - Object level permissions support
安裝與配置
- 安裝
pip3 install djangorestframework
pip3 install markdown # Markdown support for the browsable API.
pip3 install django-filter # Filtering support
- 配置
django-admin startproject devops vim devops/settings.py INSTALLED_APPS = ( ... 'rest_framework‘ ) # 重新建立資料庫day4,並配置vim devops/settings.py DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'day4', 'USER': 'root', 'PASSWORD': '123456', 'HOST': 'localhost', 'PORT': 3306, 'OPTIONS': { 'init_command': 'SET default_storage_engine=INNODB;', }, } }
- 新建一個idc的app
mkdir apps
django-admin startapp idc
mv idc apps
touch apps/__init__.py
- 將apps座位mainPath,並做配置
- 加入settings.py環境變數
import sys sys.path.insert(0,os.path.join(BASE_DIR,'apps')) INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'rest_framework', 'idc.apps.IdcConfig' ]
- 定義好主備路由
- 主路由
from django.conf.urls import url,include
from django.contrib import admin
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^',include('idc.urls'))
]
- 專案路由
from django.conf.urls import url,include
from . import views
urlpatterns = [
url(r'idcs/$',views.idc_list)
]
- 建立idc/models.py
from django.db import models
class Idc(models.Model):
name = models.CharField("IDC名稱",max_length=128,blank=False,null=True)
address = models.CharField("IDC地址",max_length=200,default="")
phone = models.CharField("IDC聯絡電話",max_length=20,null=True)
email = models.EmailField("IDC郵箱")
def __str__(self):
return self.name
class Meta:
db_table = "idc"
- 建立idc/serializers.py
from rest_framework import serializers
from .models import Idc
class IdcSerializer(serializers.Serializer):
id = serializers.IntegerField(read_only=True)
name = serializers.CharField()
address = serializers.CharField()
phone = serializers.CharField()
email = serializers.EmailField()
- 資料庫同步&生成資料
(venv3) [[email protected] devops]$ python3 manage.py makemigrations
(venv3) [[email protected] devops]$ python3 manage.py migrate
(venv3) [[email protected] devops]$ python3 manage.py shell
In [1]: from idc.models import Idc
In [2]: idc = Idc()
In [3]: idc.name = "北京機房"
In [4]: idc.address = "北京市酒仙橋"
In [5]: idc.phone = "123990131"
In [6]: idc.email = "[email protected]"
In [7]: idc.save()
In [8]: idc
Out[8]: <Idc: 北京機房>
In [10]: data = {"name":"上海機房","address":"上海","phone":"90909931","email":"[email protected]"} In [11]:
In [11]: data
Out[11]:
{'name': '上海機房',
'address': '上海',
'phone': '90909931',
'email': '[email protected]'}
In [12]: idc = Idc(**data)
In [13]: idc.save()
In [14]: Idc.objects.all()
Out[14]: <QuerySet [<Idc: 北京機房>, <Idc: 上海機房>]>
In [15]: idc
Out[15]: <Idc: 上海機房>
In [16]: from idc.serializers import IdcSerializer
In [17]: serializer = IdcSerializer(idc)
In [18]: serializer
Out[18]:
IdcSerializer(<Idc: 上海機房>):
id = IntegerField()
name = CharField()
address = CharField()
phone = CharField()
email = EmailField()
In [19]: serializer.data
Out[19]: {'id': 2, 'name': '上海機房', 'address': '上海', 'phone': '90909931', 'email': '[email protected]'}
- 會出錯的地方
In [21]: import json
In [22]: json.dumps(serializer.data)
Out[22]: '{"id": 2, "name": "\\u4e0a\\u6d77\\u673a\\u623f", "address": "\\u4e0a\\u6d77", "phone": "90909931", "email": "[email protected]"}'
In [23]: from rest_framework.renderers import JSONRenderer
In [24]: content = JSONRenderer().render(serializer.data)
In [25]: content #獲取到瀏覽器的資料
Out[25]: b'{"id":2,"name":"\xe4\xb8\x8a\xe6\xb5\xb7\xe6\x9c\xba\xe6\x88\xbf","address":"\xe4\xb8\x8a\xe6\xb5\xb7","phone":"90909931","email":"[email protected]"}'
In [26]: from django.utils.six import BytesIO
In [27]: stream = BytesIO(content) #將獲取的資料轉換成一個流
In [28]: from rest_framework.parsers import JSONParser
In [29]: data = JSONParser().parse(stream) #將資料轉換成dict
In [30]: data
Out[30]:
{'id': 2,
'name': '上海機房',
'address': '上海',
'phone': '90909931',
'email': '[email protected]'}
- 新建立資料並測試
from rest_framework import serializers
from .models import Idc
class IdcSerializer(serializers.Serializer):
id = serializers.IntegerField(read_only=True)
name = serializers.CharField()
address = serializers.CharField()
phone = serializers.CharField()
email = serializers.EmailField()
def create(self, validated_data):
return Idc.objects.create(**validated_data)
測試:
In [1]: data = {"name":"上海機房","address":"上海","phone":"90909931","email":"[email protected]"}
In [2]: data
Out[2]:
{'name': '上海機房',
'address': '上海',
'phone': '90909931',
'email': '[email protected]'}
In [3]: from idc.serializers import IdcSerializer
In [4]: idc = IdcSerializer(data=data)
In [5]: idc.is_valid()
Out[5]: True
In [6]: idc.save()
Out[6]: <Idc: 上海機房>
- 處理queryset
In [7]: from idc.models import Idc
In [8]: Idc.objects.all()
Out[8]: <QuerySet [<Idc: 北京機房>, <Idc: 上海機房>, <Idc: 上海機房>]>
In [9]: queryset = Idc.objects.all()
In [10]: IdcSerializer(queryset)
In [15]: ser = IdcSerializer(queryset,many=True) #many=False是要單個數據
In [16]: ser.data
Out[16]: [OrderedDict([('id', 1), ('name', '北京機房'), ('address', '北京市酒仙橋'), ('phone', '123990131'), ('email', '[email protected]')]), OrderedDict([('id', 2), ('name', '上海機房'), ('address', '上海'), ('phone', '90909931'), ('email', '[email protected]')]), OrderedDict([('id', 3), ('name', '上海機房'), ('address', '上海'), ('phone', '90909931'), ('email', '[email protected]')])]
序列化模型
model obj ==== > JSON
反序列化模型
http提交的資料 ==== > JSON =====> obj(model obj)
- 建立idc/views.py
from .models import Idc
from .serializers import IdcSerializer
from rest_framework.renderers import JSONRenderer
from rest_framework.parsers import JSONParser
from django.http import HttpResponse,JsonResponse
class JSONResponse(HttpResponse):
def __init__(self,data,**kwargs):
kwargs.setdefault('content_type', 'application/json')
content = JSONRenderer().render(data)
super(JSONResponse,self).__init__(content=content,**kwargs)
def idc_list(request,*args,**kwargs):
if request.method == "GET":
queryset = Idc.objects.all()
serializer = IdcSerializer(queryset,many=True)
return JSONResponse(serializer.data)
# content = JSONRenderer().render(serializer.data)
# return HttpResponse(content,content_type="application/json")
elif request.method == "POST":
content = JSONParser().parse(request)
serializer = IdcSerializer(data=content)
if serializer.is_valid():
serializer.save()
content = JSONRenderer().render(serializer.data)
return HttpResponse(content, content_type="application/json")
- 測試
In [17]: import requests
In [18]: url = "http://192.168.33.10:8080/idcs/"
In [19]: data = {"name":"上海機房","address":"上海","phone":"90909931","email":"[email protected]"}
In [20]: requests.post(url,data)
Out[20]: <Response [500]>
In [21]: r = requests.post(url,json=data)
In [22]: r.status_code
Out[22]: 500
In [23]: r = requests.post(url,json=data)
In [24]: r.status_code
Out[24]: 200
In [25]: r.content
Out[25]: b'{"id":5,"name":"\xe4\xb8\x8a\xe6\xb5\xb7\xe6\x9c\xba\xe6\x88\xbf","address":"\xe4\xb8\x8a\xe6\xb5\xb7","phone":"90909931","email":"[email protected]"}'
- 詳情相關的資料
idc/urls.py:
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'idcs/$',views.idc_list),
url(r'idcs/(?P<pk>[0-9]+)/$',views.idc_detail),
]
views.py
from .models import Idc
from .serializers import IdcSerializer
from rest_framework.renderers import JSONRenderer
from rest_framework.parsers import JSONParser
from django.http import HttpResponse,JsonResponse
class JSONResponse(HttpResponse):
def __init__(self,data,**kwargs):
kwargs.setdefault('content_type', 'application/json')
content = JSONRenderer().render(data)
super(JSONResponse,self).__init__(content=content,**kwargs)
def idc_list(request,*args,**kwargs):
if request.method == "GET":
queryset = Idc.objects.all()
serializer = IdcSerializer(queryset,many=True)
return JSONResponse(serializer.data)
# content = JSONRenderer().render(serializer.data)
# return HttpResponse(content,content_type="application/json")
elif request.method == "POST":
content = JSONParser().parse(request)
serializer = IdcSerializer(data=content)
if serializer.is_valid():
serializer.save()
content = JSONRenderer().render(serializer.data)
return HttpResponse(content, content_type="application/json")
def idc_detail(request,pk,*args,**kwargs):
try:
idc = Idc.objects.get(pk=pk)
except Idc.DoesNotExist:
return HttpResponse(status=404)
if request.method == "GET":
serializer = IdcSerializer(idc)
return JSONResponse(serializer.data)
elif request.method == "POST":
content = JSONParser().parse(request)
serializer = IdcSerializer(data=content)
if serializer.is_valid():
serializer.save()
return JSONResponse(serializer.data)
elif request.method == "PUT":
content = JSONParser().parse(request)
serializer = IdcSerializer(idc,data=content)
if serializer.is_valid():
serializer.save()
return JSONResponse(serializer.data)
elif request.method == "DELETE":
idc.delete()
return HttpResponse(status=204)
測試:
In [1]: import requests
In [2]: url = "http://192.168.33.10:8080/idcs/2/"
In [3]: requests.get(url)
Out[3]: <Response [200]>
In [4]: requests.get(url).content
Out[4]: b'{"id":2,"name":"\xe4\xb8\x8a\xe6\xb5\xb7\xe6\x9c\xba\xe6\x88\xbf","address":"\xe4\xb8\x8a\xe6\xb5\xb7","phone":"90909931","email":"[email protected]"}'
In [5]: requests.delete(url)
Out[5]: <Response [204]>
[[email protected] ~]$ curl -s -X PUT -d '{"name":"wanghui"}' http://192.168.33.10:8080/idcs/1/ #更新操作
{"id":1,"name":"wanghui","address":"北京市酒仙橋","phone":"123990131","email":"[email protected]"}[[email protected] ~]$
相關推薦
Django基礎之(十)DRF
DRF基礎之二 簡介 官方文件 Requirements REST framework requires the following: Python (2.7, 3.4, 3.5, 3.6, 3.7) Django (1.11, 2.0, 2.1) The fol
Django 基礎之(九)drf介紹.md
DRF 為什麼要進行前後端分離 PC,APP,PAD多端適配 SPA開發模式的流行 前後端職責不清 前後端開發效率問題,前後端相互等待 前段一直配合後端,能力受到限制 後端開發語言和模板高度耦合,導致開發語言依賴嚴重 前後端分離的缺點 前後端學習門檻增加 資料
Python3基礎之(十)def函式
如果我們用程式碼實現了一個小功能,但想要在程式程式碼中重複使用,不能在程式碼中到處貼上這些程式碼,因為這樣做違反 了軟體工程中 DRY原則。 Python 提供了 函式功能,可以將我們這部分功能抽象成一個函式以方便程式呼叫,或者提供給其他模組使用。 一、基本使用 def func
Python3基礎之(十 三)全域性變數&區域性變數
一、區域性變數 在 def 中, 我們可以定義一個區域性變數, 這個變數 a 只能在這個功能 func中有效, 出了這個函式,a 這個變數就不是那個區域性的 a. def func(): a=10 print(a) if __name__=='__main__'
Python3基礎之(十 二)函式預設引數
我們在定義函式時有時候有些引數在大部分情況下是相同的,一小部分情況下是不同的,所以為了提高函式的適用性,為了方便函式呼叫,也為了提供一些備選引數,我們可以將這些引數設定為預設引數,那麼該引數在函式呼叫過程中可以不需要明確給出。 一、基本使用 def function(para_1
Python3基礎之(十 四)模組安裝
安裝外部的模組有很多種方式, 不同的系統安裝形式也不同. 一、什麼是外部模組 外部模組就是在你 import 什麼東西到python 指令碼的時候會用到的. import numpy as np import matplotlib.pyplot as plt 這裡的 N
Python3基礎之(十 一)函式引數
我們在呼叫函式的時候,想要指定一些變數的值在函式中使用,那麼這些變數就是函式的引數,函式呼叫的時候, 傳入即可。 一、基本使用 def function(parameters): expressions parameters 的位置就是函式的引數,在呼叫的時候傳入即
Python3基礎之(十 五)讀寫檔案1
一、\n 換行命令 定義 text 為字串, 並檢視使用 \n 和不適用 \n 的區別: >>> text='this is first line,this is second line,this is third line' >>> prin
Python3基礎之(十 九)class類 init功能
一、init __init__可以理解成初始化class的變數,取自英文中initial最初的意思.可以在執行時,給初始值賦值, 執行c=Calculator(‘bad calculator’,18,17,16,15),然後調出每個初始值的值。看如下程式碼。 class Ca
Python3基礎之(十 八)class類
class Calculator: name='good calculator' def func1(self): a=10 return a def func2(self,canshu): c=canshu+4
Python3基礎之(十 七)讀寫檔案3
一、讀取檔案內容 file.read() 上一節我們講了,寫檔案用的是'w'和'a',那麼今天來看看讀取檔案怎麼做 使用 file.read() 能夠讀取到文字的所有內容. if __name__=='__main__': file=open('my file.txt',
Python3基礎之(十 六)讀寫檔案2
我們先儲存一個已經有3行文字的 “my file.txt” 檔案, 檔案的內容如下: This is my first test. This is the second line. This the third 然後使用新增文字的方式給這個檔案新增一行 “This is ap
Java 基礎之(十一)一維陣列
說明 陣列是程式語言中最常見的一種資料結構,可用於儲存多個數據,每個陣列元素存放一個數據,通常可通過陣列元素的索引來訪問陣列元素,包括為陣列元素賦值和取出陣列元素的值。 陣列也是一種資料型別,它本身是一種引用型別。 Java的陣列要求所有的陣列元素具有相同
Java 基礎之(十一)一維陣列(補充)
陣列的複製 在程式中,經常需要複製一個數組或一個數組的一部分。這種情況下可能要去嘗試用賦值語句(=),如下所示: int[] a = {1,3,5,7}; int[] b = new int[5]; b = a; 該語句並不能將a引用的陣列內容複製給b
python基礎教程(十)
.get 自定義 轉換 增加方法 log 技術分享 重寫 aaa 說明 魔法方法、屬性 ------------------------ 準備工作 為了確保類是新型類,應該把 _metaclass_=type 入到你的模塊的最開始。 class NewType(O
Python基礎之(三)----PyGame安裝步驟
百度搜 lar .net 系統 功能 遊戲 最快 adding libs http://blog.csdn.net/qq_33166080/article/details/68928563 如果你已經有一定的編程經驗,那麽學習一門新語言最快的方式就是拿著一個比較中型的項目,
python基礎學習(十)字串
字串的定義 字串 就是 一串字元,是程式語言中表示文字的資料型別 在 Python 中可以使用 一對雙引號 " 或者 一對單引號 ' 定義一個字串 雖然可以使用 \" 或者 \' 做字串的轉義,但是在實際開發中:
PHP基礎知識(十)
內容補充: 一、header函式使用: int header(string message). message格式:header_name:header_value. 1、重定位功能: "Location:url". 2、Refresh響應頭:
linux基礎篇(十):基於Redhat7系統中的定時任務
定時任務CRONTAB概念/介紹 crontab命令用於設定週期性被執行的指令。該命令從標準輸入裝置讀取指令,並將其存放於“crontab”檔案中,以供之後讀取和執行。 cron 系統排程程序。 可以使用它在每天的非高峰負荷時間段執行作業,或在一週或一月中的不同時段執行。cron是系統主
Python3基礎之(一)安裝
Mac安裝 Mac使用者安裝 python會比較方便,直接到官網下載安裝包, 下載自己需要的版本,預設路徑安裝即可。之後的某節會講到如何給Mac中的python安裝其他模組, 比如比較常用的numpy 、matplotlib、pandas等。 Windows 安裝 請到官網下