drf框架

drf框架的全稱:diango-rest framework,是一種後端框架。python

接口

  接口:鏈接兩個物質的媒介,完成信息交互。而web程序中的接口:做爲前臺頁面與後臺數據庫鏈接的媒介。 git

  web接口組成:web

    url:長得像放回數據的url連接。如api.baidu.map/search,一訪問後臺返回給你的是一大堆查詢到的數據 結果 。做爲接口最主要的部分。數據庫

    請求參數:前臺按照指定的key提供數據給後臺django

    響應數據:後臺與數據庫交互後將數據反饋給前臺json

  一個規定的請求參數的url訪問後能返回對應的結果的url連接。後端

restful接口規範

  接口規範:就是爲了採用不一樣的後臺語言,也能使用一樣的接口獲取到一樣的數據。api

  如何寫接口:接口規範是規範化書寫接口的,寫接口要寫 url、響應數據。安全

    注意:若是將請求參數也歸入考量範圍,那就是在寫 接口文檔restful

url

  1)用api關鍵字來標識接口url。如:api.baidu.com | www.baidu.com/api

  2)考慮到接口數據安全性,優先選擇https協議。

  3)若是一個接口中有多個不一樣的版本,須要在url中標識體現出來。如:api.baidu.com/v1/... | api.baidu.com/v2/...

  4)接口操做的數據源稱之爲資源,在url中通常採用資源複數形式,一個接口能夠歸納爲對資源的多種操做方式。如:api.baidu.com/books | www.baidu.com/api/books(pk),操做單個資源的時候,須要用到主鍵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

響應數據

  1) http請求的響應會有相對應的響應碼,接口是用來返回操做的資源數據,能夠擁有操做數據結果的狀態碼。status: 0(操做資源成功) ;1(操做資源失敗); 2(操做資源成功,但沒匹配結果)

注:資源狀態碼不像http狀態碼,通常都是後臺與前臺或是客戶約定的

  2) 資源的狀態碼文字提示。如:status ok '帳號有誤' '密碼有誤' '用戶鎖定'

  3) 資源自己。results。

    注意:刪除資源成功不作任何數據返回(返回空字符串)

  4) 不能直接放回的資源(子資源、圖片、視頻等資源),返回該資源的url連接

基於restful規範的原生Django接口

主路由:url.py

1 from django.conf.urls import url, include
2 from django.contrib import admin
3 
4 
5 urlpatterns = [,
6     url(r'^admin/', admin.site.urls),        # 路由分發,分發給api中的路由
7     url(r'^api/', include('api.urls'))  
8 ]

api組件的子路由:api/url.py

1 from django.conf.urls import url
2 from . import views
3 
4 urlpatterns = [
5     url(r'^books/', views.Book.as_view()), # 執行as_view這個函數,再拿到執行結果
6     url(r'^books/(?P<pk>.*)/$', views.Book.as_view()),
7 ]

模型層:model.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 = 'old_boy_book'
        verbose_name = '書籍'
        verbose_name_plural = verbose_name

    def __str__(self):
        return '《%s》' % self.title

後臺層:admin.py

1 from django.contrib import admin
2 from . import models
3 
4 admin.site.register(models.Book)

數據庫遷移

>: python manage.py makemigrations
>: python manage.py migrrate

>: python manage.py createsuperuser

視圖層:views.py

from django.http import JsonResponse
from django.views import View
from . import models


# 六大基礎接口:獲取一個,獲取全部,增長一個,刪除一個,總體更新一個,局部更新一個
# 十大接口:羣增,羣刪,總體改羣改 局部改羣改
class Book(View):
    def get(self, request, *args, **kwargs):
        pk = kwargs.get('pk')    # 有名分組
        if not pk:  # 若是有pk,查單個。若是沒有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': '無結果', }, json_dumps_params={'ensure_ascii': False}) # postman能夠完成不一樣方式的請求:get | post | put ... # postman發送數據包有三種方式:form-data | urlencoding | json # 原生django對urlencoding方式數據兼容最好 def post(self, request, *args, **kwargs): # 前臺經過urlencoding方式提交數據 try: book_obj = models.Book.objects.create(**request.POST.dict()) 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': '參數有誤', }, json_dumps_params={'ensure_ascii': False}) return JsonResponse({ 'status': 2, 'msg': '新增失敗', }, json_dumps_params={'ensure_ascii': False})

Postman接口工具

  在官網下載安裝https://www.getpostman.com/ ,詳細安裝步驟可見 http://www.onlinedown.net/soft/971602.htm 。

  get請求,攜帶參數採用Params。post等請求,不須要pk主鍵, 在Body中提交數據包能夠採用三種方式:form-date、urlencoding、json。全部請求均可以攜帶請求頭

 Drl安裝和與封裝風格

  安裝所要輸入的指令   >: pip3 install djangorestframework

drf框架規矩的封裝風格

from rest_framework.views import APIView
from rest_framework.response import Response # 響應數據
from rest_framework.request import Request  # 請求數據
from rest_framework.serializers import Serializer # 序列化
from rest_framework.settings import APISettings # 
from rest_framework.filters import SearchFilter # 查詢過濾器
from rest_framework.pagination import PageNumberPagination  # 分頁
from rest_framework.authentication import TokenAuthentication
from rest_framework.permissions import IsAuthenticated  # 是不是登陸用戶
from rest_framework.throttling import SimpleRateThrottle  # 頻率

class Test(APIView):
    def get(self, request, *args, **kwargs):
        return Response('drf get ok')

 drf請求生命週期

1) 請求走的是APIView的as_view函數

2) 在APIView的as_view調用父類(django原生)的as_view,還禁用了 csrf 認證

3) 在父類的as_view中dispatch方法請求走的又是APIView的dispatch

4) 完成任務方法交給視圖類的請求函數處理,獲得請求的響應結果,返回給前臺

相關文章
相關標籤/搜索