django兩種開發模式:
一、前后端不分離項目
二、前后端分離項目
什么是restful規范?
在前后端不分離的項目中,網頁所需要的數據可以直接通過模板渲染的方式傳遞到前端頁面,並且可以很好的支持django自帶的各種驗證工具,比如csrfmiddleware
但在前后端分離的項目中,前后端的數據通信普遍通過json字符串的形式通信,那么我們就需要有個標准去定義前后端溝通方式或者說格式
restful就是來干這件事情的,它是一種面向資源的架構,規定API如何編寫,通過它我們可以讓api更加簡潔可維護,是對於我們寫程序的一些規范
再次強調,restful規范只是一種規范,並不是強制性的,各公司可以結合自身需要去做適配和調整
它對於接口規范的影響深刻,絕大多數公司開發都沿用了這項規范,所以這往往也是面試官喜歡問的問題之一
restful規范10條:
1、API與用戶的通信協議,總是使用HTTPS協議--數據更安全
2、域名有區分:
-https://api.example.com
-https://example.org/api/
3、版本:
可以放在路徑中
-https://api.example.com/v1/zoos 這里的v1即是表示接口版本
也可以放在請求頭中
4、通過method區分是什么操作
-get 表示獲取資源
-post 表示新增
-put/patch表示更新
-delete表示刪除
5、路徑、視網絡上的所有東西都是資源,用名詞表示
-https://api.example.com/v1/zoos 這里的zoo即是名詞,不再出現動詞表示操作了
例如獲取id為1的書籍
https://api.example.com/v1/books/1 # 這是用get請求表示請求資源,如果是delete請求即表示將這本書刪除
6、過濾,在路徑上傳參的形式傳遞搜索條件
https://www.baidu.com/s?wd=python&rsv_spt=1
7、返回狀態碼:
{"status_code":100}
8、正確錯誤與否都應返回相應信息
{"status_code":100,"message":"登陸成功!"} {"status_code":101,"message":"登陸失敗!密碼錯誤!"}
9、返回結果,針對不同的請求,服務器向用戶返回結果
# -get獲取所有資源/get獲取一個資源 請求 -127.0.0.1/api/vi/books 獲取所有圖書 結果 {"status_code":100,'msg':'獲取成功',data:[{},{}]} 請求 -127.0.0.1/api/vi/books/3 獲取id為3的圖書 結果 {"status_code":100,'msg':'獲取成功',data:{name:xx,....}} # -新增數據,把新增的數據再返回 # -修改了數據,返回完整的資源對象 # -刪除數據,返回一個空文檔
10、返回結果中提供鏈接
什么是rest_framework?
它是基於Django的一種服務框架,可以幫助我們快速開發符合RESTful規范的接口框架。
功能:
1.路由
2.視圖
3.版本
4.認證
5.權限
6.頻率
7.解析器
8.序列化
9.分頁
10.渲染器
drf (django rest_framework):
APIView 的源碼,Requset的源碼
-安裝:
-pip3 install djangorestframework
-pycharm中安裝
-使用
-第一步,再寫視圖,都寫cbv
from rest_framework.views import APIView class Books(APIView): pass
-第二步,在setting中配置,rest_framework實質上是一個app,需要注冊才可以使用
INSTALLED_APPS= [ 。。。。。 'rest_framework' ]
-源碼分析:
視圖類繼承了APIView 之后:
-1 所有的請求都沒有csrf的認證了
-2 在APIView中as_view本質還是調用了父類的as_view(View的as_view)
-3 as_view中調用dispatch ----->>>這個dispatch是APIView的dispatch
-APIVIew的dispatch方法:
1 對原生request對象做了一層包裝(面向對象的封裝),以后再用的request對象都新的request對象
-2 在APIView中self.initial(request, *args, **kwargs),里面有頻率控制,權限控制和認證相關
-3 根據請求方法執行咱們寫的視圖類中的相應方法
--視圖類中方法的request對象,已經變成了封裝后的request
-Request類:
-1 原生的request是self._request
-2 取以post形式提交的數據,從request.data中取(urlencoded,formdata,json格式)
-3 query_params 就是原生request的GET的數據
-4 上傳的文件是從FILES中取
-5 (重點)其他的屬性,直接request.屬性名(因為重寫了__getattr__方法)