django 先後端分離,後端接口實現

博客篇咱們使用的是先後端不分離的方式進行實現,先後端不分離實現方式,主要用於小型的項目,且一我的就能夠搞定全部,可是中大型的應用仍是用的先後端分離的方式進行的前端

先後端分離方式後臺主要給前端提供接口,前端JS調用後臺的接口,根據接口定義的傳參進行傳參,獲得返回值,而後展示在頁面上,或者對數據進行了操做,把操做後的數據傳給後端,後端進行數據的更新等python

 

下面的例子咱們主要從基本的增刪改查進行設計後臺接口部分數據庫

1、準備工做

一、modles.py文件中,建立student表,用於進行增刪改查django

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 建立數據庫表

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

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

class StudentForm(ModelForm): class Meta: model = Student fields = '__all__' #表明全部的字段

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

class StudentView(View):

四、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()),
]

2、查詢,get請求

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

    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對應的代碼以下:url

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)

 3、添加,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}) #返回結果

 4、修改,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}) #返回正確的結果

5、刪除,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}) #返回
相關文章
相關標籤/搜索