- 開發(fā)模式
- 普通開發(fā)模式(前后端放一起)
- 前后端分離
- 后端開發(fā)
為前端提供URL(API/接口的開發(fā))
- 后端開發(fā)
- Django中的 FBV和 CBV
- FBV:function base view 基于函數(shù)的視圖 view.py
def users(request): user_list = ['xxx', 'yyy'] return HttpResponse(json.dumps((user_list), )) - CBV:class base view 基于類的視圖 view.py
注意:使用CBV,則在 url.py 要寫入from django.views import View class StudentsView(View): def get(self, requeset, *args, **kwargs): return HttpResponse('GET') def post(self, requeset, *args, **kwargs): return HttpResponse('POST') def put(self, requeset, *args, **kwargs): return HttpResponse('PUT') def delete(self, requeset, *args, **kwargs): return HttpResponse('DELETE')類名.as_view()這種方式from django.config.urls import url from app01 import views urlpatterns = [ url('users/', views.users), url('students/'), views.StudentView.as_view()), ]
- FBV:function base view 基于函數(shù)的視圖 view.py
- 若有相同功能的可以寫在基類中:
from django.views import View class MyBaseView(object): def dispatch(self, request, *args, **kwargs): print('before') ret = super(MyBaseView, self).dispatch(request, *args, **kwargs) print('after') return ret class StudentsView(MyBaseView, view): def get(self, request, *args, **kwargs): print('get方法') return HttpResponse('GET')圖片.png
總結:
默認是開啟全站csrf認證的,
在FBV模式中,
方案一,注釋掉django.middleware.csrf.CsrfViewMiddleware中間件;
方案二,在views.py中導入from Django.decorators.csrf import csrf_exempt, csrf_protect然后添加裝飾器@csrf_exempt不使用認證,添加@csrf_protect使用認證
在CBV模式中,
方案一:導入from django.utils.decorators import method_decorator,from Django.decorators.csrf import csrf_exempt, csrf_protect,在方法上添加裝飾器@method_decorator(csrf_exempt)不使用認證,加裝飾器@method_decorator(csrf_protect)使用認證
方案二:在類中添加@method_decorator(csrf_exempt, name='dispatch')
from django.views import View
class MyBaseView(object):
@method_decorator(csrf_exempt)
def dispatch(self, request, *args, **kwargs):
print('before')
ret = super(MyBaseView, self).dispatch(request, *args, **kwargs)
print('after')
return ret
# @method_decorator(csrf_exempt, name='dispatch') # 方案二
class StudentsView(MyBaseView, view):
def get(self, request, *args, **kwargs):
print('get方法')
return HttpResponse('GET')
- restful 規(guī)范
- 1.根據(jù)method的不同做不同的操作,只寫一個URL
- 2.推薦使用HTTPS
- 3.命名規(guī)范:www.xxxx.com/api/v1/名詞名稱
- 4.方法method:
- GET :從服務器取出資源(一項或多項)
- POST :在服務器新建一個資源
- PUT :在服務器更新資源(客戶端提供改變后的完整資源)
- PATCH :在服務器更新資源(客戶端提供改變的屬性)
- DELETE :從服務器刪除資源
- 過濾
- https://api.example.com/v1/zoos?limit=10:指定返回記錄的數(shù)量
- https://api.example.com/v1/zoos?offset=10:指定返回記錄的開始位置
- https://api.example.com/v1/zoos?page=2&per_page=100:指定第幾頁,以及每頁的記錄數(shù)
- https://api.example.com/v1/zoos?sortby=name&order=asc:指定返回結果按照哪個屬性排序,以及排序順序
- https://api.example.com/v1/zoos?animal_type_id=1:指定篩選條件
- 狀態(tài)碼
- 200 OK - [GET]:服務器成功返回用戶請求的數(shù)據(jù),該操作是冪等的(Idempotent)。
- 201 CREATED - [POST/PUT/PATCH]:用戶新建或修改數(shù)據(jù)成功。
- 202 Accepted - [*]:表示一個請求已經(jīng)進入后臺排隊(異步任務)
- 204 NO CONTENT - [DELETE]:用戶刪除數(shù)據(jù)成功。
- 400 INVALID REQUEST - [POST/PUT/PATCH]:用戶發(fā)出的請求有錯誤,服務器沒有進行新建或修改數(shù)據(jù)的操作,該操作是冪等的。
- 401 Unauthorized - [*]:表示用戶沒有權限(令牌、用戶名、密碼錯誤)。
- 403 Forbidden - [*] 表示用戶得到授權(與401錯誤相對),但是訪問是被禁止的。
- 404 NOT FOUND - [*]:用戶發(fā)出的請求針對的是不存在的記錄,服務器沒有進行操作,該操作是冪等的。
- 406 Not Acceptable - [GET]:用戶請求的格式不可得(比如用戶請求JSON格式,但是只有XML格式)。
- 410 Gone -[GET]:用戶請求的資源被永久刪除,且不會再得到的。
- 422 Unprocesable entity - [POST/PUT/PATCH] 當創(chuàng)建一個對象時,發(fā)生一個驗證錯誤。
- 500 INTERNAL SERVER ERROR - [*]:服務器發(fā)生錯誤,用戶將無法判斷發(fā)出的請求是否成功。
- 錯誤處理,狀態(tài)碼是4xx時,應返回錯誤信息,error當做key。
{ error: "Invalid API key" } - 返回結果,針對不同操作,服務器向用戶返回的結果應該符合以下規(guī)范。
- GET /xxx:返回資源對象的列表(數(shù)組)
- GET /xxx/id:返回單個資源對象
- POST /xxx:返回新生成的資源對象
- PUT /xxx/id:返回完整的資源對象
- PATCH /xxx/id:返回完整的資源對象
- DELETE /xxx/id:返回一個空文檔
- Hypermedia API,RESTful API最好做到Hypermedia,即返回結果中提供鏈接,連向其他API方法,使得用戶不查文檔,也知道下一步應該做什么。
{"link": { "rel": "collection https://www.example.com/zoos", "href": "https://api.example.com/zoos", "title": "List of zoos", "type": "application/vnd.yourformat+json" }}
