在開發Web應用中,有兩種應用模式html
把html模板文件和django的模板語法結合渲染完成之後才從服務器返回給客戶。前端
API(Application Programming Interface,應用程序接口)vue
爲了在團隊內部造成共識、防止我的習慣差別引發的混亂,咱們須要找到一種你們都以爲很好的接口實現規範,並且這種規範可以讓後端寫的接口,用途一目瞭然,減小雙方之間的合做成本。python
目前市面上大部分公司開發人員使用的接口服務架構主要有:restful、rpc。mysql
rpc: 翻譯成中文:遠程過程調用[遠程服務調用].linux
http://www.example.com/apigit
post請求github
action=get_all_student¶ms=301&sex=1web
接口多了,對應函數名和參數就多了,前端在請求api接口時,就會比較難找.容易出現重複的接口。ajax
restful: 翻譯成中文: 資源狀態轉換.
把後端全部的數據/文件都當作資源.
那麼接口請求數據,本質上來講就是對資源的操做了.
web項目中操做資源,無非就是增刪查改.因此要求在地址欄中聲明要操做的資源是什麼,而後經過http請求動詞來講明對資源進行哪種操做.
POST http://www.example.com/api/students/ 添加學生數據
GET http://www.example.com/api/students/ 獲取全部學生
DELETE http://www.example.com/api/students/<pk> 刪除1個學生
兩種沒有好壞之分。
REST與技術無關,表明的是一種軟件架構風格,REST是Representational State Transfer的簡稱,中文翻譯爲「表徵狀態轉移」
REST從資源的角度類審視整個網絡,它將分佈在網絡中某個節點的資源經過URL進行標識,客戶端應用經過URL來獲取資源的表徵,得到這些表徵導致這些應用轉變狀態
全部的數據,不論是經過網絡獲取的仍是操做數據庫得到(增刪改查)的數據,都是資源,將一切數據視爲資源是REST區別與其餘架構風格的最本質屬性
對於REST這種面向資源的架構風格,有人提出一種全新的結構理念,即:面向資源架構(ROA:Resource Oriented Architecture)
對互聯網上的任意東西都視爲資源,他認爲一個url就是一個資源 好比:http://www.xxx.com/get_user/
答:API就是接口,提供的url。接口有兩個用途:
爲別人提供服務
先後端分離,一個寫vue,一個寫後端,他們之間都是經過ajax請求
RESTful是一種定義Web API接口的設計風格,尤爲適用於先後端分離的應用模式中。
這種風格的理念認爲後端開發任務就是提供數據的,對外提供的是數據資源的訪問接口,因此在定義接口時,客戶端訪問的URL路徑就表示這種要操做的數據資源。而對於數據資源分別使用POST、DELETE、GET、PUT等請求動做來表達對數據的增刪查改。
事實上,咱們可使用任何一個框架均可以實現符合restful規範的API接口。
參考文檔:http://www.runoob.com/w3cnote/restful-architecture.html
api接口開發,最核心最多見的一個過程就是序列化,所謂序列化就是把數據轉換格式。
序列化能夠分兩個階段:來反去序
把咱們識別的數據轉換成指定的格式提供給別人。
例如:咱們在django中獲取到的數據默認是模型對象,可是模型對象數據沒法直接提供給前端或別的平臺使用,因此咱們須要把數據進行序列化,變成字符串或者json數據,提供給別人。
把別人提供的數據轉換/還原成咱們須要的格式。
例如:前端js提供過來的json數據,對於python而言就是字符串,咱們須要進行反序列化換成模型類對象,這樣咱們才能把數據保存到數據庫中。
核心思想: 縮減編寫api接口的代碼
Django REST framework是一個創建在Django基礎之上的Web 應用開發框架,能夠快速的開發REST API接口應用。在REST framework中,提供了序列化器Serialzier的定義,能夠幫助咱們簡化序列化與反序列化的過程,不只如此,還提供豐富的類視圖、擴展類、視圖集來簡化視圖的編寫工做。REST framework還提供了認證、權限、限流、過濾、分頁、接口文檔等功能支持。REST framework提供了一個API 的Web可視化界面來方便查看測試接口。
中文文檔:https://q1mi.github.io/Django-REST-framework-documentation/#django-rest-framework
github: https://github.com/encode/django-rest-framework/tree/master
特色:
提供了定義序列化器Serializer的方法,能夠快速根據 Django ORM 或者其它庫自動序列化/反序列化;
提供了豐富的類視圖、Mixin擴展類,簡化視圖的編寫;
豐富的定製層級:函數視圖、類視圖、視圖集合到自動生成 API,知足各類須要;
多種身份認證和權限認證方式的支持;[jwt]
(json,web,tokens)
內置了限流系統;
直觀的 API web 界面;
可擴展性,插件豐富。
DRF須要如下依賴:
Python (2.7, 3.2, 3.3, 3.4, 3.5, 3.6)
Django (1.10, 1.11, 2.0)
DRF是以Django擴展應用的方式提供的,因此咱們能夠直接利用已有的Django環境而無需重新建立。(若沒有Django環境,須要先建立環境安裝Django)
前提是已經安裝了django,建議安裝在虛擬環境
關於虛擬環境的安裝參考(之後本身再總結怎樣安裝):http://www.javashuo.com/article/p-xsznfslg-bz.html
# mkvirtualenv drfdemo -p python3
# pip install django
pip install djangorestframework
pip install pymysql
linux 複製 shift+insert
django-admin startproject drfdemo
使用pycharm打開項目,設置虛擬環境的解析器,並修改manage.py中的後綴參數。
在settings.py的INSTALLED_APPS中添加'rest_framework'。
INSTALLED_APPS = [
...
'rest_framework',
]
接下來就可使用DRF提供的功能進行api接口開發了。在項目中若是使用rest_framework框架實現API接口,主要有如下三個步驟:
將請求的數據(如JSON格式)轉換爲模型類對象
操做數據庫
將模型類對象轉換爲響應的數據(如JSON格式)
from django.db import models # Create your models here. class Student(models.Model): # 模型字段 name = models.CharField(max_length=100, verbose_name="姓名") sex = models.BooleanField(default=1, verbose_name="性別") age = models.IntegerField(verbose_name="年齡") class_null = models.CharField(max_length=5, verbose_name="班級編號") description = models.TextField(max_length=1000, verbose_name="個性簽名") class Meta: db_table = "tb_student" verbose_name = "學生" verbose_name_plural = verbose_name
爲了方便測試,因此咱們能夠先建立一個數據庫。
執行數據遷移
把students子應用添加到INSTALL_APPS中
主引用中__init__.py設置使用pymysql做爲數據庫驅動
import pymysql
pymysql.install_as_MySQLdb()
settings.py配置文件中設置mysql的帳號密碼
DATABASES = { # 'default': { # 'ENGINE': 'django.db.backends.sqlite3', # 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), # }, 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': "students", "HOST": "127.0.0.1", "PORT": 3306, "USER": "root", "PASSWORD":"123", }, }
上面數據庫的配置,根據本身數據庫的帳號密碼和數據庫名作相應的配置。
終端下,執行數據遷移。
python manage.py makemigrations
python manage.py migrate
錯誤列表
# 執行數據遷移 python manage.py makemigrations 報錯以下:
註釋掉 backends/mysql/base.py中的35和36行代碼。
backends/mysql/operations.py146行裏面新增一個行代碼:
query = query.encode()
例如,在django項目中建立學生子應用。
python manage.py startapp students
在syudents應用目錄中新建serializers.py用於保存該應用的序列化器。
建立一個StudentModelSerializer用於序列化與反序列化。
# 建立序列化器類,回頭會在試圖中被調用
from rest_framework import serializers from students.models import Student # 建立序列化器類,回頭會在試圖中被調用 class StudentModelSerializer(serializers.ModelSerializer): class Meta: model = Student fields = "__all__"
model指明該序列化器處理的數據字段從模型類BookInfo參考生成
fields指明該序列化器包含模型類中的哪些字段,'__all__'指明包含全部字段
在students應用的views.py中建立視圖StudentViewSet,這是一個視圖集合。
from rest_framework.viewsets import ModelViewSet from .models import Student from .serializers import StudentModelSerializer # Create your views here. class StudentViewSet(ModelViewSet): queryset = Student.objects.all() serializer_class = StudentModelSerializer
queryset指明該視圖集在查詢數據時使用的查詢集
serializer_class指明該視圖在進行序列化或反序列化時使用的序列化器
在students應用的urls.py中定義路由信息。
from . import views from rest_framework.routers import DefaultRouter # 路由表 urlpatterns = [] router = DefaultRouter() # 能夠處理視圖的路由器 router.register('students', views.StudentViewsSet) # 向路由器中註冊視圖集 urlpatterns += router.urls # 將路由器中的全部路由信息追到django的路由列表中
最後把students子應用中的路由文件加載到總路由文件中,總urls.py進行的是路由分發
from django.contrib import admin from django.urls import path, include urlpatterns = [ path('admin/', admin.site.urls), path('stu/', include("students.urls")), path('sers/', include("sers.urls")), path('req/', include("req.urls")) ]
運行當前程序(與運行Django同樣)
python manage.py runserver
在瀏覽器中輸入網址127.0.0.1:8000,能夠看到DRF提供的API Web瀏覽頁面:
點擊連接127.0.0.1:8000/stu/students 能夠訪問獲取全部數據的接口,呈現以下頁面:
在頁面底下表單部分填寫學生信息,能夠訪問添加新學生的接口,保存學生信息:
點擊POST後,返回以下頁面信息(就是剛添加的信息):
這樣咱們再添加幾條信息。
在瀏覽器中輸入網址127.0.0.1:8000/stu/students/3/,能夠訪問獲取單一學生信息的接口(id爲3的學生),呈現以下頁面:
在頁面底部表單中填寫學生信息,能夠訪問修改學生的接口:
上圖對原來數據修改的地方。
點擊PUT,返回以下頁面信息數據被修改。數據庫中的數據也修改了見下圖查表的數據。
點擊DELETE按鈕,能夠訪問刪除學生的接口。
再次查詢表數據發現id=3的數據已經刪除。首先是頁面返回Not found的結果,而後是數據表剩餘的數據。
詳情請見:序列化器-Serializer