天天看点

DjangofestFramework---DRF

Django基础上的框架。

rest:面向资源

[如 请求书籍列表,添加书籍,请求书籍详情]

restful:满足rest的应用 。【面向资源的应用】

restful api:restful风格的数据接口【api :数据接口】

【面向资源应用中包含的数据接口】【api: 面向资源去设计一个api,可以是一个路由/网址】

restful api的构成:https://api.zzy.com/v1/books

协议:https

域名: 一个用于部署服务器的电脑 最好包含"/api"【表示是专门部署api的】

版本:携带API版本 【如"/v1"】

路径: 虚拟地址 【如"/books" 往往与数据库中的表格名对应】

对于资源的具体操作类型,由HTTP动词表示

GET[SELEC(sql命令)]:从服务器取出资源

POST[CREATE]:从服务器新建一个资源

PUT[UPDATE]:…更新资源【客户端提供改变后的所有资源字段】

PATCH[UPDATE]:…更新资源【客户端提供改变的字段】

DELETE[DELETE]:…删除资源

OPTIONS: 关于该资源可以进行的操作【客户端可进行的】

HEAD:获取资源的元数据

如:GET/zoos/ID : 获取某个指定动物园的信息

需要使用的 :RestFulAPI 设计的API:

如:

https://api.zzy.com/v1/books/bookid

【GET获取书信息,PUT,PATCH修改书信息,DELETE删除书信息】【n.都在路由里,v.都在方法里】

过滤信息Filtering:在API中提供参数,过滤返回结果

?limit=10 :指定返回记录的数量

-----------建立一个未使用DRF实现前后端分离的Django--------------------(创建django架构时也可使用前文直接创建Django project)

采用Django的MVT模型:

M全拼为Model,与MVC中的M功能相同,负责和数据库交互,进行数据处理。

V全拼为View,与MVC中的C功能相同,接收请求,进行业务处理,返回应答。

T全拼为Template,与MVC中的V功能相同,负责封装构造要返回的html。

DjangofestFramework---DRF

Terminal: pip install django

django-admin startproject nodrfpro[创建项目]

nodrfpro: manage.py 命令模块

wsgi.py 服务器发过来的消息经由其进行中转

urls.py 所有的路径地址

settings.py 配置文件

asgi.py 作用同wsgi,django3 出现

Termianl: cd nodrfpro

py manage.py startapp shop [新建应用 shop文件夹]

shop : migrations 迁移文件目录

_init_.py 模块

admin.py 注册后台管理

apps.py 应用的配置

models.py 应用的模型类

tests.py 单元测试模块

views.py 视图的编写

shop.models.py:
from django.db import models

# Create your models here.
class Category(models.Model):
name = models.CharField(max_length=20, verbose_name="分类名")
#当使用print输出对象时,打印从此方法中return的字符串
def __str__(self):
    return self.name

class Good(models.Model):
name = models.CharField(max_length=20, verbose_name="商品名字")
#follow的属性允许为空
desc = models.CharField(max_length=100,null=True,blank=True,verbose_name="商品描述")
#分类与商品之间存在 一对多的关系
#在序列化关联模型时,一定要声明 related_name
#一找多:related_name:无:c1.good_set.all(),有:c1.goods.all()
category = models.ForeignKey(Category, on_delete=models.CASCADE,
                             verbose_name="分类", related_name='goods')
def __str__(self):
    return self.name

#接着Terminal实现shop的数据迁移--->至dp.sqlite3 创建此处的两个模型
----------------------------	
nodrfpro.settings.py  新增
INSTALLED_APPS = ['shop',]
------------------------------
Terminal 创建dp.sqlite3
py manage.py makemigrations 
------------------------
Terminal 迁移数据
py manage.py migrate
           

以上M创建完成

nodrfpro.urls.py:

//通过path导入了另外一个应用,应用中注册了一系列路由(.urls中),

//V与T可以就此使用Django中自带的

path(‘admin/’, admin.site.urls),

创建超级管理员进入后台

py manage.py createsuperuser

为了看到并管理自己的模型类:[admin.py中注册模型类]

shop.admin.py:
from django.contrib import admin
from .models import *
# Register your models here.

admin.site.register(Category)
admin.site.register(Good)
------------------
在后台管理中新增数据后,自己设置路由以获得数据的显示
------------------
nodrfpro.urls.py
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
path('admin/', admin.site.urls),
path('', include('shop.urls', namespace='shop')),
]                          #在shop中新建urls.py
#命名空间使得可以在不同的app的urls中使用相同的name值而不会导致URL反解错误
#参考https://www.cnblogs.com/huang-yc/p/9651162.html
------------
shop.urls.py:
from django.conf.urls import url
from . import views
#因为在nodrfpro.urls中使用了namespace命名空间 = 'shop'
app_name = 'shop'

urlpatterns = [
#使用到正则表达式时,为了减少对不必要的\的转义,通常使用r前缀,第一个参数是regex
#以下代表一个空字符串
url(r'^$', views.index, name='index')
]
#app的url中name设定方便全局的指向,可搭配app_name使用
#参考https://www.cnblogs.com/rexcheny/p/9635879.html
--------------------------
shop.views.py:
from django.shortcuts import render
import  json
from django.http import  HttpResponse,JsonResponse
from .models import *
#Django自带的序列化功能
from django.core import  serializers

def index(request):

categorys = Category.objects.all()
result = serializers.serialize("json",categorys)
#如果以json或xml的形式返回数据,则可以实现前后端分离开发
#return JsonResponse(result, safe = False)
#同上, 但输出中文
return HttpResponse(json.dumps({'status':0,'data':result}, ensure_ascii=False), content_type='application/json')

#如果使用Django模板就是前后端不分离
#因为模板是 templates 目录下的html文件,所以牵扯到模板就会前后端不分离[因为把后端的数据直接传过去了{{...}},并且可以页面显示]
#return render(request,'模板名字', 传递参数)
#return HttpResponse("首页")
---------------------------------------------------
           

url路由是你的web服务对外暴露的api。

DRF:

pip install djangorestframework
#使用时 vene.Lib.rest_framework[使用rest_framework]
##直到对project的根urls的编写可参考https://www.django-rest-framework.org/
---------------------------------------------------------------
shop.serializers.py:
from rest_framework import serializers
from .models import *

# 添加序列化工具

class CategorySerializer(serializers.ModelSerializer):
'''
编写针对Category的序列化类
本类指明了Category的序列化细节
需要继承ModelSerializer才可以针对模型进行序列化
在Meta类中model指明序列化的模型
        fields指明序列化的字段
'''
#‘goods’[变量名] 一定要和related_name的值一致
#StringRelatedField() 可以返回关联模型中的__str__返回值,many=True代表多个对象[一个分类中对应多个商品,所以为True,対一方时可以不写]
#goods = serializers.StringRelatedField(many=True)
#goods = serializers.PrimaryKeyRelatedField(many=True,read_only=True)
#view-name 默认为 '要找的模型名-detail'
goods = serializers.HyperlinkedRelatedField(read_only=True,many=True,view_name='good-detail')

class Meta:
    model = Category
    #__all__代表模型中的所有字段
    #fields = '__all__'
    #fields 指明序列化哪些字段
    fields = ["name", 'goods']

class GoodSerializer(serializers.ModelSerializer):

#在序列化时指定字段, 在[多方] 使用source = 模型名.字段名,read_only=True 表示不能更改
category = serializers.CharField(source='category.name',read_only=True)
class Meta:
    model = Good
    fields = ['name', 'desc', 'category']
---------------------------------------
shop.views.py:
from rest_framework import viewsets
from .models import *
from .serializers import *

class CategoryViewSets(viewsets.ModelViewSet):
'''
分类视图
继承ModelViewSet之后拥有GET POST PUT PATCH DELETE 等HTTP动作操作
queryset 指明 需要操作的模型列表
serializer_class 指明序列化类
'''
queryset = Category.objects.all()
serializer_class = CategorySerializer
----------------------
至此'M'-->models.py,'V'-->views.py 编写完成,‘T’不需编写
开始注册路由views
------------------
nodrfpro.urls.py:
from django.contrib import admin
from django.urls import path, include, re_path
from shop.views import *   #需要将上层的nodrfpro文件夹右键-make directory as-sources root,才能找到该下层文件
#引入DRF自带的路由类
from rest_framework import routers

router = routers.DefaultRouter()
#可以通过router默认路由注册资源
router.register('categorys',CategoryViewSets)

urlpatterns = [
path('admin/', admin.site.urls),

path('api/v1/',include(router.urls)),

#为了在DRF路由调试界面能够使用用户相关功能需要引入以下路由
#显示用户的信息,可登录和注销,用户信息同admin的superuser
path('api-auth/',include('rest_framework.urls')),]
-----------------------------
           

#同理,在shop.serializers.py和shop.views.py中创建对应Good的类,

并在nodrfpro.urls.py中 通过默认路由注册Good的V资源即可添加good信息的路由

另:自定义序列化类,指定模型序列化类

参考https://www.bilibili.com/video/BV1tZ4y1T77U?p=6

Django中的请求,响应

Django框架:

1、请求类型:WSGIRequest

2、提取请求中的参数使用:request.GET,request.POST,request.FILES

3、响应类型:

HttpResponse,JsonResponse,HttpResponseRedirect

DRF框架:

【from rest_framework.decorators import api_view

@api_view([‘GET’])】

1、请求类型:

rest_framework.request.Request,其实是针对WSGIRequest的封装

2、提取请求中的参数使用:

GET 请求使用:request.query_params

其余(POST,PUT,PATCH,DELETE) 使用:request.data

3、响应类型:

【from rest_framework.response import Response】

Response