01. RESTful
HTTP请求
请求行
请求方式:POST、GET、PUT、DELETE
请求的资源:scheme.//host[:port#]/path/.../[?query-string][#anchor]
协议版本:HTTP/1.1
请求头
Cookie:浏览器缓存
Content-type:请求内容类型
...
请求体
请求的主体数据
HTTP响应
响应行
HTTP协议版本
状态码
响应头
Set-Cookie:服务器向浏览器写入cookie
Content-type:相应类型
...
响应体
响应头是服务器回写给客户端的页面正文浏览器将正文载到内存,然后解析渲染显示页面内容。
请求与响应
RESTful设计风格,是一种接口设计规范,解决不同开发人员按照自己习惯与风格开发出来的接口差异性。
1. 请求方式,每种请求方式都对应后端一种数据库的操作;
GET:SELECT 从服务器获取资源
PSOT:CREATE,给服务器提交资源
PUT:UPDATE,请求中的负载创建或者替换目标资源
DELETE:DELETE,删除资源
2. 请求地址,要操作的事物名词的复数形式;
例如学生管理系统:我们需要对学生进行增删改查,每个操作都需要提供对应的API接口
请求方式 请求地址 后端操作 响应
GET /students 获取所有学生 数组
POST /students 增加学生 创建对象
GET /students/1 获取id为1的学生 单个对象
PUT /students/1 修改id为1的学生 修改后的对象
DELETE /students/1 删除id为1的学生 空
3. 状态码,响应的状态。
02. DRF项目初始
DRF Django Rest Framework 一个内置在django里面的子应用,可以快速的开发REST,API接口应用,就是一个Django插件或者说是拓展。
建立项目文件
mkvirtualenv -p /usr/bin/python3 drfstudy drfstudy为对应项目名(即虚拟环境)
下载安装 Django Rest Framework
pip install django - i https://pypi.souban.com/simple
pip install djangorestframework -i https://pypi.douban.com/simple
下载安装数据库
pip install pymysql -i https://pypi.douban.com/simple
查看pip list,确认环境需求软件是否下载安装OK
进入workspace_lxh/study(保证在有Gitee文件的文件夹中创建项目,才可以保证与git的代码互传)文件夹,然后创建项目
django-admin startproject study
tree study 查看项目树结构
完成以上步骤,则可以进行pycharm远程同步,参考0001笔记 / 配置pycharm参考《Django22 1101.基础介绍和环境搭建》。
再回到linux环境,进行数据库环境搭建
回到虚拟环境study主界面(最外层)
mysql -uroot -pRoot123
SHOW DATABASES; 查看现有数据库
CREATE DATABASE study CHARSET=‘utf8’ ; 创建srfstudy数据库,按utf-8进行编码
CREATE USER 'lxinghua'@'%' IDENTIFIED BY '123456'; 创建账号lxinghua,密码123456
GRANT ALL PRIVILEGES ON drfstudy.* TO lxinghua@'%';
flush privileges; # 刷新系统权限
(GRANT ALL PRIVILEGES ON 'drfstudy'.* TO 'lxinghua'@'%' IDENTIFIED BY '123456'; ) 赋予lxinghua可通过密码qwe123对数据增删改查所有权限
exit; 退出mysql
mysql -uliuxinghua -p 使用账号liuxinghua进入数据库
SHOW DATABASES; 此时可看到账号liuxinghua权限下仅study数据库
注:以上在系统性设计时是需要的,主要是目的是为了专项项目专项账号,放置账号混用,导致数据库被其他账号给无操作,若是测试,则可直接采用root或admin即可
鉴于mysql的隐秘性,将setting.py中DATABASES对mysql的配置按以下方式进行,并建立对应文件信息;
之后需要主项目文件的__init__.py文件添加mysql信息,mysql连接器
配置完以上信息后,来到虚拟环境,进行数据库存储过滤信息配置,主要是配置数据存在在mysql还是sqlite3中,当然可以直接删pycharm中删除sqlite3的信息配置,同时也是为了在上推至gitee上时过滤掉此部分内容,防止mysql的信息泄露。
:wq退出后即可看看git情况并进行git信息上传等操作
推送成功后,可进入Gitee看看代码是否上传成功! 确认为推送成功!查询操作过程确认是为进行git commit -m “备注信息”的提交
版本信息提交后再次推送,确认代码推送成功!
Diango日志管理推荐文章:https://pythondjango.cn/django/advanced/14-loggging/
pycharm中进行study项目的django日志配置
在setting.py中输入以下日志配置代码!
# 在setting.py文件中加入如下配置: # 配置日志器,记录网站的日志信息 LOGGING = { # 版本 'version': 1, # 是否禁用已存在的日志器 'disable_existing_loggers': False, 'formatters': { 'verbose': { 'format': '%(levelname)s %(asctime)s %(module)s %(lineno)d %(message)s' }, 'simple': { 'format': '%(levelname)s %(module)s %(lineno)d %(message)s' }, }, 'filters': { 'require_debug_true': { '()': 'django.utils.log.RequireDebugTrue', }, }, 'handlers': { 'console': { 'level': 'DEBUG', 'filters': ['require_debug_true'], 'class': 'logging.StreamHandler', 'formatter': 'simple' }, 'file': { 'level': 'INFO', 'class': 'logging.handlers.RotatingFileHandler', 'filename': os.path.join(BASE_DIR, "logs/study.log"), # 日志文件的位置,项目目录下新建logs文件用于存放日志文件,study会自动生成 'maxBytes': 300 * 1024 * 1024, 'backupCount': 10, 'formatter': 'verbose' }, }, 'loggers': { 'django': { # 定义了一个名为django的日志器 'handlers': ['console', 'file'], 'propagate': True, 'level': 'INFO', # 日志器接收的最低日志级别 }, } }
此时进行项目测试,即可得到日志文件(记得一定要Download下来)
时间上可能存差异,主要是因setting.py中关于时区的信息未进行设定,默认情况下是USA时间
更新以上信息,后再次运行项目,查看日志即可看到时间与电脑时间保持一致了!
网页访问,小火箭也成为中文版本!
创建新的App,在项目文件夹下新建APPS文件夹进行app统一管理,操作流程如下:
1. 新建APPS文件夹,并定义为资源文件夹
2. Tools>Run manage.py TASK... 进入界面后,创建App即可
3. download下来后将app study1直接移动至APPS资源文件夹,在将虚拟环境中主目录下的study1进行删除即可
以上步骤及完成App的新建以及app文件管理
但存在一个问题,就是APPS统一管理后,其路径需要再setting.py文件中进行配置,以便后续app运行能找到路径
完成上述配置后,即可进行App的注册(其中rest_framework也需要进行注册,以便与调用)
至此,即完成一个项目的基本配置信息!后面就可以开始进行项目的功能柜代码编写!
在制作项目时,首先是进行项目的框架搭建,然后根据框架进行任务分工,逐步完成各个板块内容!
数据库的搭建
1. 在框架明确后,开始进行数据库的搭建,即各app的models.py文件编写
2. Tools>Run manage.py TASK... 进入界面执行1. makemigrations [+ app名] 2. migrate [+ app名] 不加app名,则执行该项目所有需要创建映射的数据库
3. 虚拟环境进入数据确认数据库建立情况
03. 序列化器
本质就是一个类,和模型类差不多的类,用于JSON与模型对象互转以及校验数据。
示例:
from rest_framework import serializers 序列化器字段名和模型字段名必须一致,序列化器字段可以和模型字段个数不一致,如果少于模型字段,则没有的字段不会进行显示;
class MySerializer (serializers.Serializer) : pass 其实就是定义:需要传入哪些字段数据,需要返回哪些字段数据
小技巧: 新建pathon文件标题信息设置
建立与models一样的数据,只能比modles.py少。
04. 视图集
View类视图以请求方式为类方法。在对应的方式下面编写对应的逻辑函数。
完成视图集后,即可进行访问页面,首次可进行数据添加(添加后注释掉!)
今日代码完成更新,可进行代码上推值Gitee仓库。
Gitee查询代码上推成功!
补充,以上步骤为数据获取,那数据的上传,查询以及删除呢?
数据的上传
post传参:数据的传入,上面传入参数的方式采用是后端输入,通过前端访问创建,或者直接去数据库传入数据,那怎样通过前端传入数据呢? post请求模式,进行数据的传入,1. 制定html form表单进行数据传入; 2. post 序列化器后进行反序列化创建数据至数据库。
第一种方式参考Django22期中 《1108.博客小案例》
第二种方式操作流程如下:
1. serializers.py序列化器文件中创建create方法,实现前端传入数据的传入功能;
2. 视图集中创建create方法,实现接受传入的数据并保存之数据库;
3. 路由器中添加post方法
4. 此时访问前端,即可进行数据的传入,数据传入模式为Json模式要求;
输入Json格式数据后,即可访问到post访问界面
再次访问页面可再次访问get,新添加数据就会展现出来!
单条数据的查询:
views.py文件中创建retrieve 单条信息查询方法,查询是需要传入查询参数的,存在参数不对无法查询情况,故才够用try...except方法
urls.py文件需要进行路由配置
此时可以进行访问网页,在有对应数据和无对应数据时,网页反馈信息如下:
数据的修改
1. views.py中创建update方法,实现数据的对比后更新至数据库
serializer库中update和create源码(ctrl + 鼠标右键点击serializer.save()即可查看到)
2. serializers.py序列化器文件中创建updata方法,实现前端传入数据的传入功能;
3. 路由器中添加update方法
4. 再次访问网页,即可看到网页下方新增数据录入界面,重新输入数据信息即可修改数据
数据的删除
1. views.py建立destroy方法,实现数据的识别和删除
2. serializer.py序列化器中需要定义被删除的数据的逻辑删除状态变更
3. 路由器添加delete方法
4. 访问网页,新增DELETE方法,访问单个数据,进行DELETE后,可以看到is_delete状态码变更为True
以上,即为数据的增查改删作业方法。
那么针对多模型类的增查改删,即是代码的重复性撰写!当然也可以不重复性写,以逸待劳的模式,就是ModelSerializer!
drf给我们提供了Serializer的子类ModelSerizlizer,Serializer能做的事情ModelSerializer都能做,并在基础上进行了拓展;
ModelSerialzier可以根据O型自动生成序列化器中的字段,并帮我们事项了create和update方法。
示例:
from rest_framework import serizlizers class MySerializer(serizlizer.ModelSerizlizer): class Meta: model = student fields = '__all__'
那在serizlizer.py文件中直接使用ModelSerializer的效果如下,可达到使用serizlizer同样的效果
同样的,视图集同样可以采用此种方法, ModleViewSet 帮我们实现所有的方法,方法如下:
class MyViewSet(Model ViewSet): queryset = model.objects.all() serizlizer_class = ModelSerializer
views.py文件直接采用ModelViewSet方法
此时访问前端,出现一个HTML form表单格式的传入数据格式,“name”未展示,可在serizlizer.py中exclude中不展示的“name”删除后前端即可展示出来!
上述serizlizer.py文件中中exclude属性是定义前端不需要进行展示的内容,extra_kwargs属性是用来修改映射字段的属性,如范围,字段长度等
这两方法属于额外的校验逻辑:
属性级别的校验
① 在序列化器中定义方法
② 方法名为validate_属性名(self,value)
③ 或自动将该属性的值传入value参数
对象级别的校验
① 需要访问多个字段的验证时需要使用对象级别的验证
② 定义validate(self,data)方法
③ 会自动将传入进来的所有数据传入data参数
④ data是一个字典
属性级别的校验案例:
前端访问效果,上传或修改的用户名中不包含“mq”则无法执行且报错!
对象级别校验
属性级别校验的升级,针对某个数据所有项目的校验,以下代码在姓名校验基础上加上了年龄校验
urls.py同样可以采用比较简洁的方式进行编写,针对models.py中定义的类项目进行直接访问,采用routers库中的DefaultRouter方法直接拼接urls
以上,完成本节课程介绍!将代码推送至Gitee。
Gitee上传成功!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理