drf實現接口


drf實現接口

1 在django中寫resful的接口

詳見代碼

postman的使用

 

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

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

 

2、drf寫resful的接口

先安裝

pip3 install djangorestframework

在settings.py文件中配置

注冊app

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的方式,所以路由如下:

#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語法的字符串,對象是無法發送到前端的。所以需要將對象進行序列化

1、定制數據表,並進行數據遷移

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

2、使用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)

 


免責聲明!

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



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