DRF - 框架安装使用
一. 在开发Web应用中,有两种应用模式
- 前后端不分离
- 前后端分离
DRF框架使用了前后端分离的模式
二. Restful设计方法
- 请求url(路径)
- 请求方法
1. 路径
资源作为网址,只能有名词,不能有动词,而且所用的名词往往与数据库的表名对应。
举例来说,以下是不好的例子:
/getProducts
/listOrders
/retreiveClientByOrder?orderId=1
对于一个简洁结构,应该始终用名词。 此外,利用的HTTP方法可以分离网址中的资源名称的操作。
GET /products :将返回所有产品清单
POST /products :将产品新建到集合
GET /products/4 :将获取产品 4
PUT /products/4 :将更新产品 4
API中的名词应该使用复数。无论子资源或者所有资源。
举例来说,获取产品的API可以这样定义
获取单个产品:http://127.0.0.1:8080/AppName/rest/products/1
获取所有产品: http://127.0.0.1:8080/AppName/rest/products
2.HTTP动词
对于资源的具体操作类型,由HTTP动词表示。
常用的HTTP动词有下面四个(括号里是对应的SQL命令)。
GET(SELECT):从服务器取出资源(一项或多项)。
POST(CREATE):在服务器新建一个资源。
PUT(UPDATE):在服务器更新资源(客户端提供改变后的完整资源)。
DELETE(DELETE):从服务器删除资源。
还有三个不常用的HTTP动词。
PATCH(UPDATE):在服务器更新(更新)资源(客户端提供改变的属性)。
HEAD:获取资源的元数据。
OPTIONS:获取信息,关于资源的哪些属性是客户端可以改变的。
下面是一些例子。
GET /zoos:列出所有动物园
POST /zoos:新建一个动物园(上传文件)
GET /zoos/ID:获取某个指定动物园的信息
PUT /zoos/ID:更新某个指定动物园的信息(提供该动物园的全部信息)
DELETE /zoos/ID:删除某个动物园
GET /zoos/ID/animals:列出某个指定动物园的所有动物
DELETE /zoos/ID/animals/ID:删除某个指定动物园的指定动物
3.过滤信息(Filtering)
如果记录数量很多,服务器不可能都将它们返回给用户。API应该提供参数,过滤返回结果。
下面是一些常见的参数。
?limit=10:指定返回记录的数量
?offset=10:指定返回记录的开始位置。
?page=2&per_page=100:指定第几页,以及每页的记录数。
?sortby=name&order=asc:指定返回结果按照哪个属性排序,以及排序顺序。
?animal_type_id=1:指定筛选条件
参数的设计允许存在冗余,即允许API路径和URL参数偶尔有重复。比如,GET /zoos/ID/animals 与 GET /animals?zoo_id=ID 的含义是相同的。
三. Django REST framework
1. 项目准备
创建项目+创建应用+安装应用+配置模板路径+本地化+mysql数据库+URLconf+视图
2. 安装和配置
安装应用,关闭csrf中间件
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'book'
]
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
#'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
3. 定义模型类
# 准备书籍列表信息的模型类
class BookInfo(models.Model):
# 创建字段,字段类型...
name = models.CharField(max_length=20, verbose_name='名称')
pub_date = models.DateField(verbose_name='发布日期',null=True)
readcount = models.IntegerField(default=0, verbose_name='阅读量')
commentcount = models.IntegerField(default=0, verbose_name='评论量')
is_delete = models.BooleanField(default=False, verbose_name='逻辑删除')
image = models.ImageField(upload_to='book', null=True, verbose_name='图片')
class Meta:
db_table = 'bookinfo' # 指明数据库表名
verbose_name = '图书' # 在admin站点中显示的名称
def __str__(self):
"""定义每个数据对象的显示信息"""
return self.name
# 准备人物列表信息的模型类
class PeopleInfo(models.Model):
name = models.CharField(max_length=20, verbose_name='名称')
password = models.CharField(max_length=20,verbose_name='密码')
description = models.CharField(max_length=200, null=True, verbose_name='描述信息')
book = models.ForeignKey(BookInfo, related_name='people',on_delete=models.CASCADE, verbose_name='图书') # 外键
is_delete = models.BooleanField(default=False, verbose_name='逻辑删除')
class Meta:
db_table = 'peopleinfo'
verbose_name = '人物信息'
def __str__(self):
return self.name
迁移,执行迁移后插入数据
book信息
insert into bookinfo(name, pub_date, readcount,commentcount, is_delete) values
('射雕英雄传', '1980-5-1', 12, 34, 0),
('天龙八部', '1986-7-24', 36, 40, 0),
('笑傲江湖', '1995-12-24', 20, 80, 0),
('雪山飞狐', '1987-11-11', 58, 24, 0);
people信息
insert into peopleinfo(name, password, book_id, description, is_delete) values
('郭靖', '123456abc', 1, '降龙十八掌', 0),
('黄蓉', '123456abc', 1, '打狗棍法', 0),
('黄药师', '123456abc', 1, '弹指神通', 0),
('欧阳锋', '123456abc', 1, '蛤蟆功', 0),
('梅超风', '123456abc', 1, '九阴白骨爪', 0),
('乔峰', '123456abc', 2, '降龙十八掌', 0),
('段誉', '123456abc', 2, '六脉神剑', 0),
('虚竹', '123456abc', 2, '天山六阳掌', 0),
('王语嫣', '123456abc', 2, '神仙姐姐', 0),
('令狐冲', '123456abc', 3, '独孤九剑', 0),
('任盈盈', '123456abc', 3, '弹琴', 0),
('岳不群', '123456abc', 3, '华山剑法', 0),
('东方不败', '123456abc', 3, '葵花宝典', 0),
('胡斐', '123456abc', 4, '胡家刀法', 0),
('苗若兰', '123456abc', 4, '黄衣', 0),
('程灵素', '123456abc', 4, '医术', 0),
('袁紫衣', '123456abc', 4, '六合拳', 0);
4. 视图
from django.views.generic import View
from django.http.response import JsonResponse
# Create your views here.
class BookListView(View):
"""
图书列表
"""
def get(self,request):
return JsonResponse({'msg':'ok'})
5. URLconf
settings.py
中:指定url配置(项目的根路由)
ROOT_URLCONF = 'bookmanager.urls'
项目中urls.py:只要不是admin/就匹配成功,包含到应用中的urls.py
from django.urls import path,include
from django.contrib import admin
urlpatterns = [
path('admin/', include(admin.site.urls)),
# 只要不是‘admin/’就匹配成功,包含到应用中的urls.py
path('', include('book.urls')),
]
应用中urls.py:匹配books/成功就调用views中的BookListView视图,测试项目逻辑
from django.urls import path
from book import views
urlpatterns = [
path('books/',views.BookListView.as_view()),
]
以上就是DRF框架的基本安装配置使用,希望对你有帮助!