DRF(Django Rest Framework)框架基于restAPI协议规范的知识点总结
Django Rest Framework学习
一、初识DRF组件
1.1 FBV和CBV
-
FBV:function based view
from django.shortcuts import render, HttpResponse # 这种是基于FBV模式 函数模式实现Views函数 def login(request):if request.method == 'GET':return HttpResponse("Get请求。。。。")return HttpResponse("POST请求。。。。")在FBV下调函数不加(),例如path(‘login/’, views.Login)url是映射,指向这块空间
-
CBV:class based view
1.app目录下的views.py下
from django.shortcuts import render, HttpResponse from django.views import View # 类要继承django的view模块 class LoginView(View):# 这个函数是固定写法,必须叫getdef get(self):return HttpResponse("get请求。。。。")# 这个函数是固定写法,必须叫postdef post(self):return HttpResponse("post请求。。。。")2.urls.py下使用 django的view
from django.contrib import admin from django.urls import path from userapp import views urlpatterns = [# path('admin/', admin.site.urls),path('login/', views.LoginView.as_view()), ] '''path('login/', views.LoginView.as_view()),相当于:path('login/', View.view),一旦浏览器发起get请求 /login/ ————> View.view()def view(request, *args, **kwargs):self = cls(**initkwargs)return self.dispatch(request, *args, **kwargs)然后view()去调用dispatch()方法def dispatch(self, request, *args, **kwargs):if request.method.lower() in self.http_method_names:handler = getattr(self, request.method.lower(), self.http_method_not_allowed)else:handler = self.http_method_not_allowed# 返回loginview里的get、post方法return handler(request, *args, **kwargs) '''在CBV模式下重要的是as_view()
1.2 类、面向对象基础
运算符的应用
代码:能看懂这个就能理解操作符优先级
class B(object):def __init__(self, name, age):self.name = nameself.age = ageself.foo()def foo(self):print("B foo....")
class Animal(B):foo = 100def foo(self):print("A foo...")foo = 100
scd = Animal("dfdk", 23)
反射:getattr()函数
class Animal(object):def __init__(self, name, age):self.name = nameself.age = age
ads = Animal("hdsdf", 23)
atrr = input(">>>查看ads的哪个属性:")
print(getattr(ads, atrr))
反射二 getattr 方法执行通过实例对象(ads)去调用Animal类的属性和方法
getattract(self(实列对象),类中的函数)
class Animal(object):def __init__(self, name, age):self.name = nameself.age = agedef foo(self):print("foo zhixingl")
ads = Animal("hdsdf", 23)atrr = input(">>>查看ads的哪个属性:")
print(getattr(ads, atrr))
getattr(ads, "foo")()
1.重载(overloading method)
是在一个类里面,方法名字相同,而参数不同。返回类型呢?可以相同也可以不同。重载是让类以统一的方式处理不同类型数据的一种手段。函数重载主要是为了解决两个问题。
1.可变参数类型。
2.可变参数个数。
另外,一个基本的设计原则是,仅仅当两个函数除了参数类型和参数个数不同以外,其功能是完全相同的,此时才使用函数重载,如果两个函数的功能其实不同,那么不应当使用重载,而应当使用一个名字不同的函数。
好吧,那么对于情况 1 ,函数功能相同,但是参数类型不同,python 如何处理?答案是根本不需要处理,因为 python 可以接受任何类型的参数,如果函数的功能相同,那么不同的参数类型在 python 中很可能是相同的代码,没有必要做成两个不同函数。
那么对于情况 2 ,函数功能相同,但参数个数不同,python 如何处理?大家知道,答案就是缺省参数。对那些缺少的参数设定为缺省参数即可解决问题。因为你假设函数功能相同,那么那些缺少的参数终归是需要用的。
好了,鉴于情况 1 跟 情况 2 都有了解决方案,python 自然就不需要函数重载了。
2.方法重写(overiding method)
子类不想原封不动地继承父类的方法,而是想作一定的修改,这就需要采用方法的重写。方法重写又称方法覆盖
class LoginView(View):def dispatch(self, request, *args, **kwargs):print("dispatch....")# 在重写方法后,在引用父类方法需要使用super()super().dispatch(request, *args, **kwargs)
1.3 前后端分离模式
-
前后端不分离模式:
- 将数据库的数据直接嵌入模板中 实现方法是使用模板语法
- views.py里要返回页面 使用render(),HttpResponse,redirct()
-
前后端分离模式:
- 使用后端的数据,queryset ,序列化(将数据库的数据传到客户端页面)、反序列化(将客户端的数据返回并保存到数据库)
1.4 API
目前市面上大多数公司开发人员使用的接口实现规范主要有:restful(基于Http协议)、RPC(基于TCP协议)性能好一些。
-
RPC (Remote Procedure Call)远程过程调用【远程服务调用】,从字面上理解就是访问/调用远程服务端提供的API接口
-
restful :面向资源开发
符合restful 规范 urls路由:
/books/get ----- > 查看所有资源逻辑post ----- > 添加逻辑 /books/1get ----- > 查看单个资源逻辑delete ----- > 删除单个资源逻辑put ----- > 更新单个资源逻辑patch ----- > 更新资源逻辑
1.5 drf的使用
-
在setting.py 的INSTALLED_APPS下添加” rest_framework“
-
在urls路由中
from django.contrib import admin from django.urls import path from userapp.views import LoginView from drfdemo import views urlpatterns = [# path('admin/', admin.site.urls),path('login/', LoginView.as_view()),path('student/', views.StudentView.as_view()), ] 因为DRF框架的views的类视图继承的是rest_framework的APIView类 所以 path('student/', views.StudentView.as_view()),中调用的是rest_framework的方法 ''' 类视图继承的是rest_framework的APIView类def as_view(cls, **initkwargs):########第二步调用django的View类里的as_view()函数 #######view = super().as_view(**initkwargs)view.cls = clsview.initkwargs = initkwargs#####第三步 在View.as_view中返回view函数(dispatch()方法)def view(request, *args, **kwargs):self = cls(**initkwargs)这个self指的是APIViewreturn self.dispatch(request, *args, **kwargs)#####第四步 调用APIView的dispatch方法,因为APIView中有自己的dispatch()方法#####第五步 看看APIView的dispatch方法的实现def dispatch(self, request, *args, **kwargs):self.args = argsself.kwargs = kwargs##### 构建新的request对象request = self.initialize_request(request, *args, **kwargs)self.request = requestself.headers = self.default_response_headers # deprecate?##### 执行三个组件 权限、认证(验证有点像Django的modelForms)、限流self.initial(request, *args, **kwargs)##### 分发逻辑(使用getattr()反射去StudentView下找到相关的函数并执行)handler = getattr(self, request.method.lower(), self.http_method_not_allowed)handler = self.http_method_not_allowed# 返回loginview里的get、post方法return handler(request, *args, **kwargs) ''' -
views.py文件
from django.shortcuts import render, HttpResponse # from django.views import View # 序列化器和检验数据的功能 from rest_framework.views import APIView # Create your views here. class StudentView(APIView):def get(self, request):# 查看get请求传回来的数据 request.GETprint(request.GET, type(request.GET))print(request.query_params)return HttpResponse("LoginView:get请求。。。。")def post(self, request):# 查看post请求传回来的数据 使用request.dataprint(request.data, type(request.data))return HttpResponse("LoginView:post请求。。。。")def delete(self, request):return HttpResponse("LoginView:delete请求。。。。")请求参数的反序列化,
-
request.data
返回解析之后的请求体数据,类似于Django里的request.POST和request.FILES属性:
- 包含了解析之后的文件和非文件数据
- 包含了对POST、PUT、PATCH请求方式解析后的数据
- 利用了REST Framework的parsers解析器,不仅支持表单类型数据,也支持JSON数据
-
request.query_params
与DJango标准的request.GET相同,只是更换了更正确的名称而已
-
request._request
获取django封装的Request对象
-
-
序列化
-
创建序列化类
from rest_framework import serializers # 序列化类的构建 class StudentSerializer(serializers.Serializer):name = serializers.CharField()sex = serializers.BooleanField()age = serializers.IntegerField()class_num = serializers.CharField() -
创建序列化对象
class StudentView(APIView):def get(self, request):# 查看get请求传回来的数据 request.GETprint(request.GET, type(request.GET))print(request.query_params)# 获取数据库里的所有数据,序列化对象studentstudent = models.Student.objects.all()StudentSerializer(instance=student,)return HttpResponse("LoginView:get请求。。。。") -
Serializer的创建好序列化对象构造方法(默认many=false)
many = True 表示序列化多个数据对象
student = models.Student.objects.all()# 可能是多个数据对象所以使用many=True StudentSerializer(instance=student, data=empty,many=True )# many =True 表示多个序列化数据说明:
1)用序列化时,将模型类对象传入instance参数
2)用反序列化时,将要被反序列化的数据传入data参数
3)除了instance参数、data参数外,构造的Serializer对象时还可以通过context参数额外添加数据,如
StudentSerializer(instance=student, context={"request":request} ) -
序列化器的使用
序列化器的使用分为两个阶段
- 处理客户端请求时,使用序列化器可以完成对数据的反序列化
- 处理服务端响应时,使用序列化器可以完成对数据的序列化
-
响应器
from rest_framework.response import Response return Response(serializer.data) -
queryset\instance 转换为JSON/xml/yaml格式
-
-
反序列化(添加数据)
-
校验
def post(self, request):# 查看post请求传回来的数据 使用request.dataprint(request.data, type(request.data))serializer = StudentSerializer(data=request.data)# 验证方法一try:serializer.is_valid(raise_exception=True)# 将数据库插入数据库models.Student.objects.create(**serializer.validated_data)except:return Response(serializer.errors)# 验证方法二if serializer.is_valid():models.Student.objects.create(**serializer.validated_data)return Response(serializer.errors)
-
1.6 由Django开发API View开发
from django.shortcuts import render
import json
from django.http import HttpResponse, JsonResponse
from django.views import View
from django.views.decorators.csrf import csrf_exempt
from django.utils.decorators import method_decorator
# Create your views here.courser_list = {'name': '课程','price': 999.1
}# FBV
@csrf_exempt
def course_list(request):if request.method == "GET":# return HttpResponse(json.dump(courser_list), content_type='application/json')return JsonResponse(courser_list)course = json.loads(request.body.decode('utf-8'))return JsonResponse(course, safe=False)# CBV
@method_decorator(csrf_exempt, name='dispatch')
class CourseList(View):def get(self,request):return JsonResponse(courser_list)def post(self, request):course = json.loads(request.body.decode('utf-8'))return JsonResponse(course, safe=False)
1.7 由DRF 开发API view
-
函数式编程(Function Based View)
""" 一、DRF函数式编程 FBV (Function Based View)""" @api_view(["GET", "POST"]) def course_list(request):if request.method == 'GET':course = Course.objects.all()sercourse = SerializerCourse(instance=course, many=True) # 序列化return Response(data=sercourse.data, status=status.HTTP_200_OK)elif request.method == 'POST':s = SerializerCourse(data=request.data) # 反序列化if s.is_valid():s.save(teacher=request.user)return Response(data=s.data, status=status.HTTP_201_CREATED)return Response(s.errors, status=status.HTTP_400_BAD_REQUEST) -
类试图编程(Classed Based View)
views.pyfrom rest_framework.decorators import api_view from rest_framework.response import Response from rest_framework import status # 状态码 from rest_framework.views import APIView from drfapp import models from .models import Course from .serializers import SerializerCourse"""二、类视图 CLass Based View""" class CourseList(APIView):def get(self, request):# 查看get请求传回来的数据 request.GETprint(request.GET, type(request.GET))print(request.query_params)# 获取数据库里的所有数据,序列化对象students = models.Course.objects.all()ser = SerializerCourse(instance=s, many=True)return Response(data=ser.data)def post(self,request):s = SerializerCourse(data=request.data) # 反序列化if s.is_valid():s.save()print(type(request.data),type(s.data))return Response(data=s.data, status=status.HTTP_201_CREATED)return Response(s.errors, status=status.HTTP_400_BAD_REQUEST)class CourseDetailList(APIView):@staticmethoddef get_objects(id):""":param id: 课程id:return: 返回课程这个课程id的查询数据对象"""try:return models.Course.objects.get(id=id)except Course.DoesNotExist:returndef get(self, request, id):# 查看get请求传回来的数据 request.GET# 获取数据库里的所有数据,序列化对象studentobj = self.get_objects(id=id)# 如果没查询的结果if not obj:return Response(data={'msg': "此课程不存在"}, status=status.HTTP_404_NOT_FOUND)s = SerializerCourse(instance=obj, many=False)print(type(request.data), type(s.data))return Response(data=s.data, status=status.HTTP_200_OK)def put(self, request, id):""":param request::param id::return:"""obj = self.get_objects(id=id)# 如果没查询的结果if not obj:return Response(data={'msg': "此课程不存在"}, status=status.HTTP_404_NOT_FOUND)s = SerializerCourse(instance=obj, data=request.data)if s.is_valid():s.save()print(type(request.data), type(s.data))return Response(data=s.data, status=status.HTTP_201_CREATED)return Response(s.errors, status=status.HTTP_400_BAD_REQUEST)def delete(self, request, id):obj = self.get_objects(id=id)# 如果没查询的结果if not obj:return Response(data={'msg': "此课程不存在"}, status=status.HTTP_404_NOT_FOUND)obj.delete()return Response(status=status.HTTP_204_NO_CONTENT)urls.py from django.urls import path, re_path, include from drfapp import viewsurlpatterns = [path("cbv/list/", views.CourseList.as_view()),path("cbv/list/<int:id>/", views.CourseDetailList.as_view()) ] -
通用类视图(Generic Classed Based View)
# 通用类导包 from rest_framework import generics"""三、通用类视图 Generic CLass Based View""" class GCourseList(generics.ListCreateAPIView):queryset = models.Course.objects.all()serializer_class = SerializerCourse# from rest_framework import mixins # from rest_framework.generics import GenericAPIView # class GCourseDetailList((mixins.RetrieveModelMixin, # mixins.UpdateModelMixin, # mixins.DestroyModelMixin, # GenericAPIView)): class GCourseDetailList(generics.RetrieveUpdateDestroyAPIView):queryset = models.Course.objects.all()serializer_class = SerializerCourseurls.py from django.urls import path, re_path, include from drfapp import viewsurlpatterns = [# Class Based Viewpath("cbv/list/", views.CourseList.as_view()),path("cbv/list/<int:id>/", views.CourseDetailList.as_view()),# Generic Class Based Viewpath("gcbv/list/", views.GCourseList.as_view()),# 注意:这里的<int:pk>要固定写成pkpath("gcbv/list/<int:pk>/", views.GCourseDetailList.as_view()) ]
put和patch的区别:
put需要写全部字段并全部更新 patch 只需要写部分需要更新的字段并添加要更改的值
-
DRF的视图集viewsets
- 方法一使用原始创建路由 url
from django.urls import path, re_path, include from drfapp import viewsurlpatterns = [# Class Based Viewpath("cbv/list/", views.CourseList.as_view()),path("cbv/list/<int:id>/", views.CourseDetailList.as_view()),# Generic Class Based Viewpath("gcbv/list/", views.GCourseList.as_view()),path("gcbv/list/<int:pk>/", views.GCourseDetailList.as_view()),# DRF viewsets ######## 方法一:# get的值是:viewsets.ModelViewSet继承的ListModelMixin.list# post值:viewsets.ModelViewSet继承的CreateModelMixin.create# get的值是:viewsets.ModelViewSet继承的RetrieveModelMixin.retrieve# put值:viewsets.ModelViewSet继承的UpdateModelMixin.update# patch值:viewsets.ModelViewSet继承的UpdateModelMixin.partial_update# put值:viewsets.ModelViewSet继承的DestroyModelMixin.destroypath("viewsets/", views.CourseViewSet.as_view({"get": "list", "post": "create"})),path("viewsets/<int:pk>/", views.CourseViewSet.as_view({"get": "retrieve", "put": "update", "patch": "partial_update", "delete": "destroy"})) ] -
DRF的视图集viewsets 方法一使用原始创建路由 url
- 方法二 使用DRF的routers创建路由 url
from django.urls import path, re_path, include from drfapp import views# DRF viewsets ######## 方法二使用DRF的路由: from rest_framework.routers import DefaultRouter router = DefaultRouter() router.register(prefix="viewsets", viewset=views.CourseViewSet)urlpatterns = [path("", include(router.urls)) ]
1.8 权限与认证
-
认证: 认证 是指一个用户登录时对其身份的校验、认证; 在setting.py进行drf权限配置 (认证是最先被执行的 然后再权限检测)
'DEFAULT_AUTHENTICATION_CLASSES': ['rest_framework.authentication.BasicAuthentication','rest_framework.authentication.SessionAuthentication','rest_framework.authentication.TokenAuthentication'] -
Token验证的生成方式
-
使用Django的manage.py生成Token
生成Token的命令 python manage.py drf_create_token admin -
使用Django的信号机制生成Token
第一步 settings.文件下INSTALLED_APPS = [ 'rest_framework.authtoken', # DRF 自带的Token认证 ] 第二步 views.py文件下 # 通过信号机制生成Token from django.db.models.signals import post_save from django.dispatch import receiver # django的user模型类 from django.conf import settings from rest_framework.authtoken.models import Token# 通过信号机制生成token @receiver(post_save, sender=settings.AUTH_USER_MODEL) #Django的信号机制 def generate_token(sender, instance=None, created=False, **kwargs):"""创建用户时自动生成token:param sender::param instance::param created::param kwargs::return:"""if created:Token.objects.create(user=instance)第三步 drf_kan项目的总路由:drf_kan/urls.py from rest_framework.authtoken import views urlpatterns = [path('api-token-auth', views.obtain_auth_token), # 获取Token的接口 ]
-
-
权限:权限是指一个登录验证通过的用户能够访问哪些接口API,或者时对某个API接口能够拿到什么级别权限的数据
'DEFAULT_PERMISSION_CLASSES': ['rest_framework.permissions.IsAuthenticated',],
1.9 生成API接口文档
-
方法一
# 第一步 在settings.py中 # DRF的全局配置 REST_FRAMEWORK = {'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.AutoSchema',} #第二步 在drf_kan项目的总路由:drf_kan/urls.py文件中 from rest_framework.schemas import get_schema_view # 概要 生成接口文档的包schema_view = get_schema_view(title="DRF API Document", description="xxxx") urlpatterns = [path('schema/', schema_view),] -
方法二
# 第一步 在settings.py中 # DRF的全局配置 REST_FRAMEWORK = {# 'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.AutoSchema','DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.coreapi.AutoSchema',} #第二步 在drf_kan项目的总路由:drf_kan/urls.py文件中 from rest_framework.documentation import include_docs_urls # 生成接口文档的包urlpatterns = [path('docs/', include_docs_urls(title="DRF API Document", description="DRF快速入门"))]
toSchema’,}
#第二步
在drf_kan项目的总路由:drf_kan/urls.py文件中
from rest_framework.schemas import get_schema_view # 概要 生成接口文档的包
schema_view = get_schema_view(title=“DRF API Document”, description=“xxxx”)
urlpatterns = [
path(‘schema/’, schema_view),
]
- 方法二```python
# 第一步
在settings.py中
# DRF的全局配置
REST_FRAMEWORK = {# 'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.AutoSchema','DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.coreapi.AutoSchema',}
#第二步
在drf_kan项目的总路由:drf_kan/urls.py文件中
from rest_framework.documentation import include_docs_urls # 生成接口文档的包urlpatterns = [path('docs/', include_docs_urls(title="DRF API Document", description="DRF快速入门"))]
相关文章:
DRF(Django Rest Framework)框架基于restAPI协议规范的知识点总结
Django Rest Framework学习 一、初识DRF组件 1.1 FBV和CBV FBV:function based view from django.shortcuts import render, HttpResponse # 这种是基于FBV模式 函数模式实现Views函数 def login(request):if request.method GET:return HttpResponse("Get…...
Linux磁盘与文件系统管理
目录 在linux系统中使用硬盘 磁盘的数据结构 磁盘接口类型 字母含义 MBR磁盘分区 分区类型 分区的缺点 文件系统的 文件系统有什么作用 文件系统的修复 检测并确认新磁盘 参看磁盘信息 查看磁盘信息 添加磁盘 查看添加磁盘情况:sda系统磁盘ÿ…...
数字魔法AI绘画的艺术奇迹-用Stable Diffusion挑战无限可能【文末送书-12】
文章目录 前言一. 技术原理1.1 发展历程 二.对艺术领域的影响三. 挑战与机遇四.AI魔法绘画:用Stable Diffusion挑战无限可能【文末送书-12】4.1 粉丝福利:文末推荐与福利免费包邮送书! 前言 随着人工智能技术的迅猛发展,AI在各个…...
【docker实战】02 用docker安装mysql
本示例采用bitnami的镜像进行安装MySQL 一、镜像搜索 先搜索一下mysql有哪些镜像 [rootlocalhost ~]# docker search mysql NAME DESCRIPTION STARS OFFICIAL AUTOMATED mysql …...
循环渲染ForEach
目录 1、接口说明 2、键值生成规则 3、组件创建规则 3.1、首次渲染 3.2、非首次渲染 4、使用场景 4.1、数据源不变 4.2、数据源组项发生变化 4.3、数据源数组项子属性变化 5、反例 5.1、渲染结果非预期 5.2、渲染性能降低 Android开发中我们有ListView组件、GridVi…...
纷享销客华为云:如何让企业多一个选择?
纷享销客携手华为云推出多项联合解决方案,为企业的数字化提供了一个新选择。12月12日,纷享销客&华为云联合解决方案发布会在北京举办。本次发布会以“「CRM云」让企业多一个选择”为主题,来自行业头部企业的CEO、CIO、业务负责人等&#…...
前端实现断点续传文件
公司要求实现的功能,大概思路是将上传的文件通过jsZip压缩后,进行切片,留一下总切片,当前片,并把这些数据给后端,至于前端的校验,是由Md5完成的,验证文件唯一性,这样下次…...
复试 || 就业day01(2023.12.27)算法篇
文章目录 前言两数之和存在重复元素 II好数对的数目总持续时间可被 60 整除的歌曲 前言 💫你好,我是辰chen,本文旨在准备考研复试或就业 💫文章题目大多来自于 leetcode,当然也可能来自洛谷或其他刷题平台 Ὂ…...
JavaWeb——JQuery
文章目录 JQuery 是什么?jQuery 的原理示意图JQuery 基本开发步骤jQuery 对象和 DOM 对象将dom对象转为JQuery对象jQuery 对象转成 DOM 对象jQuery 选择器基本选择器基础过滤选择器JQuery 是什么? 基本介绍 jQuery 是一个快速的,简洁的 javaScript 库,使用户能更方便地处理…...
Python教程:查询Py模块的版本号,有哪些方法?
1.查看模块内部的版本信息:如果你已经导入了该模块,可以查看模块内部的__version__属性来获取版本信息。例如,对于pandas模块,可以运行import pandas和print(pandas.version)来获取版本信息。 import pandas print(pandas.__vers…...
第一节 初始化项目
系列文章目录 第一节 初始化项目 文章目录 操作步骤 总结 操作步骤 打开cmd 输入 vue ui 在打开的网页中点击“创建”,复制文件夹路径并粘贴点击“在此创建新项目” 输入项目名称 点击下一步选择手动配置 选择babel、router、vuex、css pre-processors、 linter建…...
idea提示unable to import maven project
问题描述: idea导入maven依赖时提示unable to import maven project 打开log日志如下: 问题原因以及解决方案: maven版本与idea版本不兼容,切换maven版本即可...
【Spring】SpringBoot日志
文章目录 什么是日志日志的用途日志的使用如何打印日志日志级别日志框架门面模式(外观模式)日志级别的使用配置日志级别日志持久化配置日志的存储目录配置日志文件名配置日志文件分割 更简单的日志输出 什么是日志 在计算机领域,日志是一个记…...
HTML+CSS制作动漫绿巨人
🎀效果展示 🎀代码展示 <!DOCTYPE html> <html lang="en" > <head>...
AGV智能搬运机器人-替代人工工位让物流行业降本增效
在当今快速发展的世界中,物流业面临着巨大的挑战,包括提高效率、降低成本和优化工作流程。为了应对这些挑战,一种新型的自动化设备——智能搬运机器人正在崭露头角。本文将通过一个具体的案例来展示富唯智能转运机器人在实际应用中的价值。 案…...
【办公技巧】怎么批量提取文件名到excel
Excel是大家经常用来制作表格的文件,比如输入文件名,如果有大量文件需要输入,用张贴复制或者手动输入的方式还是很费时间的,今天和大家分享如何批量提取文件名。 打开需要提取文件名的文件夹,选中所有文件,…...
uniapp实现前端银行卡隐藏中间的数字,及隐藏姓名后两位
Vue 实现前端银行卡隐藏中间的数字 主要应用了 filters过滤器 来实现效果 实现效果,如图: <template><div><div style"background-color: #f4f4f4;margin:50px 0 0 460px;width:900px;height:300px;"><p>原来&#…...
HPCC:高精度拥塞控制
HPCC:高精度拥塞控制 文章目录 HPCC:高精度拥塞控制摘要1 引言1.1 背景1.2 现有CC的局限性1.3 HPCC的提出 2 研究动机2.1 大型RDMA部署2.2 RDMA目标2.3 当前RDMA CC中的权衡DCQCNTIMELY 2.4 下一代高速CC 3 技术方案3.1 INT3.2 HPCC设计3.3 HPPC的参数 4…...
centos 配置 git 连接 github
centos 配置 git 连接 github 首先安装 git 创建 ssh key ssh-keygen -t rsa复制公钥 cat ~/.ssh/id_rsa.pub # 打印出公钥内容然后复制配置 github 登录网页 github 账号;进入 setting;点击 SSH and GPG keys,点击 New SSH keytitile 随便填…...
SpringBoot发布项目到docker
Dockerfile FROM openjdk:11 # 作者 MAINTAINER chenxiaodong<2774398338qq.com># 安装 vim # RUN yum -y install vim# 环境变量 # 进入容器后的默认工作目录 ENV WORKPATH /usr/local/webapp ENV EXECFILE Docker2Application-0.0.1-SNAPSHOT.jarRUN mkdir -p $WORKPA…...
网络六边形受到攻击
大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...
多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...
C++:std::is_convertible
C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...
YSYX学习记录(八)
C语言,练习0: 先创建一个文件夹,我用的是物理机: 安装build-essential 练习1: 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件,随机修改或删除一部分,之后…...
高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...
Matlab | matlab常用命令总结
常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...
【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...
Map相关知识
数据结构 二叉树 二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有…...
Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)
在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马(服务器方面的)的原理,连接,以及各种木马及连接工具的分享 文件木马:https://w…...
Java毕业设计:WML信息查询与后端信息发布系统开发
JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发,实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构,服务器端使用Java Servlet处理请求,数据库采用MySQL存储信息࿰…...
