# 01.使用drf实现前后端分离
[toc]{type: "ol", level: [2, 3, 4, 5]}
### 环境搭建
#### 安装django环境
```python
pip install django
```
#### 安装drf环境
```python
pip install djangorestframework
```
<br><br>
### 注册应用
```python
### settings.dev
'rest_framework',
```
<br><br>
### 添加用户相关路由
```python
project.urls
# 为了在drf路由调试界面使用用户相关的功能,需要引入以下路由
# 控制登入登出状态
path(r'auth-api', include('rest_framework.urls')),
# 配置后,会自动添加以下路由:
# http://127.0.0.1:8000/auth-api/login/
# http://127.0.0.1:8000/auth-api/logout/
```

<br><br>
### 添加序列化工具
- **在django基础项目之上**{style="color:goldenrod"}
```python
### shop.serializers
from rest_framework import serializers
from shop.models import *
# 若此处继承ReadOnlyModelSerializer,则不再支持POST、PUT等
class CategoryModelSerializer(serializers.ModelSerializer):
# 模型序列化类 这里的类不可以加()
class Meta:
# 指定需要序列化的模型类
model = Category
# 指定需要序列的字段
fields = "__all__"
class GoodsModelSerializer(serializers.ModelSerializer):
# 模型序列化类 这里的类不可以加()
class Meta:
# 指定需要序列化的模型类
model = Goods
# 指定需要序列的字段
fields = "__all__"
```
<br><br>
### 创建视图类
```python
### shop.views
from rest_framework import viewsets
# from .models import *
# serializers中倒入了模型类
from .serializers import *
class CategoryModelViewSet(viewsets.ModelViewSet):
# 分类视图继承ModelViewSet后,会拥有GET/POST/PUT...动词操作
# 指定需要操作的模型列表
queryset = Category.objects.all()
# 指定序列化类
# 方式1:通过属性指定
serializer_class = CategoryModelSerializer
# 方式2:通过函数指定
# def get_serializer_class(self):
# return CategorySerializer
class GoodsModelViewSet(viewsets.ModelViewSet):
queryset = Goods.objects.all()
serializer_class = GoodsModelSerializer
```
<br><br>
### 创建路由
```python
### shop.urls
from django.urls import path, include
from rest_framework import routers
from .views import *
# SimpleRouter DefaultRouter
# 获取默认路由,可以通过默认路由注册资源
router = routers.DefaultRouter()
router.register('categorys', CategoryModelViewSet)
router.register('goods', GoodsModelViewSet)
app_name = 'shop'
urlpatterns = [
path("api/v1/", include(router.urls)),
]
```
<br><br>
### 分类路由
如果配置了redis, 则开启redis: redis-server
#### 主路由
http://127.0.0.1:8000/shop/api/v1/

#### 获取多个
http://127.0.0.1:8000/shop/api/v1/categorys/

#### 获取单个
http://127.0.0.1:8000/shop/api/v1/categorys/2/

<br><br>
### 分类+商品路由
#### 主路由
http://127.0.0.1:8000/shop/api/v1/

#### 获取多个
分页配置:设置了每页最多显示4个
http://127.0.0.1:8000/shop/api/v1/goods/

#### 获取单个
http://127.0.0.1:8000/shop/api/v1/goods/2/
