(一)drf基礎
全稱:django-rest framework
接口:什麼是接口、restful接口規範(協議)
CBV(基於FBV的基礎上形成)、CBV生命周期源碼—-基於restful規範下的CBV接口
請求生命周期:請求組件、解析組件、響應組件
序列化組件(序列化、反序列化簡單來說就是對象轉為字符串、字符串轉為對象,目的是為傳輸數據(傳給別的語言或者存儲))
三大認證(重中之重):認證(用戶是否合法)、權限(管理員、普通用戶)、頻率(次數過多限制)
其他組件(過濾、篩選、排序、分頁、路由)
1.接口
概念:聯繫兩個物質的媒介,完成信息的交互。在web程序中,聯繫前台頁面與後台數據庫的媒介。
web接口組成:
url:長得像返回數據的url鏈接。如api.baidu.map/search
(www.baidu.com不叫接口,叫url鏈接,訪問只能拿到主頁。api.baidu.map/search是接口,返回的是json數據)
請求參數:前台按照指定的key提供數據給後台。(必須是給定的,這樣後台才能以此提取數據再到數據庫查詢返回)
響應數據:後台與數據庫交互后,將數據反饋給前台。
因此,接口就是帶着請求參數訪問能夠得到響應數據的url鏈接。
接口 = url + 請求參數 + 響應數據
2.restful接口規範
接口規範:不同後台語言,使用同樣的接口返回同樣的數據。
如何寫接口:要寫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://.....” } ] }
3.django流程
(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下請求方式的結果,返回結果
4.django原生的接口、序列化
六大基礎接口:獲取一個、獲取所有、增加一個、刪除一個、整體更新一個、局部更新一個
十大接口: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數據提交兼容。
本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】
※教你寫出一流的銷售文案?
※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益
※回頭車貨運收費標準
※別再煩惱如何寫文案,掌握八大原則!
※超省錢租車方案
※產品缺大量曝光嗎?你需要的是一流包裝設計!