全稱:django-rest frameworklinux
接口:什麼是接口、restful接口規範(協議)git
CBV(基於FBV的基礎上造成)、CBV生命週期源碼----基於restful規範下的CBV接口web
請求生命週期:請求組件、解析組件、響應組件shell
序列化組件(序列化、反序列化簡單來講就是對象轉爲字符串、字符串轉爲對象,目的是爲傳輸數據(傳給別的語言或者存儲))數據庫
三大認證(重中之重):認證(用戶是否合法)、權限(管理員、普通用戶)、頻率(次數過多限制)django
其餘組件(過濾、篩選、排序、分頁、路由)json
概念:聯繫兩個物質的媒介,完成信息的交互。在web程序中,聯繫前臺頁面與後臺數據庫的媒介。api
web接口組成:瀏覽器
url:長得像返回數據的url連接。如api.baidu.map/search安全
(www.baidu.com不叫接口,叫url連接,訪問只能拿到主頁。api.baidu.map/search是接口,返回的是json數據)
請求參數:前臺按照指定的key提供數據給後臺。(必須是給定的,這樣後臺才能以此提取數據再到數據庫查詢返回)
響應數據:後臺與數據庫交互後,將數據反饋給前臺。
所以,接口就是帶着請求參數訪問可以獲得響應數據的url連接。
接口 = url + 請求參數 + 響應數據
接口規範:不一樣後臺語言,使用一樣的接口返回一樣的數據。
如何寫接口:要寫url和響應數據。若是將請求參數也加上,就是在寫接口文檔。
兩大部分:
(1)url
1)用api關鍵字標識接口url。方式1:api.baidu.com;方式2:www.baudu.com/api
2)接口數據安全性決定優先選用https協議。
3)若是一個接口有多版本存在,須要在url中標識體現。以下的v1和v2
api.baidu.com/v1/.... api.baidu.com/v2/....
4)操做中的數據稱爲資源,在url中資源通常採用複數形式,一個接口能夠歸納對該資源的多種操做方式。(一個url對應一個類,類裏面能夠有多個請求方法)
能夠對操做隱藏,而且複用性更強(寫動做了,只能適用這一個動做,不寫其餘動做均可以用)如api.baidu.com/books api.baidu.com/books/(pk)
5)請求方式有多種,用一個url處理如何讓保證不混亂------經過不一樣的請求方式標識不一樣操做資源的方式
/books get 獲取全部
/books post 增長一個(多個)
/books/(pk) delete 刪除一個
/books/(pk) put 總體更新一個 #改一個用戶
/books/(pk) patch 局部更新一個 #改一個用戶的密碼
6)資源每每涉及數據的各類操做方式:篩選、排序、限制
api.baidu.com/books/?search=寶馬&ordering=-price&limit=3
(2)響應數據
1)http請求的響應會有響應狀態碼,接口用來返回操做的資源數據,也有本身操做數據結果的資源狀態碼(status 0表明操做資源成功,1表明操做失敗,2表明操做成功,但沒匹配結果)
注:資源狀態碼和http狀態碼不同,爲先後臺的約定
2)資源狀態碼的文字提示。
status ok 「帳號有誤或者密碼有誤」
3)資源自己
results
注:刪除資源成功不作任何數據返回(只返回空字符串,連狀態碼、狀態信息都不返回)
4)不能直接返回的資源(子資源、圖片、視頻等資源),返回該資源的url連接。
https://api.baidu.com/v1/books?limit=3 get|post|delete|put|patch { 「status」 : 0, 「msg」 : 「ok」, 「results」: [ { 「title」: 「三國」, 「price」: 78, 「img」: 「https://.....」 } ] }
(1)項目準備:
1.分發路由 在項目文件夾的urls複製一份到應用文件夾中。而後在項目文件夾的urls分發路由給app:導入include,而後url(r'^api/', include('api.urls'))。再在app文件夾的urls.py中分發路由給CBV 2.視圖 在應用中分發路由前,先寫類視圖 from django.http import JsonResponse from django.views import View class Book(View): def get(self, request, *args, **kwargs): return JsonResponse('get ok', safe=False) def post(self, request, *args, **kwargs): return JsonResponse('get ok', safe=False) #safe默認爲true,要返回字典。不是字典不然拋異常。
3.在應用urls下分發路由 from django.conf.urls import url from . import views #注意在應用中導入視圖都是. 從當前應用中導入 urlpatterns = [ url(r'^books/', views.Book.as_view()), ]
4.定義模型類 (1)models.py中定義類 from django.db import models class Book(models.Model): title = models.CharField(max_length=64) price = models.DecimalField(max_digits=5, decimal_places=2) #整數、小數位 class Meta: #嵌套類(給上級類添加功能或指定標準) db_table = 'book' #自定義數據庫表名 verbose_name = "book" #給模型起個可讀的名字,默認是複數 verbose_name_plural = verbose_name #取消上面的複數 def __str__(self): #顯示的內容 return '<<%s>>' % self.title
(2)數據庫遷移 進入django的shell環境中:Tools----> run manage.py task 在shell環境中生成遷移文件:makemigrations。而後遷移:migrate
5.生成admin (1)在amin.py中註冊而且導入模型 from django.contrib import admin port models admin.site.register(models.Book)
(2)建立用戶 在shell環境中:createsuper建立超級用戶,而後輸入用戶密碼(郵箱不用)
|
(2)CBV的請求生命週期
請求如何到CBV下的get和post
a.請求過來,項目文件中路由分發給應用api的路由
b.應用分發路由走as_view函數。
views.Book.as_view() 保存一系列數據(request、args、**kwargs等)給Book對象,而後都給dispatch進行路由分發。
dispatch乾的事:判斷請求方式是否支持,而後返回(經過getattr)支持的這些請求方法(get、post等,在視圖中自定義get、post的返回值)的結果。
c.經過dispatch就執行了CBV下請求方式的結果,返回結果
六大基礎接口:獲取一個、獲取全部、增長一個、刪除一個、總體更新一個、局部更新一個
十大接口:6大基礎、羣增、羣刪、總體羣改、局部羣改
1.在應用的urls.py下分發路由 url(r'^books/$', views.Book.as_view()), #必需要加$,不然後面匹配不到 url(r'^books/(?P<pk>.*)/$', views.Book.as_view()),有名分組 在視圖函數中經過kwargs.get(pk)取到匹配的值
2.在views.py裏寫邏輯 class Book(View):
def get(self, request, *args, **kwargs): pk = kwargs.get('pk') #獲取參數 if not pk: #羣查接口 #操做數據庫 book_obj_list = models.Book.objects.all() #序列化過程 book_list = [] for obj in book_obj_list: #將查到的對象序列化 dic = {} dic['title'] = obj.title dic['price'] = obj.price book_list.append(dic) return JsonResponse({ 'status' : 0, "msg" : "ok", "results": book_list, }, json_dumps_params={'ensure_ascii':False}) else: #單查接口 book_dic = models.Book.objects.filter(pk=pk).values( 'title', 'price').first() if book_dic: return JsonResponse({ 'status': 0, "msg": "ok", "results": book_dic, }, json_dumps_params={'ensure_ascii': False})
return JsonResponse({ 'status': 2, "msg": "no results", }, json_dumps_params={'ensure_ascii': False})
def post(self, request, *args, **kwargs): #前臺經過urlencoded方式提交數據 try: book_obj = models.Book.objects.create(**request.POST.dict()) #create建立對象。將request.POST中存放的提交的關鍵詞參數轉化爲字典以**方式傳進去。沒傳參數,這邊會報錯。 if book_obj: return JsonResponse({ 'status': 0, "msg": "ok", 「results」: {‘title’:book_obj.title, 「price」:book_obj.price} }, json_dumps_params={'ensure_ascii': False}) except: #健壯性 return JsonResponse({ 'status': 1, "msg": "wrong params", }, json_dumps_params={'ensure_ascii': False}) return JsonResponse({ #可能操做數據庫失敗了 'status': 2, "msg": "created failed", }, json_dumps_params={'ensure_ascii': False})
|
JsonResponse返回時,中文會變成unicode,要加json_dumps_params={'ensure_ascii':False}選項。但在linux環境下的火狐瀏覽器,加了是亂碼。
filter返回queryset對象,對象裏是個列表(表名:對象信息(有自定義str就是自定義的信息))。first取裏第一個對象(至關於print(第一個對象))values展現對應的對象裏的值
<QuerySet [<Book: <<三國演義>>>]> #直接.filter
<<三國演義>> #.first()
<QuerySet [{'title': '三國演義', 'price': Decimal('56.00')}]> #.values('title','price')
{'title': '三國演義', 'price': Decimal('56.00')} #.values.first() 是個字典
上面序列化的工做很麻煩。drf就是爲了方便序列化的。
postman能夠完成不一樣方式的請求:get、post、put等
postman發送數據包有三種方式:form-data、urlencoded、json. 原生django對urlencoded數據提交兼容。