lxinghua

博客园 首页 新随笔 联系 订阅 管理
  117 随笔 :: 0 文章 :: 0 评论 :: 7553 阅读

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上传成功!

posted on   興華  阅读(121)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示