免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
drf1

復(fù)習(xí)

"""1、vue如果控制html    在html中設(shè)置掛載點(diǎn)、導(dǎo)入vue.js環(huán)境、創(chuàng)建Vue對(duì)象與掛載點(diǎn)綁定    2、vue是漸進(jìn)式j(luò)s框架3、vue指令    {{ }}    v-text|html => 限制一次性渲染 v-once    v-if|show    v-if v-else-if v-else    v-for    v-model    v-bind  [c1, c2] | {active: isActive}:class={xxx:yy}    v-on fn | fn(...) | fn($event, ...)        {{ data中出現(xiàn)的變量 }}  v-if="data中出現(xiàn)的變量 的條件表達(dá)式"    4、vue實(shí)例成員    el | template    components    data {} | data () { return {} }    methods    computed:定義的是方法屬性    watch:監(jiān)聽屬性    props        <div id="app">        <Nav :subdata="supdata" @subaction="supaction"></Nav>    </div>    5、生命周期鉤子    都是實(shí)例成員,在組件創(chuàng)建到銷毀整個(gè)過程的某些時(shí)間節(jié)點(diǎn)回調(diào)的函數(shù)        beforeCreated() {        this._fn => this.$option.methods._fn    }    6、項(xiàng)目    環(huán)境:node => npm(cnpm) => vue/cli    創(chuàng)建與配置 vue create proj | 選擇基礎(chǔ)插件 | 配置npm啟動(dòng)    插件:vue-router | vuex | axios | vue-cookies | element-ui"""

drf框架

全稱:django-rest framework

知識(shí)點(diǎn)

"""1、接口:什么是接口、restful接口規(guī)范2、CBV生命周期源碼 - 基于restful規(guī)范下的CBV接口3、請(qǐng)求組件、解析組件、響應(yīng)組件4、序列化組件(靈魂)5、三大認(rèn)證(重中之重):認(rèn)證、權(quán)限(權(quán)限六表)、頻率6、其他組件:過濾、篩選、排序、分頁、路由"""# 難點(diǎn):源碼分析

接口

"""接口:聯(lián)系兩個(gè)物質(zhì)的媒介,完成信息交互web程序中:聯(lián)系前臺(tái)頁面與后臺(tái)數(shù)據(jù)庫的媒介web接口組成:    url:長得像返回?cái)?shù)據(jù)的url鏈接    請(qǐng)求參數(shù):前臺(tái)按照指定的key提供數(shù)據(jù)給后臺(tái)    響應(yīng)數(shù)據(jù):后臺(tái)與數(shù)據(jù)庫交互后將數(shù)據(jù)反饋給前臺(tái)"""

restful接口規(guī)范

接口規(guī)范:就是為了采用不同的后臺(tái)語言,也能使用同樣的接口獲取到同樣的數(shù)據(jù)

如何寫接口:接口規(guī)范是 規(guī)范化書寫接口的,寫接口要寫 url、響應(yīng)數(shù)據(jù)

? 注:如果將請(qǐng)求參數(shù)也納入考量范圍,那就是在寫 接口文檔

兩大部分:

  • url
1) 用api關(guān)鍵字標(biāo)識(shí)接口url    api.baidu.com | www.baidu.com/api    2) 接口數(shù)據(jù)安全性決定優(yōu)先選擇https協(xié)議3) 如果一個(gè)接口有多版本存在,需要在url中標(biāo)識(shí)體現(xiàn)    api.baidu.com/v1/... | api.baidu.com/v2/...    4) 接口操作的數(shù)據(jù)源稱之為 資源,在url中一般采用資源復(fù)數(shù)形式,一個(gè)接口可以概括對(duì)該資源的多種操作方式    api.baidu.com/books | api.baidu.com/books/(pk)    5) 請(qǐng)求方式有多種,用一個(gè)url處理如何保證不混亂 - 通過請(qǐng)求方式標(biāo)識(shí)操作資源的方式    /books      get         獲取所有    /books      post        增加一個(gè)(多個(gè))    /books/(pk) delete      刪除一個(gè)    /books/(pk) put         整體更新一個(gè)    /books/(pk) patch       局部更新一個(gè)6) 資源往往涉及數(shù)據(jù)的各種操作方式 - 篩選、排序、限制    api.baidu.com/books/?search=西&ordering=-price&limit=3
  • 響應(yīng)數(shù)據(jù)
1) http請(qǐng)求的響應(yīng)會(huì)有響應(yīng)狀態(tài)碼,接口用來返回操作的資源數(shù)據(jù),可以擁有 操作數(shù)據(jù)結(jié)果的 狀態(tài)碼    status  0(操作資源成功)  1(操作資源失敗)  2(操作資源成功,但沒匹配結(jié)果)    注:資源狀態(tài)碼不像http狀態(tài)碼,一般都是后臺(tái)與前臺(tái)或是客戶約定的    2) 資源的狀態(tài)碼文字提示    status  ok  '賬號(hào)有誤'  '密碼有誤'  '用戶鎖定'    3) 資源本身    results    注:刪除資源成功不做任何數(shù)據(jù)返回(返回空字符串)    4) 不能直接返回的資源(子資源、圖片、視頻等資源),返回該資源的url鏈接

基于restful規(guī)范的原生Django接口

CBV 路由分發(fā)

主路由:url.py
from django.conf.urls import url, includefrom django.contrib import adminurlpatterns = [    url(r'^admin/', admin.site.urls),    # 路由分發(fā),在后面訪問的地址為http://127.0.0.1:8000/api/books/,api就是路由分發(fā)的文件夾的名字    url(r'^api/', include('api.urls'))]

路由分發(fā)之后訪問的地址就變成:!!!

http://127.0.0.1:8000/app01/books
api組件的子路由:api/url.py
from django.conf.urls import urlfrom . import viewsurlpatterns = [    url(r'^books/', views.Book.as_view()),    url(r'^books/(?P<pk>.*)/$',views.Book.as_view()),#這個(gè)話是對(duì)上句話的補(bǔ)充,兩個(gè)鏈接指向的地址是同一個(gè)。這句話就是url地址在books寫任意的內(nèi)容都能訪問到同樣的地址。    有名分組的名字就是后臺(tái)對(duì)應(yīng)請(qǐng)求的kwargs中的k:例如{'pk': 'fdadfad'}]# a* 可以匹配 a aa aaa aaaa aaaaaaa等等# .*:就是說匹配a任意次數(shù)
模型層:model.py
from django.db import modelsclass Book(models.Model):    title = models.CharField(max_length=64)    price = models.DecimalField(max_digits=5, decimal_places=2)    class Meta:# 寫這個(gè)類定義表名        db_table = 'old_boy_book'        verbose_name = '書籍'        verbose_name_plural = verbose_name    def __str__(self):        return '《%s》' % self.title
后臺(tái)層:admin.py
from django.contrib import adminfrom . import modelsadmin.site.register(models.Book)
數(shù)據(jù)庫遷移
>: python manage.py makemigrations>: python manage.py migrrate>: python manage.py createsuperuser
視圖層:views.py
from django.http import JsonResponsefrom django.views import Viewfrom . import models #在視圖層查詢數(shù)據(jù)庫要導(dǎo)入models!?。∮涀? 六大基礎(chǔ)接口:獲取一個(gè) 獲取所有 增加一個(gè) 刪除一個(gè) 整體更新一個(gè) 局部更新一個(gè)# 十大接口:群增 群刪 整體改群改 局部改群改class Book(View):    def get(self, request, *args, **kwargs):# kwargs是字典        pk = kwargs.get('pk')        if not pk:  # 群查            # 操作數(shù)據(jù)庫            book_obj_list = models.Book.objects.all()            # 序列化過程            book_list = []            for obj in book_obj_list: # 注意for這個(gè)dic必須在for循環(huán)里面?。。?               dic = {}                dic['title'] = obj.title                dic['price'] = obj.price                book_list.append(dic)            # 響應(yīng)數(shù)據(jù)            return JsonResponse({                'status': 0,                'msg': 'ok',                'results': book_list            }, json_dumps_params={'ensure_ascii': False})        else:  # 單查 filter查詢需要查詢的pk不存在時(shí),不會(huì)報(bào)錯(cuò)!            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': '無結(jié)果',            }, json_dumps_params={'ensure_ascii': False})    # postman可以完成不同方式的請(qǐng)求:get | post | put ...    # postman發(fā)送數(shù)據(jù)包有三種方式:form-data | urlencoding | json    # 原生django對(duì)urlencoding方式數(shù)據(jù)兼容最好    def post(self, request, *args, **kwargs):        # 前臺(tái)通過urlencoding方式提交數(shù)據(jù)        try:# 下面的.dict()以前沒用過,可以將對(duì)象轉(zhuǎn)換成字典?。。。?           # 并且這個(gè)新增的方法是通過源碼得出的            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': '參數(shù)有誤',            }, json_dumps_params={'ensure_ascii': False})        return JsonResponse({            'status': 2,            'msg': '新增失敗',        }, json_dumps_params={'ensure_ascii': False})

Postman接口工具

官網(wǎng)下載安裝

get請(qǐng)求,攜帶參數(shù)采用Params

post等請(qǐng)求,提交數(shù)據(jù)包可以采用三種方式:form-date、urlencoding、json

所有請(qǐng)求都可以攜帶請(qǐng)求頭

發(fā)送post請(qǐng)求,數(shù)據(jù)在body里寫,并且以json格式(雙引號(hào))

后臺(tái)在post請(qǐng)求的body中接受,要注意,post請(qǐng)求要注釋csrf

原django接收到信息:

b'{\n\t"title":"\xe5\xa4\xa7\xe8\xaf\x9d\xe8\xa5\xbf\xe6\xb8\xb8",\n\t"price":123\n}'

urlencoding解析的最好

print(request.POST)<QueryDict: {'title': ['大話西游1']}>print(request.body)b'title=大話西游1'

form-date直接報(bào)錯(cuò)

發(fā)送json格式的情況:是后臺(tái)post請(qǐng)求中沒有信息,都在body里

DRF框架

安裝
>: pip3 install djangorestframework
Django中注冊(cè)
INSTALLED_APPS = [    'rest_framework']
drf框架規(guī)矩的封裝風(fēng)格
from rest_framework.views import APIViewfrom rest_framework.response import Responsefrom rest_framework.request import Requestfrom rest_framework.serializers import Serializerfrom rest_framework.settings import APISettingsfrom rest_framework.filters import SearchFilterfrom rest_framework.pagination import PageNumberPaginationfrom rest_framework.authentication import TokenAuthenticationfrom rest_framework.permissions import IsAuthenticatedfrom rest_framework.throttling import SimpleRateThrottleclass Test(APIView):    def get(self, request, *args, **kwargs):        return Response('drf get ok')# 這里必須寫Response
drf請(qǐng)求生命周期
"""1) 請(qǐng)求走的是APIView的as_view函數(shù)2) 在APIView的as_view調(diào)用父類(django原生)的as_view,還禁用了 csrf 認(rèn)證3) 在父類的as_view中dispatch方法請(qǐng)求走的又是APIView的dispatch4) 完成任務(wù)方法交給視圖類的請(qǐng)求函數(shù)處理,得到請(qǐng)求的響應(yīng)結(jié)果,返回給前臺(tái)"""

請(qǐng)求模塊:request對(duì)象

源碼入口

APIView類的dispatch方法中:request = self.initialize_request(request, *args, **kwargs)

源碼分析
"""# 二次封裝得到def的request對(duì)象request = self.initialize_request(request, *args, **kwargs) 點(diǎn)進(jìn)去# 在rest_framework.request.Request實(shí)例化方法中self._request = request  將原生request作為新request的_request屬性# 在rest_framework.request.Request的__getattr__方法中try:    return getattr(self._request, attr)  # 訪問屬性完全兼容原生requestexcept AttributeError:    return self.__getattribute__(attr)"""
重點(diǎn)總結(jié)
# 1) drf 對(duì)原生request做了二次封裝,request._request就是原生request# 2) 原生request對(duì)象的屬性和方法都可以被drf的request對(duì)象直接訪問(兼容)# 3) drf請(qǐng)求的所有url拼接參數(shù)均被解析到query_params中,所有數(shù)據(jù)包數(shù)據(jù)都被解析到data中
class Test(APIView):    def get(self, request, *args, **kwargs):        # url拼接的參數(shù),以下三個(gè)得到的數(shù)據(jù)結(jié)果相同()        print(request._request.GET)  # 二次封裝方式        print(request.GET) # 兼容        print(request.query_params) # 拓展        return Response('drf get ok')    def post(self, request, *args, **kwargs):        # 所有請(qǐng)求方式攜帶的數(shù)據(jù)包。以下三個(gè)得到的數(shù)據(jù)結(jié)果相同,前兩個(gè)只有json數(shù)據(jù)為空        print(request._request.POST)  # 二次封裝方式        print(request.POST)  # 兼容        print(request.data)  # 拓展,兼容性最強(qiáng),三種數(shù)據(jù)方式都可以。formdata,urlencoded,json        print(request.query_params)#post攜帶的參數(shù)pararms        return Response('drf post ok')

渲染模塊:瀏覽器和Postman請(qǐng)求結(jié)果渲染數(shù)據(jù)的方式不一樣

源碼入口

APIView類的dispatch方法中:self.response = self.finalize_response(request, response, *args, **kwargs)

源碼分析
"""# 最后解析reponse對(duì)象數(shù)據(jù)self.response = self.finalize_response(request, response, *args, **kwargs) 點(diǎn)進(jìn)去# 拿到運(yùn)行的解析類的對(duì)象們neg = self.perform_content_negotiation(request, force=True) 點(diǎn)進(jìn)去# 獲得解析類對(duì)象renderers = self.get_renderers() 點(diǎn)進(jìn)去# 從視圖類中得到renderer_classes請(qǐng)求類,如何實(shí)例化一個(gè)個(gè)對(duì)象形參解析類對(duì)象列表return [renderer() for renderer in self.renderer_classes]# 重點(diǎn):self.renderer_classes獲取renderer_classes的順序#   自己視圖類的類屬性(局部配置) => #   APIView類的類屬性設(shè)置 => #   自己配置文件的DEFAULT_RENDERER_CLASSES(全局配置) => #   drf配置文件的DEFAULT_RENDERER_CLASSES"""
全局配置:所有視圖類統(tǒng)一處理,在項(xiàng)目的settings.py中
REST_FRAMEWORK = {    # drf提供的渲染類    'DEFAULT_RENDERER_CLASSES': [        'rest_framework.renderers.JSONRenderer',        'rest_framework.renderers.BrowsableAPIRenderer',    ],}
局部配置:某一個(gè)或一些實(shí)體類單獨(dú)處理,在views.py視圖類中提供對(duì)應(yīng)的類屬性
class Test(APIView):    def get(self, request, *args, **kwargs):        return Response('drf get ok')# 由jsonresponse換成response    def post(self, request, *args, **kwargs):        return Response('drf post ok')# 在setting.py中配置REST_FRAMEWORK,完成的是全局配置,所有接口統(tǒng)一處理# 如果只有部分接口特殊化,可以完成 - 局部配置。# 現(xiàn)在這個(gè)test連接中的配置由renderer_classes控制from rest_framework.renderers import JSONRendererclass Test2(APIView):    # 局部配置    renderer_classes = [JSONRenderer]    def get(self, request, *args, **kwargs):        return Response('drf get ok 2')    def post(self, request, *args, **kwargs):        return Response('drf post ok 2')
來源:https://www.icode9.com/content-4-509751.html
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
python測(cè)試開發(fā)django-59.restful接口開發(fā)
07 渲染模塊
Python3+ Django3:自動(dòng)生成Swagger接口文檔
用django寫接口(入門篇)
restframework詳細(xì)
5 分鐘,帶你快速入門 Django DRF
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服