"""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"""
"""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)"""
接口規(guī)范:就是為了采用不同的后臺(tái)語言,也能使用同樣的接口獲取到同樣的數(shù)據(jù)
如何寫接口:接口規(guī)范是 規(guī)范化書寫接口的,寫接口要寫 url、響應(yīng)數(shù)據(jù)
? 注:如果將請(qǐng)求參數(shù)也納入考量范圍,那就是在寫 接口文檔
兩大部分:
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
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鏈接
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
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ù)
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
from django.contrib import adminfrom . import modelsadmin.site.register(models.Book)
>: python manage.py makemigrations>: python manage.py migrrate>: python manage.py createsuperuser
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})
官網(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里
>: pip3 install djangorestframework
INSTALLED_APPS = [ 'rest_framework']
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
"""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)"""
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)"""
# 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')
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"""
REST_FRAMEWORK = { # drf提供的渲染類 'DEFAULT_RENDERER_CLASSES': [ 'rest_framework.renderers.JSONRenderer', 'rest_framework.renderers.BrowsableAPIRenderer', ],}
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
聯(lián)系客服