drf實現接口

drf實現接口

1 在django中寫resful的接口

詳見代碼

postman的使用

 

-請求地址帶反斜槓出現的問題(中間件)

-若是請求地址是/user,路由中配置成'/user/',匹配不上,中間件會自動在後面加 / 再去匹配,能匹配成功,重定向到/user/,加了 / 還匹配不上,就報錯 -django.middleware.common.CommonMiddleware前端

 

二、drf寫resful的接口

先安裝

pip3 install djangorestframework數據庫

在settings.py文件中配置

註冊appdjango

INSTALLED_APPS = [
   'django.contrib.admin',
   'django.contrib.auth',
   'django.contrib.contenttypes',
   'django.contrib.sessions',
   'django.contrib.messages',
   'django.contrib.staticfiles',
   'app01.apps.App01Config',
   # rest_framework就是一個app
   'rest_framework'
]

書寫路由

因爲restful_framework使用的CBV的方式,因此路由以下:json

#drf 實現的api
   url(r'^users/', views.DrfText.as_view()),

書寫視圖函數

#須要類
from rest_framework.views import APIView
#類繼承APIView ,用於自動生成
from rest_framework.response import Response
#rest_framework 自定義返回對象的方法
#自定義的聲明類
#基本CBV相同
class DrfTest(APIView):
   def get(self, request, *args, **kwargs):
       # request是封裝以後的request了,原來的request是request._request
       print(type(request._request))
       print(type(request))
       # 問:當前request對象並無這些屬性,可是能打印出來,爲何?
       # getattr
       print(request.method)
       print(request.POST)
       print(request.GET)
       # 就至關於:
       print(request.query_params)
       print(request._request.GET)
       response = {'status': 100, 'errors': None}
       response['users'] = user_list
       # 用drf的Response,能夠經過請求客戶端來判斷返回數據格式是什麼樣的
       return Response(response)
       # return JsonResponse(response)

   def post(self, request, *args, **kwargs):
       # post 提交的數據,urlencode,formdate,json格式,都能從data中取出來
       name = request.data.get('name')
       # request.FILES
       print(name)
       return HttpResponse('ok')

 

基於數據庫實現數據的序列化

發送到請求方法的返回值,只能是符合json語法的字符串,對象是沒法發送到前端的。因此須要將對象進行序列化api

一、定製數據表,並進行數據遷移

from django.db import models

# Create your models here.
class Book(models.Model):
   title = models.CharField(max_length=32)
   price = models.IntegerField()
   pub_date = models.DateField()
   publish = models.ForeignKey("Publish")
   authors = models.ManyToManyField("Author")

   def __str__(self):
       return self.title

   def test(self):
       return self.title+str(self.price)


class Publish(models.Model):
   name = models.CharField(max_length=32)
   email = models.EmailField()

   def __str__(self):
       return self.name



class Author(models.Model):
   name = models.CharField(max_length=32)
   age = models.IntegerField()
   #
   def __str__(self):
       return self.name

二、使用restful_framework的自定義的序列化工具自定義一個類

from rest_framework import serializers
class BookSerializers(serializers.Serializer):
   #id 是依據數據表中的字段名稱,不能夠隨意變動
   id = serializers.CharField()
   #當須要變動字段名稱的話,設定source ='字段名'
   name = serializers.CharField(source='title')
   price = serializers.CharField()
   #也能夠經過models的對應的數據類中定義屬性方法,自定義數據
   xxx = serializers.CharField(source='test')
   publish = serializers.CharField()
#也能夠自定義字段,使用方法自動生成,SerializerMethodField(),才能使用
   publish_dic = serializers.SerializerMethodField()
   #方法名爲 get_自定義字段名
   def get_publish_dic(self,obj):
       return {'id':obj.publish.pk,'name':obj.publish.name}

3.在視圖函數中的使用

from app01 import models
from app01.Myser import BookSerializers
class Books(APIView):
   def get(self,request,*args,**kwargs):
       response = {'status':100,'errors':None}
       book_list = models.Book.objects.all()
       print(book_list)
       bookser= BookSerializers(book_list,many=True)
       response['books'] = bookser.data
       return Response(response)


class Book(APIView):
   def get(self,request,id):
       response = {'status': 100, 'errors': None}
       book = models.Book.objects.filter(pk=id).first()
       bookser = BookSerializers(book,many=False)
       response['book'] = bookser.data
       return Response(response)
相關文章
相關標籤/搜索