Django API开发实战:前后端分离、Restful风格与DRF序列化器详解
系列文章目录
- Django入门全攻略:从零搭建你的第一个Web项目
- Django ORM入门指南:从概念到实践,掌握模型创建、迁移与视图操作
- Django ORM实战:模型字段与元选项配置,以及链式过滤与QF查询详解
- Django ORM深度游:探索多对一、一对一与多对多数据关系的奥秘与实践
- 跨域问题与Django解决方案:深入解析跨域原理、请求处理与CSRF防护
- Django视图层探索:GET/POST请求处理、参数传递与响应方式详解
- Django路由与会话深度探索:静态、动态路由分发,以及Cookie与Session的奥秘
- Django API开发实战:前后端分离、Restful风格与DRF序列化器详解
- 还在写0.0…
文章目录
- 系列文章目录
- 前言
- 一、基本概念
- 1. 什么是前后端分离
- 2. 什么是restful风格
- 3. 什么是接口及接口文档
- 4. 如何阅读接口文档
- 二、DRF工程-django-restful-framework
- 1. DRF工程搭建
- 2. DRF官方文档导读
- 三、APIView
- 1. APIView处理Request
- 2. 视图的Response及json处理
- 3. 常见状态码及Response的状态码处理
- 四、序列化
- 1. 什么是json
- 2. 什么是序列化
- 3.QuerySet如何进行Json处理
- 4.DRF中的序列化器
前言
在当今互联网开发中,前后端分离架构和Restful风格API成为主流。本文将深入探讨前后端分离、Restful风格、接口文档的概念,并重点介绍DRF(Django-Rest-Framework)的使用,包括APIView处理请求与响应的方法,以及序列化的重要性。
一、基本概念
1. 什么是前后端分离
传统的不分离:
用户在浏览器上发送请求,服务器端接收到请求,根据 Header 中的 token 进行用户鉴权,从数据库取出数据,处理后将结果数据填入 HTML 模板,返回给浏览器,浏览器将 HTML 展现给用户,不分离的核心就是模版,比如 Django 直接将返回数据到模版,通过模版表单将数据返回至后端
前后端不分离的特点:
- 业务耦合较强
- 职责划分不明确
- 开发成本较高
- 服务器压力较大
- 可提高 SEO 速度,提高搜索引擎收录检索速度
现在的前后端分离:
数据渲染的工作在客户端浏览器,不需要服务端完成,服务端专注于提供数据。那么这就要求Django框架不需要返回一个模版页面,而是返回一套JSON数据,而由于JSON可以在多种语言中支持,是一种交互、兼容非常合适的语言格式,所以现在后台常返回的数据都为JSON格式的,这个过程也称作序列化
前后端分离的特点:
- 部署解耦
- 业务划分清晰,职责更为明确
- 开发成本较低,一套后台可以支持多套前端渲染
- SEO 优化较差,需要引入一些页面静态化手段
2. 什么是restful风格
在前后端分离的应用模式里,API接口如何定义?是否存在一种统一的定义方式,被广大开发人员接受认可的方式呢?
restful风格–指的是前后端交互的接口的格式定义
RestFul 规范建议:
1. 域名要有标识:
Restful 风格建议,Api 服务器的域名要尽量在专用域名之下
例如:百度面向用户的站点地址为https://baidu.com
那么,其后端接口地址可以为:
https://api.baidu.com
或https://baidu.com/api/
2.路由中体现接口版本号
例如:
https://api.baidu.com/v1/
https://baidu.com/api/v1/
http://openapi.tuling123.com/openapi/api/v2
3. url 建议名词复数
例如:
/goods/ 获取所有商品
/infos/
/addresses/
path("news/", NewsView.as_well())
path("news/<int:id>", NewsView.as_well())
4.使用合理的请求方式
例如:
对应操作,应该返回操作后的资源结果,比如获取数据,那就应该使用GET请求方式
如果是更新数据,那么建议使用PUT或PATCH方法
- GET:获取数据
- POST:提交数据,创建数据
- PUT:提交数据,更新数据
- DELETE:删除数据
还有三个不常用的HTTP动词:
- PATCH:在服务器更新(更新)资源
- HEAD:获取资源的元数据
- OPTIONS:获取信息,关于资源的哪些属性是客户端可以改变的
提供参数过滤数据:
如果数据较多,返回所有数据是不现实的,那么可以让API提供参数,进行结果返回
?limit=10
:指定返回记录的数量
?offset=10
:指定返回记录的开始位置。
?page=2&per_page=100
:指定第几页,以及每页的记录数。
?sortby=name&order=asc
:指定返回结果按照哪个属性排序,以及排序顺序。
?animal_type_id=1
:指定筛选条件
5.使用合理的状态码:(示例如下)
200 OK - [GET] # 服务器成功返回用户请求的数据
201 CREATED - [POST/PUT/PATCH] # 用户新建或修改数据成功。
204 NO CONTENT - [DELETE] # 用户删除数据成功。
202 Accepted - [*] # 表示一个请求已经进入后台排队(异步任务)
----------------------------------------------------
400 INVALID REQUEST - [POST/PUT/PATCH] # 用户发出的请求有错误,服务器没有进行新建或修改数据的操作
401 Unauthorized - [*] # 表示用户没有权限(令牌、用户名、密码错误)。
403 Forbidden - [*] # 表示用户得到授权(与 401 错误相对),但是访问是被禁止的。
404 NOT FOUND - [*] # 用户发出的请求针对的是不存在的记录,服务器没有进行操作,该操作是幂等的。
405 请求方式错误
406 Not Acceptable - [GET] # 用户请求的格式不可得(比如用户请求 JSON 格式,但是只有 XML 格式)。
410 Gone -[GET] # 用户请求的资源被永久删除,且不会再得到的。
422 Unprocesable entity - [POST/PUT/PATCH] # 当创建一个对象时,发生一个验证错误。
---------------------------------------------------
500 INTERNAL SERVER ERROR - [*] # 服务器发生错误,用户将无法判断发出的请求是否成功
3. 什么是接口及接口文档
API,全称是Application Programming Interface
,即应用程序编程接口,我们日常中习惯简称为“接口”。
比如我们要实现一个手机注册的功能,那么相应地后台工程师就需要提供一个手机注册的接口,前端开发人员在调用接口实现功能的时候,只需按照既定的规则进行请求即可,不需要去理解该功能的实现逻辑。有了这么一个机制,就使得开发人员间的协作变得非常简洁、高效。
所以,可以简单地理解为“接口决定了功能”。
接口文档又称为API文档,一般是由后台开发人员所编写的,用来描述系统所提供接口信息的文档。 大家都根据这个接口文档进行开发,并需要一直维护和遵守。
4. 如何阅读接口文档
API接口文档一般分为接口描述、接口地址、请求方法、请求参数、响应内容、错误代码、实例几个部分:
接口描述:
简单描述接口的逻辑和作用。例如说明这是一个发送消息的接口、查询天气的接口;
接口地址:
这个地址表示的是网络地址,即url,我们需要调用接口url,获取响应内容;
请求方法:
常见的请求方法为GET和POST;
请求参数:
用来传递信息的变量。即需要请求的字段名的名称和规则:都是哪些字段,字段的类型是什么,是否必填字段等等;
响应内容:
接口返回的字段名称和规则;
错误代码:
对接口的错误用代码进行归类,以便能快速找到错误原因,解决问题;
实例:
实际调用时的响应的内容。
二、DRF工程-django-restful-framework
1. DRF工程搭建
安装DRF框架
pip install djangorestframework -i https://pypi.tuna.tsinghua.edu.cn/simple
配置 settings.py
INSTALLED_APPS = [...'rest_framework',
]
2. DRF官方文档导读
这个框架封装了很多很多复用的功能:
- 将请求的数据转换为模型类对象
- 操作数据库
- 将模型类对象转换为响应的数据如JSON格式
视图封装
:DRF统一封装了请求的数据为request.data以及返回数据的Response方法序列化器
:DRF提供了序列化器可以统一便捷的进行序列化及反序列化工作认证
:对用户登陆进行身份验证权限
:对用户权限进行认证,超级用户、普通用户、匿名用户啥的限流
:对访问的用户流量进行限制,减轻接口的访问压力过滤
:可以对列表数据进行字段过滤,并可以通过添加django-fitlter扩展来增强支持排序
:来帮助我们快速指明数据按照指定字段进行排序分页
:可以对数据集进行分页处理异常处理
:DRF提供了异常处理,我们可以自定义异常处理函数接口文档生成
:DRF还可以自动生成接口文档
三、APIView
APIView
是Django REST framework
中的一个类,用于处理HTTP请求并返回HTTP响应。APIView
提供了一种基于类的视图的方式,可以更方便地编写RESTful API
。APIView
可以处理GET、POST、PUT、DELETE等HTTP请求,并根据请求的类型调用对应的方法,如get()、post()、put()、delete()等。通过APIView,开发者可以更加灵活地定义API的行为和逻辑。
django框架和drf框架对比:
django框架 | django-drf框架 |
---|---|
HttpRequest | Request |
HttpResponse | Response |
查询参数: request.GET | request.query_params |
路径参数:路由转换器 | 路由转换器 |
请求头: request.META | request.headers |
请求体-表单: request.POST | request.data |
请求体-非表单:request.body | request.data |
解析上传文件: request.FILES | request.data |
类视图: View | APIView |
JsonResponse | Response |
render | Response |
1. APIView处理Request
DRF将request.POST、request.FILES,request.body的数据统一封装到了data属性中,其中包含了
- 解析之后的文件、非文件数据
- 对POST、PUT、PATCH请求方式解析后的数据
- 表单类型数据、JSON类型数据
# app/views.py
from rest_framework.views import APIView
class ExampleView(APIView):def post(self, request):data = request.data # json/form 提交的数据return Response({'received data': request.data})
DRF为了更准确的表示这是从连接里取得数据,从而把request.GET的名字更换为了request.query_params,其余操作与request.GET一样,这里只是拼写更换
# app/views.py
from rest_framework.views import APIView
class ExampleView(APIView):def get(self, request):data = request.query_params # get 的连接传参return Response({'received data': request.query_params})
2. 视图的Response及json处理
目前在DRF中,我们所使用最多的就是Response这个方法,经常使用已经序列化好的数据结合Response返回
Response(data=None, status=None, template_name=None, headers=None, exception=False, content_type=None)
'''
data: 需要返回的数据
status: 状态码
headers: 头部信息
content-type: 返回数据 MIME 类型,一般不要多余设置,drf 会自动根据数据进行设置
'''
需要注意的是,在Response函数的第一个参数位置上,这个data不能是复杂结构的数据,比如ORM查询到的数据,ORM的数据需要提取出来成为Python的数据类型或者使用序列化方式将其加工才可以使用Response进行返回
3. 常见状态码及Response的状态码处理
200 OK - [GET] # 服务器成功返回用户请求的数据
201 CREATED - [POST/PUT/PATCH] # 用户新建或修改数据成功。
202 Accepted - [*] # 表示一个请求已经进入后台排队(异步任务)
204 NO CONTENT - [DELETE] # 用户删除数据成功。
四、序列化
1. 什么是json
这一种在各个编程语言中流通的数据格式,可以在不同的编程语言中的进行数据传递和交互
也就是用JSON传输数据可以让不同语言之间可以跨越语言不同的鸿沟,虽然 python 无法和 js 进行通信,但是通过JSON,就可以让两者进行数据通信,所以现在常见的接口返回的数据都是JSON格式
2. 什么是序列化
序列化:就是把模型层的数据返回为JSON数据集—>将模型类对象转换为响应的数据如JSON格式
反序列化:就是把前端发来的JSON数据,类字典数据,变为模型层的数据—> 前端json数据–转换成 模型对象
3.QuerySet如何进行Json处理
QuerySet对象是Django-ORM中查询数据返回的类似列表的多数据集合
详细介绍QuerySet 的一篇文章:Django ORM的QuerySet:解锁数据库交互的魔法钥匙
返回QuerySet的过滤器方法有:
all : 返回全部数据的QuerySet
filter : 返回满足条件的QuerySet
exclude : 返回条件之外的QuerySet
对QuerySet进行手动处理:
# 序列化
#query_set<[object, obj2]>
book_set = Book.objects.all()books = []
# 遍历 每一个 模型对象
for book in book_set:books.append({'id': book.id,'btitle': book.btitle,'price': book.price,'bread': book.bread,'bcomment': book.bcomment})
反序列化:django将前端传递的
json格式的字符串数据
接收并转换为模型对象
,这个过程称之为反序列化
对获取的json数据,手动进行反序列化:
#获取前端传递数据
json_dict = request.data
json_dict = {"btitle":"光年","price":18.8,"bread":20,"bcomment":200
}# 模型对象,将获取的json格式数据插入
obj = Book()
obj.btitle = json_dict['btitle']
obj.price = json_dict['price']
obj.bread = json_dict['bread']
obj.bcomment = json_dict['bcomment']
ojb.save()
4.DRF中的序列化器
DRF中,给我们提供了一个实现序列化的组件,也叫序列化器,就是
serializers
。
serializers序列化组件:
- 序列化过程:可以把我们用ORM产生的
QuerySet对象
转换成json格式数据
; - 反序列化过程:可以实现数据校验功能,并把客户端发送过来的数据(
前端json格式字符串
),经过request.data
以后变成字典,再把字典转成模型
,存到数据库;
序列化器特点:
1、将复杂的数据结构与python对象之间进行转换;
2、可以根据输入和输出数据的需要进行多级嵌套。
3、改变序列化输出数据的格式可以通过指定字段的source
来源,使用SerializerMethodField
自定义方法以及使用嵌套序列化器。
4、支持可以自定义验证和转换方法:反序列化时需要对客户端发送的数据进行验证。可以通过自定义validate
方法进行字段或对象级别的验证,还可以使用自定义的validators
或DRF自带的验证器
。
5、当使用嵌套序列化器后,多个关联模型同时的创建和更新的行为并不明确,需要显示地重写create和update方法。
普通序列化器(Serializer)代码示例:
class BookSerializer(serializers.Serializer):btitle = serializers.CharField(max_length=20, label='图书名称')price = serializers.DecimalField(max_digits=7, decimal_places=2, label='单价')bread = serializers.IntegerField(default=0, required=False, label='阅读量')bcomment = serializers.IntegerField(default=0, required=False, label='评论量')img = serializers.ImageField(label='封面图片', required=False)
相关文章:
Django API开发实战:前后端分离、Restful风格与DRF序列化器详解
系列文章目录 Django入门全攻略:从零搭建你的第一个Web项目Django ORM入门指南:从概念到实践,掌握模型创建、迁移与视图操作Django ORM实战:模型字段与元选项配置,以及链式过滤与QF查询详解Django ORM深度游ÿ…...
React基础教程:TodoList案例
todoList案例——增加 定义状态 // 定义状态state {list: ["kevin", "book", "paul"]}利用ul遍历list数组 <ul>{this.state.list.map(item ><li style{{fontWeight: "bold", fontSize: "20px"}} key{item.i…...
PHP超详细安装及应用
目录 所需安装包如下 一、PHP安装 依赖包安装 安装扩展工具(先将PHP所需的软件包全部拖进centos根目录下) 安装libmcrypt 安装mhash 安装mcrypt 安装PHP 二、设置LAMP组件环境(要保证mysql、http都安装完成了) Php.ini的建…...
【算法篇】大数加法JavaScript版
题目描述 以字符串的形式读入两个数字,编写一个函数计算它们的和,以字符串形式返回。 数据范围:s.length,t.length≤100000,字符串仅由’0’~‘9’构成 要求:时间复杂度 𝑂(𝑛) 示例1 输入&…...
【LeetCode 128】 最长连续子序列
判断前一位数在不在字典中是这道题的关键之处,这样就可以避免重复查找,从而达到O(n) 的时间复杂度。如果没有这个判断,那么时间复杂度最坏也得是O(N^2)级别的。 1. 题目 2. 分析 合理利用数据结构。本题中使用了set来保存数组的元素&#x…...
SpringCloud-面试篇(二十六)
(1)Sentinel核心API-ProcessorslotChain...
使用__try...__except和try...catch捕获异常实例分享(附源码)
在C/C++的代码中,为了防止代码块执行的过程中产生异常导致软件崩溃,我们会给代码块添加__try...__except或try...catch保护,防止软件因为操作内部触发的异常产生崩溃。本文简单地介绍一下这两种异常捕获的使用示例。 1、概述 当软件运行过程中代码抛出异常,如果异常没有处…...
基于51单片机的简易温控水杯恒温杯仿真设计( proteus仿真+程序+设计报告+讲解视频)
基于51单片机的简易温控水杯恒温杯仿真设计( proteus仿真程序设计报告讲解视频) 仿真图proteus7.8及以上 程序编译器:keil 4/keil 5 编程语言:C语言 设计编号:S0099 1. 主要功能: 基于51单片机的简易温控水杯恒温…...
王德峰视频讲座,王德峰视频全部大全集,百度云百度网盘资源下载
王德峰教授的视频讲座其内容丰富、观点独到,深受广大学者和爱好者的喜爱。很多朋友想下载王德峰教授的讲座视频,今天我给大家分享一个下载王德峰教授视频的方法 搜索 “方圆资源网官网” 打开 “方圆资源网官网,找到王德峰教授的讲座 总之&a…...
Visual Studio和BOM历史渊源
今天看文档无意间碰到了微软对编码格式解释,如下链接: Understanding file encoding in VS Code and PowerShell - PowerShell | Microsoft LearnConfigure file encoding in VS Code and PowerShellhttps://learn.microsoft.com/en-us/powershell/scrip…...
虚拟现实(VR)游戏与增强现实(AR)游戏的区别
随着科技的飞速发展,沉浸式游戏体验已经成为现代娱乐的重要组成部分。虚拟现实(VR)游戏和增强现实(AR)游戏是这类体验中的两大主流,但它们在技术实现、用户体验和应用场景上有显著的区别。本文将详细探讨VR…...
git已经设置了自己的账号和密码,提交信息还是别人解决方法
1、运行一下命令缓存输入的用户名和密码: git config --global credential.helper wincred2、重新设置自己的邮箱和用户名 查看配置信息 git config --list修改用户名和邮箱地址: git config --global user.name 你自己的username git config --glo…...
探索面向对象与并发编程的完美融合:Java中的实践与思考
探索面向对象与并发编程的完美融合:Java中的实践与思考 在软件开发的世界里,面向对象编程(OOP)与并发编程(Concurrency)常被视为两个独立的领域。然而,Java语言却将这两个领域无缝地融合在一起,使得面向对象思想能够有效简化并发编程的复杂性。那么,如何才能用面向对…...
探索在线问诊系统的安全性与隐私保护
随着远程医疗的普及,在线问诊系统成为医疗服务的重要组成部分。然而,随着医疗数据的在线传输和存储,患者的隐私保护和数据安全面临巨大挑战。本文将探讨在线问诊系统的安全性与隐私保护,介绍常见的安全措施和技术实现,…...
How To: Localize Bar and Ribbon Skin Items
您可以使用Localizer对象自定义皮肤菜单,而不是迭代每个条形皮肤子菜单项和功能区皮肤库项容器来手动修改这些项。此方法允许您同时自定义所有现有栏子菜单和功能区库中的外观项目。 创建BarLocalizer类的派生类并重写XtraLocalizer.GetLocalizedString方法。 pub…...
通过 urllib 结合代理IP下载文件实现Python爬虫
本教程将向您展示如何使用 Python 的 urllib 库结合代理 IP 来下载文件。这种技术对于避免被目标网站封锁 IP 或简单地从不同的地理位置访问网站特别有用。通过这种方式,您可以更安全地进行网页数据的爬取和分析。 安装必须的库 在开始编写代码之前,您…...
单线服务器与双线服务器的区别?
单线服务器和双线服务器之间有什么区别呢?接下来就让小万来为大家具体分析一下吧! 首先单线服务器和双线服务器之间运营商的性质是不同的,单线服务器主要是一家带宽运营商,而双线服务器则是有两家运营商提供带宽的线路。 单线服务…...
使用Hadoop MapReduce实现各省学生总分降序排序,根据省份分出输出到不同文件
使用Hadoop MapReduce实现各省学生总分降序排序,根据省份分出输出到不同文件 本文将展示如何使用Hadoop MapReduce对一组学生成绩数据进行处理,将各省的学生成绩按总分降序排序并按照省份进行分区将结果分别输出到不同的文件中。 数据样例 我们将使用…...
LeetCode | 66.加一
这道题有多个思路,可以依次取数组的每一位,乘10后加下一位,直到最后一位,就得到我们数组所表示的数字,然后加一,然后把新得到的数字再转化为对应的数组,我的做法是直接取数组的最后一位…...
Oracle最终会扼杀MySQL?(译)
原文网站:https://www.percona.com/blog/is-oracle-finally-killing-mysql/ 作者:Peter Zaitsev 自从Oracle收购了MySQL后,很多人怀疑Oracle对开源MySQL的善意,这篇percona的文章深入分析了Oracle已经和将要对MySQL采取的措施&a…...
分布式物联网平台特点
随着物联网(IoT)技术的飞速发展,我们正步入一个万物互联的新时代。在这个时代,设备、数据和服务的无缝集成是实现智能化的关键。分布式物联网平台作为这一进程的核心,正在成为构建智能世界的基石。 一、分布式物联网平…...
【学习笔记】Linux文件编译调试相关(问题未解决)
//-I意为include 指定头文件搜索路径 -l:告诉编译器链接时需要的库 gcc *.c -I /usr/include/fastdfs/ -I /usr/include/fastcommon/ -l fdfsclient//调试gcc -g -rdynamic main.c如何解决 “ 段错误(吐核) ” ??? 【线上排错】记…...
微信小程序毕业设计-驾校管理系统项目开发实战(附源码+论文)
大家好!我是程序猿老A,感谢您阅读本文,欢迎一键三连哦。 💞当前专栏:微信小程序毕业设计 精彩专栏推荐👇🏻👇🏻👇🏻 🎀 Python毕业设计…...
【多线程】进程与线程
🥰🥰🥰来都来了,不妨点个关注叭! 👉博客主页:欢迎各位大佬!👈 文章目录 1. 操作系统2. 进程2.1 进程是什么2.2 进程管理2.3 进程调度2.3 内存管理2.4 进程间通信 3. 线程3.1 线程是什…...
【文献阅读】一种多波束阵列重构导航抗干扰算法
引言 针对导航信号在近地表的信号十分微弱、抗干扰能力差的问题,文章提出了自适应波束形成技术。 自适应波束形成技术可以分为调零抗干扰算法和多波束抗干扰算法。 调零抗干扰算法主要应用功率倒置技术,充分利用导航信号功率低于环境噪声功率的特点&…...
前端传递bool型后端用int收不到
文章目录 背景模拟错误点解决方法 背景 我前几天遇到一个低级错误,就是我前端发一个请求,把参数送到后端,但是我参数里面无意间传的布尔型(刚开始一直没注意到,因为当时参数有十几个),但是我后…...
巴伦在接收链路中的应用
一、巴伦的定义 "巴伦"(Balun),是一种平衡-不平衡转换器,通常用于将平衡信号(如差分信号)转换为不平衡信号(如单端信号),或者反之。巴伦在无线通信、广播、天…...
React常见面试题(2024最新版)
创建项目 npx create-react-app my-app启动项目 npm start目录结构 目录/文件名描述README.md项目的自述文件node_modules/项目依赖包存放目录package.json包管理配置文件,记录项目信息和依赖package-lock.json锁定依赖版本,确保跨环境一致性public/公共资源目录public/ind…...
【万方数据库爬虫简单开发(自用)】
万方数据库爬虫简单开发(自用)(一) 使用Python爬虫实现万方数据库论文的搜索并获取信息1.获取url2.输入关键词3.使用BeautifulSoup解析4.获取文章标题信息 使用Python爬虫实现万方数据库论文的搜索并获取信息 后续会逐步探索更新…...
新渠道+1!TDengine Cloud 入驻 Azure Marketplace
近日,TDengine Cloud 正式入驻微软云 Marketplace,为全球更多用户带来全托管的时序数据处理服务。这一举措也丰富了 TDengine 的订阅渠道,为用户提供了极大的便捷性。现在,您可以通过微软云 Marketplace 轻松订阅并部署 TDengine …...
晚上必看的正能量直播app/武汉seo招聘网
简介 免费开源,面向对象的轻量级PHP开发框架,实现懒性加载,灵活的路由,依赖注入,请求缓存,查询语法,支持Composer. Git安装: git clone https://github.com/top-think/think 再 clone https://github.com/top-think/framework 将名称改为thinkphp 运行环境: PHP > 5.4.0 &…...
wordpress网站做成app/营销案例最新
2020年湖北高考结束后,考生最关注的事情就是高考成绩什么时候公布呢,在预告自己的成绩后最期待的就是自己今年到底考了多少分,根据往年的高考成绩公布时间安排,湖北高考成绩公布时间都在高考完大概15天左右的时间公布,…...
网页制作第一步/seo目标关键词优化
前言 其实,在服务器的安全设置方面,我虽然有一些经验,但是还谈不上有研究,所以我写这篇文章的时候心里很不踏实,总害怕说错了会误了别人的事。 本文更侧重于防止ASP漏洞***,所以服务器防黑等方面的讲解可能…...
专门做正品的网站/搜索引擎优化的方法包括
前言 Redis 是我们目前大规模使用的缓存中间件,由于他强调高效而又便捷的功能,得到了广泛的使用。单节点的Redis已经达到了很高的性能,为了提高可用性我们可以使用Redis 集群。本文参考了Rdis的官方文档和使用Redis官方提供的Redis Cluster工…...
湖州建设局投标网站/国外网站seo
从乙方到甲方,我在做什么 最近,总有朋友在问,从一座熟悉的城市到陌生的环境,从乙方到甲方,这个转换挺大的,会不会有挫败感,你平时工作内容主要是哪些? 答:还好吧&#…...
上海企业建设网站电话/办公软件速成培训班
点击上方 "Python人工智能编程" 关注,星标或者置顶每天11点准时推送,第一时间送达来自:量子位 报道 | 公众号 QbitAI | 编辑:真经君正文你是否也在朋友圈看过这样的小推广:「你要悄悄学Python,然…...