什麼是restful規範?css
它是一套規範(協議),它作了一些規則,讓數據交互遵循這個規則。
對我來講最明顯的是他的method不一樣作不一樣的操做,以前增刪改查要位數4個url。
詳細:
1. https代替http,保證數據傳輸時安全。
2. 在url中通常要體現api標識,這樣看到url就知道他是一個api。
http://www.luffycity.com/api/....(建議,由於他不會存在跨域的問題)
http://api.luffycity.com/....
假設:
前段:https://www.luffycity.com/home
後端:https://www.luffycity.com/api/
3. 在接口中要體現版本
http://www.luffycity.com/api/v1....(建議,由於他不會存在跨域的問題)
注意:版本還能夠放在請求頭中
http://www.luffycity.com/api/
accept: ...
4. restful也稱爲面向資源編程,視網絡上的一切都是資源,對資源能夠進行操做,因此通常資源都用名詞。
http://www.luffycity.com/api/user/
5. 若是要加入一些篩選條件,能夠添加在url中
http://www.luffycity.com/api/user/?page=1&type=9
6. 根據method不一樣作不一樣操做。
7. 返回給用戶狀態碼
- 200,成功
- 300,301永久 /302臨時
- 400,403拒絕 /404找不到
- 500,服務端代碼錯誤
不少公司:
def get(self,request,*args,**kwargs):
result = {'code':1000,'data':None,'error':None}
try:
val = int('你好')
except Exception as e:
result['code'] = 10001
result['error'] = '數據轉換錯誤'
return Response(result)
8. 返回值
GET http://www.luffycity.com/api/user/
[
{'id':1,'name':'alex','age':19},
{'id':1,'name':'alex','age':19},
]
POST http://www.luffycity.com/api/user/
{'id':1,'name':'alex','age':19}
GET http://www.luffycity.com/api/user/2/
{'id':2,'name':'alex','age':19}
PUT http://www.luffycity.com/api/user/2/
{'id':2,'name':'alex','age':19}
PATCH https//www.luffycity.com/api/user/2/
{'id':2,'name':'alex','age':19}
DELETE https//www.luffycity.com/api/user/2/
空
9. 操做異常時,要返回錯誤信息
{
error: "Invalid API key"
}
10. 對於下一個請求要返回一些接口:Hypermedia AP
{
'id':2,
'name':'alex',
'age':19,
'depart': "http://www.luffycity.com/api/user/30/"
}
drf提供了那些功能?前端
路由
url -> UserView.as_view({"get":"list","post":'create'})
url(\d+) -> UserView.as_view({"get":"retrive","patch/put/delete/})
router = routers.DefaultRouter()
router.register(r'users', views.UserView)
視圖
APIView
ListAPIView/CreateAPIView
ModelViewSet
版本
局部配置
全局配置
認證
當用戶發來請求時,找到認證的全部類並實例化成爲對象列表,而後將對象列表封裝到新的request對象中。
之後在視同中調用request.user
在內部會循環認證的對象列表,並執行每一個對象的authenticate方法,該方法用於認證,他會返回兩個值分別會賦值給request.user/request.auth
權限
節流,如何實現?
在緩衝存在相似於一個字典的結構:
{
用戶標識:[11231212,12323123,123123123]
}
解析器,解析請求體中的數據,將其變成咱們想要的格式。request.data
篩選器(過濾器)
分頁
序列化,對對象或對象列表(queryset)進行序列化操做以及表單驗證的功能。
渲染器
drf組件認證的實現過程?linux
from django.conf.urls import url,include
from django.contrib import admin
from . import views
urlpatterns = [
url(r'^login/$', views.LoginView.as_view()),
url(r'^order/$', views.OrderView.as_view()),
url(r'^user/$', views.UserView.as_view()),
]
import uuid
from django.shortcuts import render
from django.views import View
from django.views.decorators.csrf import csrf_exempt
from django.utils.decorators import method_decorator
from rest_framework.versioning import URLPathVersioning
from rest_framework.views import APIView
from rest_framework.response import Response
from . import models
class LoginView(APIView):
def post(self,request,*args,**kwargs):
user_object = models.UserInfo.objects.filter(**request.data).first()
if not user_object:
return Response('登陸失敗')
random_string = str(uuid.uuid4())
user_object.token = random_string
user_object.save()
return Response(random_string)
class MyAuthentication:
def authenticate(self, request):
"""
Authenticate the request and return a two-tuple of (user, token).
"""
token = request.query_params.get('token')
user_object = models.UserInfo.objects.filter(token=token).first()
if user_object:
return (user_object,token)
return (None,None)
class OrderView(APIView):
authentication_classes = [MyAuthentication, ]
def get(self,request,*args,**kwargs):
print(request.user)
print(request.auth)
return Response('order')
class UserView(APIView):
authentication_classes = [MyAuthentication,]
def get(self,request,*args,**kwargs):
print(request.user)
print(request.auth)
return Response(