当前位置: 首页 > news >正文

1、DRF实战总结:DRF特点、序列化与RESTful API规范

Django这种基于MVC开发模式的传统框架,非常适合开发基于PC的传统网站,因为它同时包括了后端的开发(逻辑层、数据库层) 和前端的开发(如模板语言、样式)。现代网络应用Web APP或大型网站一般是一个后台,然后对应各种客户端(iOS, android, 浏览器)。由于客户端的开发语言与后台的开发语言经常不一样,这时需要后台能够提供可以跨平台跨语言的一种标准的资源或数据(如json或xml)供前后端沟通,这就是Web API(网络应用程序接口)的作用了。

Django REST Framework介绍与特点

Django REST framework是一个强大且灵活的工具包,用以构建Web APIs。Django的未来与Web开发未来发展趋势紧密相关。Django本身并不是为了开发符合REST规范的Web API而设计, 不过借助Django REST Framework (DRF)这个神器可以快速开发出优秀而且规范的Web API来。Django REST framework 给Django提供了用于构建Web API 的强大而灵活的工具包, 包括序列化器、认证、权限、分页、过滤和限流。

DRF特点:

  1. 提供了定义序列化器Serializer的方法,可以快速根据 Django ORM 或者其他库自动序列化/反序列化;
  2. 提供了丰富的类视图和Mixin扩展类,可以进一步简化视图的编写;
  3. 多种身份认证和权限认证方式的支持;
  4. 内置了限流系统;
  5. 直观的API Web界面;
  6. 可扩展性, 插件丰富;
  7. 完备的文档以及良好的社区支持;
  8. 同时支持ORM和非ORM数据源的序列化;
  9. 可以配置各个环节,若无需更多强大的特性,使用一般基于类(function-based)的视图(views)即可。

Django REST Framework的安装

Django REST framework (DRF)是基于Django实现的一个RESTful风格API框架,能够帮助快速开发RESTful风格的API。

使用pip安装DRF:pip install djangorestframework

如果想要获取一个图形化的页面来操作API,需要将 rest_framework 注册到项目的INSTALL_APPS中,如下所示:

INSTALLED_APPS = [# 默认APP'django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles',# 新安装第三方APP'rest_framework','rest_framework_mongoengine',# 将自己新建的APP应用(people)添加到 settings.py中的INSTALLED_APPS中,告诉Django有这么一个应用……
]

安装和注册好DRF,但在正式使用它开发API前还需要了解两件事情。什么是数据的序列化(Serialization)以及什么是RESTful规范的API, 这对于理解DRF中的序列化serializers类和每个API端点对应的url设计至关重要。

序列化基础知识

每种编程语言都有各自的数据类型, 将属于自己语言的数据类型或对象转换为可通过网络传输或可以存储到本地磁盘的数据格式(如:XML、JSON或特定格式的字节串)的过程称为序列化(seralization);反之则称为反序列化。API开发的本质就是各种后端语言的自己的数据类型序列化为通用的可读可传输的数据格式,比如常见的JSON类型数据。

Python数据序列化

Python自带json模块的dumps方法可以将python常用数据格式(比如列表或字典)转化为json格式,如下所示。注意到了吗? 生成的json格式数据外面都加了单引号,这说明dict类型数据已经转化成了json字符串。

import jsoninfos = {"name": "SteveRocket", "language": "Python", "version": 3.11}
dump_infos = json.dumps(infos)
print(dump_infos, type(dump_infos))
输出:{"name": "SteveRocket", "language": "Python", "version": 3.11} <class 'str'>

Django查询集序列化

Django还有自己专属的数据类型比如查询集QuerySet和ValueQuerySet类型数据,还提供了自带的serializers类。使用Django自带的serializers类也可以轻易将QuerySet格式的数据转化为json格式。

# Django Queryset数据 to Json
from django.core import serializers
from drf_pro.models import SerializerDemopeoples = serializers.serialize("json", SerializerDemo.objects.all())
peoples2 = serializers.serialize("json", SerializerDemo.objects.all(), fields=("name", "id"))
people = serializers.serialize("json", SerializerDemo.objects.filter(name="SteveRocket"))

有时候只需要查询结果集的部分字段,可以使用values('字段名','字段名2')来要求返回所需要的数据,可以提升些性能,但是返回来的结果需要先转换成列表格式,再用 json.dumps()方法序列化成json格式。

import json
from django.core.serializers.json import DjangoJSONEncoder
value_query_set = SerializerDemo.objects.filter(name="SteveRocket").values("age", "description")
people_desc = json.dumps(list(value_query_set), cls=DjangoJSONEncoder)

尽管Django自带的serializers类也能将Django的查询集QuerySet序列化成json格式数据,Django REST Framework才是真正需要的序列化工具。与django自带的serializers类相比,DRF的序列化器更强大,可以根据模型生成序列化器,还能对客户端发送过来的数据进行验证。

RESTful API

REST ful是目前最流行的API设计规范,用于Web数据接口的设计。是Rest式的接口,REST与技术无关,它代表的是一种软件架构风格。

REST是REpresentational State Transfer三个单词的缩写,,中文的含义是: "表征状态转移" 或 "表现层状态转化"。由Roy Fielding于2000年论文中提出。简单来说,就是用URI表示资源,用HTTP方法(GET, POST, PUT, DELETE)表征对这些资源进行增删查改的操作。

是基于HTTP、URI、XML、JSON等标准和协议,支持轻量级、跨平台、跨语言的架构设计。

RESTful API 可以通过一套统一的接口为所有web相关提供服务,实现前后端分离。

RESTful API原则

  1. 每一个URI代表一种资源。
  2. 同一种资源有多种表现形式(xml/json)。
  3. 所有的操作都是无状态的。
  4. 规范统一接口。
  5. 返回一致的数据格式。
  6. 可缓存(客户端可以缓存响应的内容)。

如果要想编写的API被称为RESTful api,只要遵循其规定的约束即可。

为什么所有的操作都是无状态的?

http请求本身是无状态的,它是基于 client-server 架构,客户端向服务器端发的每一次请求都必须带有充分的信息能够让服务器端识别到,请求的一些信息通常会包含在URL的查询参数、header或请求体中,服务器端能够根据请求的各种参数, 不需要保存客户端的状态, 直接将数据返回给客户端。无状态的优点是:可以大大提高服务器端的健状性和可扩展性。

客户端可以通过token来标识会话状态。从而可以让该用户一直保持登录状态。

RESTful API规范

REST接口约束定义为: 资源识别;请求动作;响应信息; 它表示通过uri表示出要操作的资源,通过请求动作(http method)标识要执行的操作,通过返回的状态码来表示这次请求的执行结果。

协议、域名和版本

尽量使用https协议,使用专属域名来提供API服务。API版本可以放在URL里面,也可以用HTTP的header进行内容协商,如下所示:

https://api.example.com/v1
https://www.example.com/api/v1

uri(统一资源标识符)

在RESTful架构中,每个网址代表一种资源(resource),这个网络地址就是uri (uniform resource identifier), 有时也被称为URL (uniform resource locator)。 因为URI对应一种资源,所以里面不能有动词,只能有名词。一般来说,数据库中的表都是同种记录的”集合”(collection),所以API中的名词也应该使用复数形式。

https://api.example.com/v1/users # 用户列表资源地址
https://api.example.com/v1/users/{id} # 用户id=5对应资源。注意:这里是users/5,而不是user/5
https://api.example.com/v1/users/{id}/articles # 用户id=5发表的文章列表

如果需要对一个用户信息进行编辑或删除,一个传统Django开发者可能将URL写成如下所示:

https://api.example.com/v1/users/{id}/edit/ # 编辑用户
https://api.example.com/v1/users/{id}/delete/ # 删除用户

上面URL设计其实是不符合RESTful规范的。一个 URI就应该是一个资源,本身不能包含任何动作 (action)。REST的规范是资源的URI地址是固定不变的,对同一资源应使用不同的HTTP请求方法进行不同的操作,比如常见的增删查改。

[POST]    https://api.example.com/v1/users   // 新增
[GET]     https://api.example.com/v1/users/1 // 查询
[PATCH]   https://api.example.com/v1/users/1 // 更新
[PUT]     https://api.example.com/v1/users/1 // 覆盖,全部更新
[DELETE]  https://api.example.com/v1/users/1 // 删除

有时候URL比较长,可能由多个单词组成,建议使用中划线”-“分割,而不是下划线”_“作为分隔符,另外每个url的结尾不能加斜线”/”。

https://api.example.com/v1/user-management/users/{id} # 好
https://api.example.com/v1/user_management/users/{id} # 不好
https://api.example.com/v1/user-management/users/{id}/ # 不好

 

参数命名规范

参数推荐采用下划线命名的方式。

http://127.0.0.1/api/today_login               // 获取今天登录的用户。

http://127.0.0.1/api/today_login&sort=login_desc // 获取今天登录的用户、登录时间降序排序。

HTTP请求方法

常用的HTTP请求方法有下面五个(括号里是对应的SQL命令),每个方法对应一个操作。客户端在消费服务器提供的API服务时不仅要指定请求地址,还需指定请求方法。

	GET(SELECT):查询;从服务器取出资源(一项或多项)。POST(CREATE):新增;在服务器新建一个资源。PUT(UPDATE):更新;在服务器更新资源(客户端提供改变后的完整资源)。PATCH(UPDATE):更新;在服务器更新资源(客户端提供改变的属性)。DELETE(DELETE):删除;从服务器删除资源。

另外还有两个不常用方法HEAD和OPTIONS,HEAD和GET本质是一样的,区别在于:

HEAD不含有呈现数据,而仅仅是HTTP头信息,请求的是资源的元数据,比如一张照片的元数据则可能包含了,照片拍摄的设备,地点,时间等。服务器一般将对应资源的元数据置于响应的报头集合返回给客户端,这样的响应一般不具有主体部分。

OPTIONS极少使用,它主要用于获取当前URL所支持的方法,发送一种“探测”请求以确定针对某个目标地址的请求必须具有怎样的约束(比如应该采用怎样的HTTP方法以及自定义的请求报头),然后根据其约束发送真正的请求。

HTTP状态码(Status Codes

服务器在处理客户端请求后还应向用户返回响应的状态码和提示信息,DRF给出Respone时可以指定各种各样状态码,很容易使用,常见的有以下一些状态码。

1xx: 信息,请求收到了,继续处理。

2xx: 代表成功. 行为被成功地接收、理解及采纳。

3xx: 重定向。

4xx: 客户端错误,请求包含语法错误或请求无法实现。

5xx: 服务器端错误。

2xx 状态码

200 OK - [GET]:服务器成功返回用户请求的数据,该操作是幂等的(Idempotent)
201 CREATED - [POST/PUT/PATCH]:用户新建或修改数据成功
202 Accepted - [*]:表示一个请求已经进入后台排队(异步任务)
204 NO CONTENT - [DELETE]:用户删除数据成功

 

4xx状态码

400 INVALID REQUEST - [POST/PUT/PATCH]:用户发出的请求有错误,服务器没有进行新建或修改数据的操作,该操作是幂等的。
401 Unauthorized - [*]:表示用户没有权限(令牌、用户名、密码错误)。
403 Forbidden - [*] 表示用户得到授权(与401错误相对),但是访问是被禁止的。
404 NOT FOUND - [*]:用户发出的请求针对的是不存在的记录,服务器没有进行操作,该操作是幂等的。
405:Method Not Allowed: 用户已经通过了身份验证, 但是所用的HTTP方法不在它的权限之内。
406 Not Acceptable - [GET]:用户请求的格式不可得(比如用户请求JSON格式,但是只有XML格式)。
410 Gone -[GET]:用户请求的资源被永久删除,且不会再得到的。
415: Unsupported Media Type: 客户端要求的返回格式不支持,比如,API只能返回JSON格式,但是客户端要求返回XML格式。
422 Unprocesable entity - [POST/PUT/PATCH] 当创建一个对象时,发生一个验证错误。
429:Too Many Requests: 客户端的请求次数超过限额。

 

5xx 状态码

500 INTERNAL SERVER ERROR - [*]:服务器发生错误
502:网关错误。
503: Service Unavailable 服务器端当前无法处理请求。
504:网关超时。

 

过滤信息(filtering

如果记录数量很多,服务器不可能都将它们返回给用户。符合RESTful规范的API应该支持过滤,DRF与django-filter可以轻松实现过滤。下面是一些常见的通过参数过滤的方式。

?limit=10:指定返回记录的数量
?offset=10:指定返回记录的开始位置。
?page=2&per_page=100:指定第几页,以及每页的记录数。
?sortby=name&order=asc:指定返回结果按照哪个姓名排序,以及排序顺序。
?user_type_id=1:指定筛选条件,比如用户类型。

统一返回数据格式

Hypermedia API

RESTful API最好做到Hypermedia,即返回结果中提供链接,连向其他API方法,使得用户不查文档,也知道下一步应该做什么。比如,当用户向127.0.0.1的根目录发出请求,会得到这样一个文档,DRF支持HyperLinkedModel,很容易实现这点。

{
"link": {"rel":   "collection https://127.0.0.1/zoos","href":  "https://api.example.com/zoos","title": "List of zoos","type":  "application/vnd.yourformat+json"
}
}

 

返回的数据格式

RESTful规范中的请求应该返回统一的数据格式。对于返回的数据,一般会包含如下字段:

1) code: http响应的状态码。

2) status: 包含文本, 比如:'success'(成功), 'fail'(失败), 'error'(异常)

HTTP状态响应码在500-599之间为 'fail'; 在400-499之间为 'error', 其他一般都为 'success'。对于响应状态码为 1xx, 2xx, 3xx 这样的可以根据实际情况可要可不要。

当status的值为 'fail' 或 'error'时,需要添加 message 字段,用于显示错误信息。

3) data: 当请求成功的时候, 返回的数据信息。但是当状态值为 'fail' 或 'error' 时,data仅仅包含错误原因或异常信息等。

响应成功的示例:

{"code": 200,"status": "success","data": [{"userName": "tugenhua","age": 31}]
}

响应失败的示例:

{"code": 401,"status": "error","message": '用户没有权限',"data": null
}

参考资料

  • 官网:https://www.django-rest-framework.org/
  • 中文文档:主页 - Django REST framework中文站点
  • https://github.com/encode/django-rest-framework/tree/master
  • Home - Django REST framework

输入才有输出,吸收才能吐纳。——码字不易

相关文章:

1、DRF实战总结:DRF特点、序列化与RESTful API规范

Django这种基于MVC开发模式的传统框架&#xff0c;非常适合开发基于PC的传统网站&#xff0c;因为它同时包括了后端的开发(逻辑层、数据库层) 和前端的开发(如模板语言、样式)。现代网络应用Web APP或大型网站一般是一个后台&#xff0c;然后对应各种客户端(iOS, android, 浏览…...

SIP协议及其简单介绍

SIP协议及其简单介绍概述流程SIP流程两台设备建立会话原理使用场景概述 SIP&#xff08;Session Initiation Protocol&#xff0c;会话初始化协议&#xff09;是一个应用层协议&#xff0c;用于在互联网上创建、修改和终止多媒体会话。SIP是一个客户端/服务器协议&#xff0c;…...

安全防御第四天:防病毒网关

一、恶意软件1.按照传播方式分类&#xff08;1&#xff09;病毒病毒是一种基于硬件和操作系统的程序&#xff0c;具有感染和破坏能力&#xff0c;这与病毒程序的结构有关。病毒攻击的宿主程序是病毒的栖身地&#xff0c;它是病毒传播的目的地&#xff0c;又是下一次感染的出发点…...

Postman接口与压力测试实例

Postman是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件。它提供功能强大的 Web API & HTTP 请求调试。 1、环境变量和全局变量设置 环境变量可以使用在以下地方&#xff1a; URLURL paramsHeader valuesform-data/url-encoded valuesRaw body contentHelper fi…...

TCP/IP socket

## TCP Socket 收发缓冲区: 每个socket在linux内核中都有一个发送缓冲区和一个接收缓冲区。 只要对端将数据发送过来&#xff0c;linux内核TCP/IP协议栈就会负责将数据缓存到socket对应的接收缓冲区中&#xff0c;无论是否调用recv。 recv()所做的工作&#xff0c;只是把内核缓…...

“工作三年,跳槽要求涨薪50%”,合理吗?

如果问在TI行业涨工资最快的方式是什么&#xff1f;回答最多的一定是&#xff1a;跳槽&#xff01;前段时间&#xff0c;知乎上这样一条帖子引发了不少IT圈子的朋友的讨论 &#xff0c;有网友提问 “程序员跳槽要求涨薪50%过分吗&#xff1f;”截图来源于知乎&#xff0c;如侵删…...

Vue学习计划九:了解Vue动画效果以及过渡动画和动态组件的使用方法

Vue.js 是一个流行的 JavaScript 框架&#xff0c;它提供了很多工具和功能&#xff0c;可以帮助开发人员创建动态、交互式的 Web 应用程序。其中之一就是动画效果&#xff0c;Vue.js 提供了一系列的 API 和指令&#xff0c;使得添加动画效果变得非常容易。 在 Vue.js 中&#…...

【Linux】进程理解与学习Ⅲ-环境变量

环境&#xff1a;centos7.6&#xff0c;腾讯云服务器Linux文章都放在了专栏&#xff1a;【Linux】欢迎支持订阅&#x1f339;相关文章推荐&#xff1a;【Linux】冯.诺依曼体系结构与操作系统【Linux】进程理解与学习Ⅰ-进程概念浅谈Linux下的shell--BASH【Linux】进程理解与学习…...

【三】一起算法---栈:STL stack、手写栈、单调栈

纸上得来终觉浅&#xff0c;绝知此事要躬行。大家好&#xff01;我是霜淮子&#xff0c;欢迎订阅我的专栏《算法系列》。 学习经典算法和经典代码&#xff0c;建立算法思维&#xff1b;大量编码让代码成为我们大脑的一部分。 ⭐️已更系列 1、基础数据结构 1.1、链表➡传送门 1…...

电路设计的一些概念

锁存器的产生 论述1 (转)时序电路&#xff0c;生成触发器&#xff0c;触发器是有使能端的&#xff0c;使能端无效时数据不变&#xff0c;这是触发器的特性。 组合逻辑&#xff0c;由于数据要保持不变&#xff0c;只能通过锁存器来保存。 第一个代码&#xff0c;由于是时序逻…...

【Linux】Linux下权限的理解

前言&#xff1a;在之前我们已经对基本的指令进行了深入的学习&#xff0c;接下来我将带领大家学习的是关于权限的相关问题。在之前&#xff0c;我们一直是使用的【root】用户&#xff0c;即为“超级用户”&#xff0c;通过对权限的学习之后&#xff0c;我们就会慢慢的切换到普…...

Prometheus监控实战系列十七:探针监控

目前对于应用程序的监控主要有两种方式&#xff0c;一种被称为白盒监控&#xff0c;它通过获取目标的内部信息指标&#xff0c;来监控目标的状态情况&#xff0c;我们前面介绍的主机监控、容器监控都属于此类监控。另一种则是“黑盒监控”&#xff0c;它指在程序外部通过探针的…...

题目:JPA的懒加载失效是什么情况?

题目&#xff1a;JPA的懒加载失效是什么情况&#xff1f;Q1&#xff1a;什么是JPA的懒加载&#xff1f;Q2&#xff1a;JPA的懒加载会在什么情况下失效&#xff1f;Q3&#xff1a;如何避免JPA的懒加载失效&#xff1f;前言&#xff1a;在使用JPA进行数据库操作时&#xff0c;懒加…...

十六、消息推送

一、什么是消息推送&#xff1f; 消息推送通常是指网站的运营工作等人员&#xff0c;通过某种工具对用户当前网页或移动设备 APP 进行的主动消息推送。 消息推送一般又分为 Web 端消息推送和移动端消息推送。 消息推送无非是推&#xff08;push&#xff09;和拉&#xff08;p…...

PMP项目管理-【第一章】引论

项目知识体系&#xff1a; 项目管理知识体系&#xff1a; 1.1 项目特性 独特性&#xff1a;独特性会带来不确定性(风险) 临时性&#xff1a;1> 任何项目都有起始终止时间 2> 项目具备临时性&#xff0c;项目成果可能是永久的 1.2 项目驱动变革 从商业角度来看&#xff0c…...

前端布局小案例,分享3个漂亮的卡片组件

当今互联网发展迅猛&#xff0c;各种应用、网站和软件层出不穷&#xff0c;其中前端技术的发展更是让人瞩目。随着用户对于界面设计的要求越来越高&#xff0c;漂亮的卡片组件在各类网页设计中变得越来越流行。本文将分享三个精美的卡片组件&#xff0c;帮助您在前端开发中轻松…...

博客重载记录

博客重载记录流控算法实现open系统调用流程二分查找前言&#xff1a; 有时候看了一些比较好的文章&#xff0c;过几天就忘了&#xff0c;想想不如自己实现一遍博客代码或按博客结构自己写一遍&#xff0c;加深印象&#xff0c;但把别人的内容改个名字变成自己的博客&#xff0c…...

open-cv绘制简单形状line() circle() rectangle() polylines() putText() cvtColor()

OpenCV彩色图像中一个像素是按照“B-G-R”模式组织的。 绘图函数的一些公众参数&#xff1a; img &#xff1a;图像对象 color&#xff1a; 颜色&#xff0c;如果彩色用一个三元组表示&#xff0c;三元组的元素按照B-G-R组织&#xff0c;三元组(0,255,0)中B为0&#xff0c;G为2…...

基于 PyTorch + LSTM 进行时间序列预测(附完整源码)

时间序列数据&#xff0c;顾名思义是一种随时间变化的数据类型。 例如&#xff0c;24小时内的温度、一个月内各种产品的价格、某家公司一年内的股票价格等。深度学习模型如长短期记忆网络&#xff08;LSTM&#xff09;能够捕捉时间序列数据中的模式&#xff0c;因此可以用于预…...

GEE页面介绍

目录一、背景二、用户界面三、数据类型&#xff1a;栅格1、请求图像集合2、学习查看栅格元数据3、矢量实例一&#xff1a;四、数据集五、数据属性1、空间分辨率2、时间分辨率六可视化多个波段1、真彩色(TCI)2彩色红外&#xff08;CI&#xff09;3、伪色 1 和 2 (FC1/FC2)七、可…...

浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)

✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义&#xff08;Task Definition&…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来

一、破局&#xff1a;PCB行业的时代之问 在数字经济蓬勃发展的浪潮中&#xff0c;PCB&#xff08;印制电路板&#xff09;作为 “电子产品之母”&#xff0c;其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透&#xff0c;PCB行业面临着前所未有的挑战与机遇。产品迭代…...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架&#xff0c;相比 MapReduce 具有以下核心优势&#xff1a; 内存计算&#xff1a;数据可常驻内存&#xff0c;迭代计算性能提升 10-100 倍&#xff08;文档段落&#xff1a;3-79…...

如何在看板中有效管理突发紧急任务

在看板中有效管理突发紧急任务需要&#xff1a;设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP&#xff08;Work-in-Progress&#xff09;弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中&#xff0c;设立专门的紧急任务通道尤为重要&#xff0c;这能…...

大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计

随着大语言模型&#xff08;LLM&#xff09;参数规模的增长&#xff0c;推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长&#xff0c;而KV缓存的内存消耗可能高达数十GB&#xff08;例如Llama2-7B处理100K token时需50GB内存&a…...

Selenium常用函数介绍

目录 一&#xff0c;元素定位 1.1 cssSeector 1.2 xpath 二&#xff0c;操作测试对象 三&#xff0c;窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四&#xff0c;弹窗 五&#xff0c;等待 六&#xff0c;导航 七&#xff0c;文件上传 …...

RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill

视觉语言模型&#xff08;Vision-Language Models, VLMs&#xff09;&#xff0c;为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展&#xff0c;机器人仍难以胜任复杂的长时程任务&#xff08;如家具装配&#xff09;&#xff0c;主要受限于人…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践

作者&#xff1a;吴岐诗&#xff0c;杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言&#xff1a;融合数据湖与数仓的创新之路 在数字金融时代&#xff0c;数据已成为金融机构的核心竞争力。杭银消费金…...

给网站添加live2d看板娘

给网站添加live2d看板娘 参考文献&#xff1a; stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下&#xff0c;文章也主…...