django 前后端分離,后端接口實現


博客篇我們使用的是前后端不分離的方式進行實現,前后端不分離實現方式,主要用於小型的項目,且一個人就可以搞定所有,但是中大型的應用還是用的前后端分離的方式進行的

前后端分離方式后台主要給前端提供接口,前端JS調用后台的接口,根據接口定義的傳參進行傳參,得到返回值,然后展現在頁面上,或者對數據進行了操作,把操作后的數據傳給后端,后端進行數據的更新等

 

下面的例子我們主要從基本的增刪改查進行設計后台接口部分

一、准備工作

1、modles.py文件中,創建student表,用於進行增刪改查

class Student(models.Model): name = models.CharField(verbose_name='名稱',max_length=10) phone = models.CharField(max_length=11,unique=True,verbose_name='手機號') money = models.FloatField(verbose_name='金額',default=0,null=True) addr = models.CharField(verbose_name='地址', default='北京', max_length=20) work_addr = models.CharField(verbose_name='地址', default='北京', max_length=20) create_time = models.DateTimeField(verbose_name='創建時間', auto_now_add=True)  # auto_now_add的意思,插入數據的時候,自動取當前時間
    update_time = models.DateTimeField(verbose_name='修改時間', auto_now=True) class Meta: verbose_name = '學生表' verbose_name_plural = verbose_name db_table = 'student'

    def __str__(self): return self.name
python manage.py makemigrations   創建表結構

python manage.py migrate 創建數據庫表

2、view.py文件中引用form表單進行驗證

from .models import Student from django.forms import ModelForm  #引用表單模塊

class StudentForm(ModelForm): class Meta: model = Student fields = '__all__' #代表所有的字段

3、定義接口類,主要用於寫增刪改查接口對應的方法

class StudentView(View):

4、urls.py文件,增加接口請求名稱

備注:as_view方法里面實現了,根據請求方式去找類里面對應的方法名,如果是get請求,它就去找get這個函數,找不到就是不支持get請求

urlpatterns = [ #這種方式,需要在連接后面加?,比如url?id=1 
    path('stu3', views2.StudentView.as_view() ), #這種方式,無需在連接后面加?,比如 url/3
    #path('stu3/<int:id>',views2.StudentView.as_view()),
]

二、查詢,get請求

其中支持模糊查詢及過濾查詢,方法如下:

    search_field=['name','phone','addr','work_addr'] #存儲搜索的字段,全局變量
    filter_field=['name','phone','id'] #存儲過濾字段,全局變量 def get(self,request): limit = request.GET.get('limit',20) #每頁個數,無傳值默認每頁20 page = request.GET.get('page',1) #頁碼,無傳值,默認1 search=request.GET.get('search') #獲取請求中的查詢條件 filter_dict={} #定義空字典,存儲過濾字段及值 #過濾
        for field in self.filter_field: #遍歷過濾list value=request.GET.get(field) if value: #當請求中有該字段且該字段不為空 filter_dict[field]=value #把該字段及值寫入過濾字典中 #查詢
        q_result=Q() for field in self.search_field: #變量搜索list if search: #如果查詢值不為空 d={'%s__contains'%field:search} #每個字段與該值均放入d字典 q_result=Q(**d)|q_result #取幾個字段是該值的並集 all_students = Student.objects.filter(**filter_dict).filter(q_result).values() #這種方式優先過濾,all_students為搜索結果
#all_students = Student.objects.filter(q_result).values().filter(**filter_dict) #這種方式優先模糊查詢,all_students為搜索結果 page_obj
= Paginator(all_students,limit) #搜索結果分頁 stus = list(page_obj.get_page(page)) #獲取第幾頁數據 data = {"error_code":0,"msg":"操作成功","data":stus,"count":page_obj.count} #結果寫成json格式 return JsonResponse(data,json_dumps_params={"ensure_ascii":False},encoder=NbJSONEncoder) #返回結果,其中得到時間格式帶T字樣,為解決這個問題,可以通過encoder=NbJSONEncoder 解決

 encoder=NbJSONEncoder中,其NbJSONEncoder對應的代碼如下:

import json import datetime class NbJSONEncoder(json.JSONEncoder): def default(self, obj): if isinstance(obj, datetime.datetime): return obj.strftime('%Y-%m-%d %H:%M:%S') elif isinstance(obj, datetime.date): return obj.strftime('%Y-%m-%d') else: return json.JSONEncoder.default(self, obj)

 三、添加,post請求

思路:從post請求的body中獲取到數據,通過表單自帶的驗證,驗證數據格式的正確性,驗證通過的返回正確的結果,驗證失敗的返回失敗的結果

    def post(self,request): stu_form = StudentForm(request.POST) #獲取post請求中的數據 if stu_form.is_valid(): #表單自帶驗證,驗證是否符合規則 Student.objects.create(**stu_form.cleaned_data) #數據同步到數據庫中 data = {"error_code":0,'msg':'添加成功'} #返回結果 else: data = {"error_code":-1,'msg':stu_form.errors.get_json_data()} #失敗返回結果 return JsonResponse(data,json_dumps_params={"ensure_ascii":False}) #返回結果

 四、修改,put請求

思路:如果不是POST請求的話,request.POST里面沒數據  所以獲取數據通過request.META來獲取原始請求的數據,parse_file_uploaddjango用例解析body里面的數據和文件的,獲取數據后進行部分及全部數據修改和數據校驗,數據校驗主要是通過表單內部的校驗方法,部分修改是通過判斷請求中的數據與表單校驗失敗的有交集進行程序實現的

        put_data,files =request.parse_file_upload(request.META,request)#獲取請求中的修改的數據字段及值 stu_form=StudentForm(put_data) #放入表單 id=request.GET.get('id',0) #獲取請求中的ID值,無,默認為0 clean_data={} #

if stu_form.is_valid(): #from中的值如果均有效 Student.objects.filter(id=id).update(**stu_form.cleaned_data) #根據字段ID,更新值 data = {"error_code": 0, 'msg': '操作成功'} #返回值
else: #FROM中的值如果有無效的 error_keys=set(stu_form.errors.get_json_data().keys()) #獲取錯誤的keys並轉換為集合 put_keys=set(put_data.keys()) #獲取所有的keys並轉換為集合
if error_keys & put_keys:#如果2者有交集 data = {"error_code": -1, 'msg': stu_form.errors.get_json_data()}          return JsonResponse(data, json_dumps_params={"ensure_ascii": False}) #返回錯誤結果

else: #如果無交集 for key in put_data: clean_data[key]=put_data.get(key) #把變量這個放入字典 Student.objects.filter(id=id).update(**clean_data) #更新數據庫 data = {"error_code": 0, 'msg': '操作成功'}#返回結果 return JsonResponse(data, json_dumps_params={"ensure_ascii": False}) #返回正確的結果

五、刪除,delete請求

思路:獲取請求中的ID值,然后刪除對應ID的記錄

    def delete(self,request): id=request.GET.get('id',0) #獲取請求刪除的ID,如果沒有傳默認是0 Student.objects.filter(id=id).delete() #刪除數據 data = {"error_code": 0, 'msg': '操作成功'} #返回結果 print('delete') return JsonResponse(data, json_dumps_params={"ensure_ascii": False}) #返回

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM