一 Web開發(fā)模式
1. 前后端混合開發(fā)模式
2.前后端分離開發(fā)模式
二 API接口
三 restful規(guī)范
四 序列化和反序列化
五 drf安裝和快速使用
一 Web開發(fā)模式
1. 前后端混合開發(fā)模式
前后端混合開發(fā)模式是一種開發(fā)方式,將前端和后端的開發(fā)工作結(jié)合在一起,以加快項目的開發(fā)速度和
提高協(xié)作效率。這種模式通常用于快速原型開發(fā)、小型項目或敏捷開發(fā)中。
在前后端混合開發(fā)模式中,前端和后端開發(fā)人員緊密合作,共同制定項目需求、設(shè)計界面和編寫代碼。
具體來說,這種模式有以下特點:
1.交叉開發(fā):前端和后端開發(fā)人員在同一時間內(nèi)并行進行開發(fā),
而不是先完成一個部分再進行另一個部分的開發(fā)。
2.緊密協(xié)作:前端和后端開發(fā)人員之間需要密切合作,共同解決問題,制定接口規(guī)范,
并確保前后端之間的數(shù)據(jù)交互和功能協(xié)調(diào)一致。
3.接口規(guī)范:在前后端混合開發(fā)中,明確的接口規(guī)范尤為重要。
前端和后端需要約定好數(shù)據(jù)傳輸?shù)母袷?、接口命名和參?shù)等。
4.快速迭代:由于前后端同時進行開發(fā),可以更快地進行迭代和調(diào)整,及時響應(yīng)變化的需求。
5.敏捷開發(fā):這種開發(fā)模式適用于敏捷開發(fā)流程,可以在項目開發(fā)周期內(nèi)頻繁地進行需求變更和更新。
然而,前后端混合開發(fā)模式也需要注意一些問題,例如接口不穩(wěn)定可能導(dǎo)致前后端頻繁修改,
需要嚴格的接口文檔和版本管理。此外,項目的復(fù)雜性和團隊的規(guī)模也會影響這種開發(fā)模式的適用性。
文章來源:http://www.zghlxwxcb.cn/news/detail-682712.html
2.前后端分離開發(fā)模式
前后端分離開發(fā)模式是一種軟件開發(fā)方式,其中前端和后端的開發(fā)工作分開進行,彼此解耦,
通過接口進行數(shù)據(jù)交互。這種模式旨在提高開發(fā)效率、降低耦合度,并允許不同團隊專注于各自領(lǐng)域的開發(fā)。
在前后端分離開發(fā)模式中,前端和后端開發(fā)人員可以使用不同的編程語言、框架和技術(shù)來進行開發(fā)。
前端負責(zé)構(gòu)建用戶界面、交互和用戶體驗,后端負責(zé)處理業(yè)務(wù)邏輯、數(shù)據(jù)庫操作和提供數(shù)據(jù)接口。
主要特點包括:
1. **松耦合**:前后端之間通過接口進行數(shù)據(jù)交互,實現(xiàn)了松耦合的架構(gòu),使得前后端團隊可以獨立開發(fā)和更新。
2. **獨立開發(fā)**:前端和后端可以同時進行開發(fā),不會相互阻塞,從而加快項目的開發(fā)進度。
3. **技術(shù)多樣性**:前端和后端可以選擇最適合自己的技術(shù)棧,使得團隊可以根據(jù)需求靈活選擇合適的工具。
4. **提高效率**:前端和后端開發(fā)人員專注于各自領(lǐng)域的開發(fā),提高了效率和專注度。
5. **維護方便**:由于前后端分離,當需求變更或修復(fù)問題時,只需修改相應(yīng)的模塊,不會影響到整個系統(tǒng)。
6. **適合團隊合作**:不同團隊可以并行開發(fā),有助于團隊協(xié)作和項目管理。
然而,前后端分離也需要注意接口設(shè)計的合理性、數(shù)據(jù)傳輸?shù)陌踩砸约敖涌谖臋n的編寫和維護等問題。同時,這種模式對項目的規(guī)劃和架構(gòu)設(shè)計有一定的要求,以確保前后端之間的協(xié)同順暢。
文章來源地址http://www.zghlxwxcb.cn/news/detail-682712.html
二 API接口
為了在團隊內(nèi)部形成共識、防止個人習(xí)慣差異引起的混亂,我們需要找到一種大家都覺得很好的接口實現(xiàn)規(guī)范,
而且這種規(guī)范能夠讓后端寫的接口,用途一目了然,減少雙方之間的合作成本
-api接口:通過網(wǎng)絡(luò),規(guī)定了前后臺信息交互規(guī)則的url鏈接,也就是前后臺信息交互的媒介
-https://www.baidu.com/books/--->json 格式數(shù)據(jù)---》接口
-https://www.cnblogs.com/liuqingzheng/articles/17400599.html---》返回界面
-url和接口的區(qū)別:Web API接口和一般的url鏈接還是有區(qū)別的,Web API接口簡單概括有下面四大特點
-1.url:長得像返回數(shù)據(jù)的url鏈接
https://api.map.baidu.com/place/v2/search
-2.請求方式:get、post、put、patch、delete
采用get方式請求上方接口
-3.請求參數(shù):json或xml格式的key-value類型數(shù)據(jù)
ak:6E823f587c95f0148c19993539b99295
region:上海
query:肯德基
output:json
-4.響應(yīng)結(jié)果:json或xml格式的數(shù)據(jù)
-https://api.map.baidu.com/place/v2/search?ak=6E823f587c95f0148c19993539b99295®ion=%E4%B8%8A%E6%B5%B7&query=%E8%82%AF%E5%BE%B7%E5%9F%BA&output=json
-典型的api接口長這樣
-url地址
-有請求方式
-攜帶參數(shù)
-返回格式是json,xml
-前端不同編碼格式:
-urlencoded: body體中 :username=lqz&password=123 django的request.POST取出值
-json: body體中 :{"username":"lqz","password":"123"} django的request.POST取不出值
-form-data:body中格式固定:數(shù)據(jù)部分和文件部分--》request.POST能取出數(shù)據(jù),取不出文件,文件都是從
'----------------------------789048583058585187025897\r\nContent-Disposition: form-data; name="username"\r\n\r\nlqz\r\n文件二進制
-django中的文件對象和原來的文件對象
-django:from django.core.files.uploadedfile import InMemoryUploadedFile
-原生文件:_io.BufferedWriter
-django中文件類沒有繼承原生文件類,但是有原生文件類所有方法
-裝飾器模版
def warpper_request(func):
def inner( *args, **kwargs):
# 在執(zhí)行被裝飾函數(shù)前執(zhí)行
res = func(*args, **kwargs)
# 在執(zhí)行被裝飾函數(shù)后執(zhí)行
return res
return inner
三 restful規(guī)范
1 前后端分離要寫接口---》api接口---》接口測試工具postman
2 restful規(guī)范是什么,如何來的?
-一種定義Web API接口的設(shè)計風(fēng)格,尤其適用于前后端分離的應(yīng)用模式中 的規(guī)范
-Roy Fielding的博士論文提出的
3 以后寫接口,大致都要遵循一個規(guī)范,restful規(guī)范---》10條--》
-1 數(shù)據(jù)的安全保障-》url鏈接一般都采用https協(xié)議進行傳輸--》它比http安全
-2 接口特征表現(xiàn)--》url中帶api標識
-https://api.baidu.com/books/
-https://www.baidu.com/api/books/
-3 多數(shù)據(jù)版本共存--》url中帶版本信息
https://api.baidu.com/v1/books
https://www.baidu.com/api/v2/books
-4 數(shù)據(jù)即是資源,均使用名詞(可復(fù)數(shù))-->前后臺交互,交互的數(shù)據(jù)稱之為資源
-數(shù)據(jù)即資源,前后端交互的數(shù)據(jù)稱之為資源,url盡量使用名字
-https://127.0.0.1/api/v1/books/ -->表示對圖書操作:增加,刪除,查詢,修改,都用這一個地址
-https://127.0.0.1/api/v1/get_all_books/ # 不符合restful規(guī)范
-https://127.0.0.1/api/v1/delete_books/# 不符合restful規(guī)范
-5 資源操作由請求方式?jīng)Q定
-get 請求獲取數(shù)據(jù)(獲取所有,獲取單條)
-post 新增數(shù)據(jù)
-put 修改數(shù)據(jù)
-delete 刪除數(shù)據(jù)
https://api.baidu.com/books - get請求:獲取所有書
https://api.baidu.com/books/1 - get請求:獲取主鍵為1的書
https://api.baidu.com/books - post請求:新增一本書書
https://api.baidu.com/books/1 - put請求:整體修改主鍵為1的書
https://api.baidu.com/books/1 - delete請求:刪除主鍵為1的書
-6 請求地址中帶過濾條件---》只針對于搜索所有接口
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:指定返回結(jié)果按照哪個屬性排序,以及排序順序
https://api.example.com/v1/zoos?animal_type_id=1:指定篩選條件
-7 響應(yīng)狀態(tài)碼(兩層)
-http響應(yīng)狀態(tài)碼: 1xx,2xx,3xx,4xx,5xx:https://www.sohu.com/a/278045231_120014184
-404和403 和 405
-301和302
-1xx表示請求正在處理---》前端一般看不到
-2xx 表示請求處理成功--》經(jīng)??吹? -201和200有什么區(qū)別
-3xx:重定向
-4xx:客戶端錯誤
-5xx:服務(wù)端出錯
-成功都返回200,而在響應(yīng)體中帶 狀態(tài)碼--->code不同公司就不一樣
{
"code": 101,
"msg": "用戶名或密碼錯誤"
}
-補充一:mysql 錯誤操作都會有個 數(shù)字(10060) 文字解釋
-補充二:
-https://open.weibo.com/wiki/Error_code
-8 響應(yīng)中帶錯誤信息
{
"code": 101,
"msg": "用戶名或密碼錯誤"
}
-9 不同操作,返回格式符合如下標準
GET /collection:返回資源對象的列表(數(shù)組)
# [{name:西游記,price:19},{name:三國,price:19}]
GET /collection/resource:返回單個資源對象
# {name:三國,price:19}
POST /collection:返回新生成的資源對象
# {name:三國,price:19}
PUT /collection/resource:返回完整的資源對象
# {name:三國演繹,price:19}
DELETE /collection/resource:返回一個空文檔
#
---》大家都這么做
{
code:100
msg:查詢成功
restult:[{name:西游記,price:19},{name:三國,price:19}]
}
-10 響應(yīng)中帶鏈接
Hypermedia API,RESTful API最好做到Hypermedia,即返回結(jié)果中提供鏈接,
連向其他API方法,使得用戶不查文檔,也知道下一步應(yīng)該做什么
{
"status": 0,
"msg": "ok",
"results":[
{
"name":"肯德基(羅餐廳)",
"img": "https://image.baidu.com/kfc/001.png"
}
...
]
}
四 序列化和反序列化
序列化: 數(shù)據(jù)轉(zhuǎn)換格式
序列化分兩個階段:
-序列化:把我們識別的數(shù)據(jù)轉(zhuǎn)換成指定的格式提供給別人
-反序列化:把別人提供的數(shù)據(jù)轉(zhuǎn)換/還原成我們需要的格式
序列化: 把我們識別的數(shù)據(jù)轉(zhuǎn)換成指定的格式提供給別人。
例如:我們在django中獲取到的數(shù)據(jù)默認是模型對象,但是模型對象數(shù)據(jù)無法直接提供給前端或別的平臺使用,
所以我們需要把數(shù)據(jù)進行序列化,變成字符串或者json數(shù)據(jù),提供給別人。
反序列化:把別人提供的數(shù)據(jù)轉(zhuǎn)換/還原成我們需要的格式。
例如:前端js提供過來的json數(shù)據(jù),對于python而言就是字符串,我們需要進行反序列化換成模型類對象,
這樣我們才能把數(shù)據(jù)保存到數(shù)據(jù)庫中
五 drf安裝和快速使用
基于django編寫符合restful規(guī)范的接口了
假設(shè)以 Book 表為例,寫它的5個接口
-1 查詢所有
-2 新增一條
-3 修改一條
-4 刪除一條
-5 查詢一條
以下是使用原生django編寫:
########### book的接口寫成CBV更好, 先用原生Django寫
'''
http://127.0.0.1/books/ get查詢所有
http://127.0.0.1/books/ post新增一條
http://127.0.0.1/books/id put新增一條
http://127.0.0.1/books/id delete新增一條
http://127.0.0.1/books/id get查詢一條
'''
from django.views import View
from .models import Book
class BookView(View):
def get(self, request):
books = Book.objects.all() # 查詢出來的是queryset對象,不是列表
books_list = []
for item in books:
books_list.append({'name': item.name, 'price': item.price})
res = {'code': 200, 'msg': '查詢成功', 'data': books_list}
return JsonResponse(res)
def post(self, request): # 新增一條數(shù)據(jù)
name = request.POST.get('name')
price = request.POST.get('price')
if name and price:
Book.objects.create(name=name, price=price)
res = {'code': 200, 'msg': '數(shù)據(jù)添加成功'}
else:
res = {'code': 400, 'msg': '數(shù)據(jù)添加失敗,請認真核對參數(shù)'}
return JsonResponse(res)
class BookDetailView(View):
def put(self, request, pk):
int_data_dict = json.loads(request.body)
name = int_data_dict.get('name')
price = int_data_dict.get('price')
book = Book.objects.get(pk=pk)
book.name = name
book.price = price
book.save()
return JsonResponse({'code': 100, 'msg': '查詢成功', 'data': {'name': book.name, 'price': book.price}})
def get(self, request, pk):
book_obj = Book.objects.filter(pk=pk).first()
if book_obj:
res = {'code': 200, 'msg': f'圖書id為{book_obj.pk}的數(shù)據(jù)查詢成功',
'data': {'name': book_obj.name, 'price': book_obj.price}}
else:
res = {'code': 1006, 'msg': '暫無你查詢的數(shù)據(jù)'}
return JsonResponse(res)
def delete(self, request, pk):
book = Book.objects.filter(pk=pk).first()
if book:
book.delete()
res = {'code': 200, 'msg': f'圖書id為{pk}的數(shù)據(jù)查詢刪除成功'}
else:
res = {'code': 1007, 'msg': '你要刪除的數(shù)據(jù)不存在'}
return JsonResponse(res)
注意:djangorestframework: drf, django的一個第三app---》方便我們快速實現(xiàn)符合restful規(guī)范的接口
*****drf快速寫接口**********
使用步驟:
1 安裝模塊
1 django 是2版本,用不了drf最新(適當降版本),他會卸載django---》裝最新4.x
2 djagno 3.1.12 可以使用drf最新
-django:3.1.12
-drf:3.14.0
2 在app中注冊
INSTALLED_APPS = [
'rest_framework', # 一定不要忘了加 ,
]
3 寫路由
from rest_framework.routers import DefaultRouter
router = DefaultRouter()
router.register('books', BookView, 'books')
urlpatterns += router.urls
4 寫視圖類
from rest_framework.viewsets import ModelViewSet
from .serializer import BookSerializer
class BookView(ModelViewSet):
queryset = Book.objects.all()
serializer_class = BookSerializer
5 寫序列化類
class BookSerializer(serializers.ModelSerializer):
class Meta:
model = Book
fields = "__all__"
表
class User(models.Model):
# char是定長,varchar是可變長
username = models.CharField(max_length=32)
password = models.CharField(max_length=32)
class Book(models.Model):
name = models.CharField(max_length=64)
price = models.IntegerField()
五 路由轉(zhuǎn)換器
轉(zhuǎn)換器:
# str,匹配除了路徑分隔符(/)之外的非空字符串,這是默認的形式
# int,匹配正整數(shù),包含0。
# slug,匹配字母、數(shù)字以及橫杠、下劃線組成的字符串。
# uuid,匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。
# path,匹配任何非空字符串,包含了路徑分隔符(/)(不能用?)
path('books/<int: pk>', BookView.as_view()),
到了這里,關(guān)于Web開發(fā)模式、API接口、restful規(guī)范、序列化和反序列化、drf安裝和快速使用、路由轉(zhuǎn)換器(復(fù)習(xí))的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!