drf 视图组件

  • 视图基类
  • 基于APIView写五个接口
  • 基于GenericAPIView写5个接口
  • 5个视图扩展类
  • 9个视图子类
  • 视图集

两个视图基类

  • 视图的两个基类分别是

    ​ APIView : 继承django的View

    ​ GenericAPIView: 继承APIView

  • GenericAPIView:属性和方法

    • 属性

      1.重点掌握
      ① queryset # 要序列化的数据
      ② serializer_class # 序列化类
      2.了解
      lookup_field # 通过get_object 获取单个对象的查询key值,value值是路由中传进来的
      filter_backends # 过滤类
      pagination_class # 分页类
    • 方法

      1.重点掌握
      get_queryset # 获取要序列化的数据
      get_object # 根据lookup_field配置的参数获取单个对象
      get_serializer # 获取序列化类,咱们直接用的
      get_serializer_class # 获取序列化类,不是咱们直接用的get_serializer调用了它 2.了解
      filter_queryset # 跟过滤有关系
      paginate_xxx # 跟分页有关

基于APIView写5个接口

class UserView(APIView):
def get(self, request):
res_list = User.objects.all()
ser = UserSerializer(instance=res_list, many=True)
return Response(ser.data) def post(self, request):
ser = UserSerializer(data=request.data)
if ser.is_valid():
ser.save()
return Response({'code': 100, 'msg': "新增成功"}, status=201)
else:
return Response({'code': 101, 'msg': ser.errors}) class UserDetailView(APIView):
def get(self, request, pk):
obj = User.objects.filter(pk=pk).first()
ser = UserSerializer(instance=obj)
return Response(ser.data) def put(self, request, pk):
obj = User.objects.filter(pk=pk).first()
ser = UserSerializer(instance=obj, data=request.data)
if ser.is_valid():
ser.save()
return Response({'code': 100, 'msg': "修改成功"}, status=201)
else:
return Response({'code': 101, 'msg': ser.errors}) def delete(self, request, pk):
User.objects.filter(pk=pk).delete()
return Response('')

基于GenericAPIView写5个接口

class UserView(GenericAPIView):
# 配置两个 类属性
queryset = User.objects.all()
serializer_class = UserSerializer # def get_queryset(self):
# if self.request.method=='GET':
# return User.objects.all()
# else:
# return Publish.object.all() def get(self, request):
res_list = self.get_queryset() # 提高扩展性
ser = self.get_serializer(instance=res_list, many=True)
return Response(ser.data) def post(self, request):
ser = self.get_serializer(data=request.data)
if ser.is_valid():
ser.save()
return Response({'code': 100, 'msg': "新增成功"}, status=201)
else:
return Response({'code': 101, 'msg': ser.errors}) class UserDetailView(GenericAPIView):
queryset = User.objects.all()
serializer_class = UserSerializer def get(self, request, pk):
# obj = self.get_queryset().filter(pk=pk).first()
# queryset.get({'pk':'有名分组分出来的'}
obj = self.get_object() # 根据传入的pk,获取一条数据
ser = self.get_serializer(instance=obj)
return Response(ser.data) def put(self, request, pk):
obj = self.get_object()
ser = self.get_serializer(instance=obj, data=request.data)
if ser.is_valid():
ser.save()
return Response({'code': 100, 'msg': "修改成功"}, status=201)
else:
return Response({'code': 101, 'msg': ser.errors}) def delete(self, request, pk):
self.get_queryset().filter(pk=pk).delete()
return Response('')

5个视图扩展类

五个视图扩展类必须配合GenericAPIView使用,不能与APIView配合使用

  • 五个视图扩展类导入的模块

    视图拓展类导入的模块 作用
    CreateModelMixin 写了一个Create方法,就是原来咱们post中的代码
    RetrieveModelMixin 写了一个retrieve方法,就是咱们原来的get中的代码
    UpdateModelMixin 写了一个update方法,就是咱们原来的put中的代码
    DestroyModelMixin 写了一个destroy方法,就是原来咱们的delete中的代码
    ListModelMixin 写了一个list方法,就是原来咱们的get中的代码

  • 视图py文件

    class UserView(GenericAPIView, ListModelMixin, CreateModelMixin):
    # 配置两个 类属性
    queryset = User.objects.all()
    serializer_class = UserSerializer def get(self, request, *args, **kwargs):
    return self.list(request, *args, **kwargs) def post(self, request, *args, **kwargs):
    return self.create(request, *args, **kwargs) class UserDetailView(GenericAPIView, RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin):
    queryset = User.objects.all()
    serializer_class = UserSerializer def get(self,request, *args, **kwargs):
    return self.retrieve(request, *args, **kwargs) def put(self, request, *args,**kwargs):
    return self.update(request,*args,**kwargs) def delete(self, request, *args,**kwargs):
    return self.destroy(request,*args,**kwargs)

9个视图子类

视图子类就是相当于视图类继承GenericAPIView+某个或某几个视图扩展类

使用rest_framework.generics可调用九个视图子类

  • 一共有九个视图子类

    视图子类 继承类 作用
    CreateAPIView CreateModelMixin,
    GenericAPIView
    有post方法,新增数据
    DestroyAPIView DestroyModelMixin,
    GenericAPIView
    有delete方法,删除数据
    ListAPIView ListModelMixin,
    GenericAPIView
    有get方法获取所有
    UpdateAPIView UpdateModelMixin,
    GenericAPIView
    有put和patch方法,修改数据
    RetrieveAPIView RetrieveModelMixin,
    GenericAPIView
    有get方法,获取一条
    ListCreateAPIView ListModelMixin,
    CreateModelMixin,
    GenericAPIView
    有get获取所有,post方法新增
    RetrieveDestroyAPIView RetrieveModelMixin,
    DestroyModelMixin,
    GenericAPIView
    有get方法获取一条,delete方法删除
    RetrieveUpdateAPIView RetrieveModelMixin,
    UpdateModelMixin,
    GenericAPIView
    有get获取一条,put,patch修改
    RetrieveUpdateDestroyAPIView RetrieveModelMixin,
    UpdateModelMixin,
    DestroyModelMixin,
    GenericAPIView
    有get获取一条,put,patch修改,delete删除
  • 视图类

    from rest_framework.generics import ListAPIView,CreateAPIView,   RetrieveAPIView,DestroyAPIView,UpdateAPIView
    from rest_framework.generics import ListCreateAPIView, RetrieveUpdateDestroyAPIView,RetrieveUpdateAPIView,RetrieveDestroyAPIView
    # 正常来讲 Destroy+Update 应该有一个 ,作者没加
    class UserView(ListCreateAPIView):
    # 配置两个 类属性
    queryset = User.objects.all()
    serializer_class = UserSerializer
    class UserDetailView(RetrieveUpdateDestroyAPIView):
    queryset = User.objects.all()
    serializer_class = UserSerializer

视图集

常用的视图集父类

  • ViewSet

    ​ 继承自APIViewViewSetMixin,作用也与APIView基本类似,提供了身份认证、权限校验、流量管理等

    ViewSet主要通过继承ViewSetMixin来实现在调用as_view()时传入字典(如{‘get’:’list’})的映射处理工作。

  • GenericViewSet

    使用ViewSet通常并不方便,因为list、retrieve、create、update、destory等方法都需要自己编写

    可以通过继承Mixin扩展类来复用这些方法而无需自己编写,前提是需要继承GenericAPIView

    GenericViewSet就帮助我们完成了这样的继承工作,继承自GenericAPIViewViewSetMixin,在实现了调用as_view()时传入字典(如{'get':'list'})的映射处理工作的同时,还提供了GenericAPIView提供的基础方法,可以直接搭配Mixin扩展类使用

  • ModelViewSet

    ​ 继承自GenericViewSet,同时包括了ListModelMixin、RetrieveModelMixin、CreateModelMixin、UpdateModelMixin、DestoryModelMixin。

  • ReadOnlyModelViewSet

    ​ 继承自GenericViewSet,同时包括了ListModelMixin、RetrieveModelMixin。

继承ModelViewSet编写五个接口

## 视图类
from rest_framework.viewsets import ModelViewSet,ReadOnlyModelViewSet
class UserView(ModelViewSet):
queryset = User.objects.all()
serializer_class = UserSerializer ## 路由
path('user/', views.UserView.as_view({'get': 'list', 'post': 'create'})),
path('user/<int:pk>', views.UserView.as_view({'get': 'retrieve', 'put': 'update', 'delete': 'destroy'})),

源码分析ViewSetMixin

@classonlymethod
def as_view(cls, actions=None, **initkwargs):
# 路由中as_view中必须传参数,必须传字典:{'get': 'list', 'post': 'create'}
if not actions:
raise TypeError("The `actions` argument must be provided when "
"calling `.as_view()` on a ViewSet. For example "
"`.as_view({'get': 'list'})`")
# 路由匹配成功,执行view(request),request是老的request
def view(request, *args, **kwargs):
# actions={'get': 'list', 'post': 'create'}
for method, action in actions.items():
# method:get action:list
# self 是视图类的对象中通过反射,查找list,
# handler视图类中的list方法
handler = getattr(self, action)
# 向视图类的对象中,反射 method:get,handler:list方法
# self.get=list
setattr(self, method, handler)
return self.dispatch(request, *args, **kwargs)
return csrf_exempt(view) # 只要继承了ViewSetMixin,以后路由写法变了,都要写成:views.UserView.as_view({'get': 'list', 'post': 'create'}))这种格式
# 这样写好以后,对应的请求方式来了,就会执行配置的方法

以后只要继承了ViewSetMixin,视图类中可以写任意名字的方法,不用非得写get,post,delete

  • 视图类

    from rest_framework.viewsets import ModelViewSet,ReadOnlyModelViewSet
    class StudentModelViewSet(ModelViewSet):
    queryset = Student.objects.all()
    serializer_class = StudentModelSerializer def login(self,request):
    return Response({"message":"登录成功"})
  • 路由

    urlpatterns = [
    path("stu/login/",views.StudentModelViewSet.as_view({"get":"login"}))
    ]

drf视图组件思维导图

drf 视图组件

  • 视图基类
  • 基于APIView写五个接口
  • 基于GenericAPIView写5个接口
  • 5个视图扩展类
  • 9个视图子类
  • 视图集

两个视图基类

  • 视图的两个基类分别是

    ​ APIView : 继承django的View

    ​ GenericAPIView: 继承APIView

  • GenericAPIView:属性和方法

    • 属性

      1.重点掌握
      ① queryset # 要序列化的数据
      ② serializer_class # 序列化类
      2.了解
      lookup_field # 通过get_object 获取单个对象的查询key值,value值是路由中传进来的
      filter_backends # 过滤类
      pagination_class # 分页类
    • 方法

      1.重点掌握
      get_queryset # 获取要序列化的数据
      get_object # 根据lookup_field配置的参数获取单个对象
      get_serializer # 获取序列化类,咱们直接用的
      get_serializer_class # 获取序列化类,不是咱们直接用的get_serializer调用了它 2.了解
      filter_queryset # 跟过滤有关系
      paginate_xxx # 跟分页有关

基于APIView写5个接口

class UserView(APIView):
def get(self, request):
res_list = User.objects.all()
ser = UserSerializer(instance=res_list, many=True)
return Response(ser.data) def post(self, request):
ser = UserSerializer(data=request.data)
if ser.is_valid():
ser.save()
return Response({'code': 100, 'msg': "新增成功"}, status=201)
else:
return Response({'code': 101, 'msg': ser.errors}) class UserDetailView(APIView):
def get(self, request, pk):
obj = User.objects.filter(pk=pk).first()
ser = UserSerializer(instance=obj)
return Response(ser.data) def put(self, request, pk):
obj = User.objects.filter(pk=pk).first()
ser = UserSerializer(instance=obj, data=request.data)
if ser.is_valid():
ser.save()
return Response({'code': 100, 'msg': "修改成功"}, status=201)
else:
return Response({'code': 101, 'msg': ser.errors}) def delete(self, request, pk):
User.objects.filter(pk=pk).delete()
return Response('')

基于GenericAPIView写5个接口

class UserView(GenericAPIView):
# 配置两个 类属性
queryset = User.objects.all()
serializer_class = UserSerializer # def get_queryset(self):
# if self.request.method=='GET':
# return User.objects.all()
# else:
# return Publish.object.all() def get(self, request):
res_list = self.get_queryset() # 提高扩展性
ser = self.get_serializer(instance=res_list, many=True)
return Response(ser.data) def post(self, request):
ser = self.get_serializer(data=request.data)
if ser.is_valid():
ser.save()
return Response({'code': 100, 'msg': "新增成功"}, status=201)
else:
return Response({'code': 101, 'msg': ser.errors}) class UserDetailView(GenericAPIView):
queryset = User.objects.all()
serializer_class = UserSerializer def get(self, request, pk):
# obj = self.get_queryset().filter(pk=pk).first()
# queryset.get({'pk':'有名分组分出来的'}
obj = self.get_object() # 根据传入的pk,获取一条数据
ser = self.get_serializer(instance=obj)
return Response(ser.data) def put(self, request, pk):
obj = self.get_object()
ser = self.get_serializer(instance=obj, data=request.data)
if ser.is_valid():
ser.save()
return Response({'code': 100, 'msg': "修改成功"}, status=201)
else:
return Response({'code': 101, 'msg': ser.errors}) def delete(self, request, pk):
self.get_queryset().filter(pk=pk).delete()
return Response('')

5个视图扩展类

五个视图扩展类必须配合GenericAPIView使用,不能与APIView配合使用

  • 五个视图扩展类导入的模块

    视图拓展类导入的模块 作用
    CreateModelMixin 写了一个Create方法,就是原来咱们post中的代码
    RetrieveModelMixin 写了一个retrieve方法,就是咱们原来的get中的代码
    UpdateModelMixin 写了一个update方法,就是咱们原来的put中的代码
    DestroyModelMixin 写了一个destroy方法,就是原来咱们的delete中的代码
    ListModelMixin 写了一个list方法,就是原来咱们的get中的代码

  • 视图py文件

    class UserView(GenericAPIView, ListModelMixin, CreateModelMixin):
    # 配置两个 类属性
    queryset = User.objects.all()
    serializer_class = UserSerializer def get(self, request, *args, **kwargs):
    return self.list(request, *args, **kwargs) def post(self, request, *args, **kwargs):
    return self.create(request, *args, **kwargs) class UserDetailView(GenericAPIView, RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin):
    queryset = User.objects.all()
    serializer_class = UserSerializer def get(self,request, *args, **kwargs):
    return self.retrieve(request, *args, **kwargs) def put(self, request, *args,**kwargs):
    return self.update(request,*args,**kwargs) def delete(self, request, *args,**kwargs):
    return self.destroy(request,*args,**kwargs)

9个视图子类

视图子类就是相当于视图类继承GenericAPIView+某个或某几个视图扩展类

使用rest_framework.generics可调用九个视图子类

  • 一共有九个视图子类

    视图子类 继承类 作用
    CreateAPIView CreateModelMixin,
    GenericAPIView
    有post方法,新增数据
    DestroyAPIView DestroyModelMixin,
    GenericAPIView
    有delete方法,删除数据
    ListAPIView ListModelMixin,
    GenericAPIView
    有get方法获取所有
    UpdateAPIView UpdateModelMixin,
    GenericAPIView
    有put和patch方法,修改数据
    RetrieveAPIView RetrieveModelMixin,
    GenericAPIView
    有get方法,获取一条
    ListCreateAPIView ListModelMixin,
    CreateModelMixin,
    GenericAPIView
    有get获取所有,post方法新增
    RetrieveDestroyAPIView RetrieveModelMixin,
    DestroyModelMixin,
    GenericAPIView
    有get方法获取一条,delete方法删除
    RetrieveUpdateAPIView RetrieveModelMixin,
    UpdateModelMixin,
    GenericAPIView
    有get获取一条,put,patch修改
    RetrieveUpdateDestroyAPIView RetrieveModelMixin,
    UpdateModelMixin,
    DestroyModelMixin,
    GenericAPIView
    有get获取一条,put,patch修改,delete删除
  • 视图类

    from rest_framework.generics import ListAPIView,CreateAPIView,   RetrieveAPIView,DestroyAPIView,UpdateAPIView
    from rest_framework.generics import ListCreateAPIView, RetrieveUpdateDestroyAPIView,RetrieveUpdateAPIView,RetrieveDestroyAPIView
    # 正常来讲 Destroy+Update 应该有一个 ,作者没加
    class UserView(ListCreateAPIView):
    # 配置两个 类属性
    queryset = User.objects.all()
    serializer_class = UserSerializer
    class UserDetailView(RetrieveUpdateDestroyAPIView):
    queryset = User.objects.all()
    serializer_class = UserSerializer

视图集

常用的视图集父类

  • ViewSet

    ​ 继承自APIViewViewSetMixin,作用也与APIView基本类似,提供了身份认证、权限校验、流量管理等

    ViewSet主要通过继承ViewSetMixin来实现在调用as_view()时传入字典(如{‘get’:’list’})的映射处理工作。

  • GenericViewSet

    使用ViewSet通常并不方便,因为list、retrieve、create、update、destory等方法都需要自己编写

    可以通过继承Mixin扩展类来复用这些方法而无需自己编写,前提是需要继承GenericAPIView

    GenericViewSet就帮助我们完成了这样的继承工作,继承自GenericAPIViewViewSetMixin,在实现了调用as_view()时传入字典(如{'get':'list'})的映射处理工作的同时,还提供了GenericAPIView提供的基础方法,可以直接搭配Mixin扩展类使用

  • ModelViewSet

    ​ 继承自GenericViewSet,同时包括了ListModelMixin、RetrieveModelMixin、CreateModelMixin、UpdateModelMixin、DestoryModelMixin。

  • ReadOnlyModelViewSet

    ​ 继承自GenericViewSet,同时包括了ListModelMixin、RetrieveModelMixin。

继承ModelViewSet编写五个接口

## 视图类
from rest_framework.viewsets import ModelViewSet,ReadOnlyModelViewSet
class UserView(ModelViewSet):
queryset = User.objects.all()
serializer_class = UserSerializer ## 路由
path('user/', views.UserView.as_view({'get': 'list', 'post': 'create'})),
path('user/<int:pk>', views.UserView.as_view({'get': 'retrieve', 'put': 'update', 'delete': 'destroy'})),

源码分析ViewSetMixin

@classonlymethod
def as_view(cls, actions=None, **initkwargs):
# 路由中as_view中必须传参数,必须传字典:{'get': 'list', 'post': 'create'}
if not actions:
raise TypeError("The `actions` argument must be provided when "
"calling `.as_view()` on a ViewSet. For example "
"`.as_view({'get': 'list'})`")
# 路由匹配成功,执行view(request),request是老的request
def view(request, *args, **kwargs):
# actions={'get': 'list', 'post': 'create'}
for method, action in actions.items():
# method:get action:list
# self 是视图类的对象中通过反射,查找list,
# handler视图类中的list方法
handler = getattr(self, action)
# 向视图类的对象中,反射 method:get,handler:list方法
# self.get=list
setattr(self, method, handler)
return self.dispatch(request, *args, **kwargs)
return csrf_exempt(view) # 只要继承了ViewSetMixin,以后路由写法变了,都要写成:views.UserView.as_view({'get': 'list', 'post': 'create'}))这种格式
# 这样写好以后,对应的请求方式来了,就会执行配置的方法

以后只要继承了ViewSetMixin,视图类中可以写任意名字的方法,不用非得写get,post,delete

  • 视图类

    from rest_framework.viewsets import ModelViewSet,ReadOnlyModelViewSet
    class StudentModelViewSet(ModelViewSet):
    queryset = Student.objects.all()
    serializer_class = StudentModelSerializer def login(self,request):
    return Response({"message":"登录成功"})
  • 路由

    urlpatterns = [
    path("stu/login/",views.StudentModelViewSet.as_view({"get":"login"}))
    ]

drf视图组件思维导图

 

DRF_视图类的更多相关文章

  1. Cocoa编程中视图控制器与视图类详解

    iPhone编程规则是:一个窗口,多个视图.UIView是iPhone屏幕上很多控件的基础类.每个iPhone用户界面都是由显示在UIWindow(这其实也是个特殊的UIView)内的众多UIView ...

  2. iOS CoCoa编程中视图控制器与视图类(转)

    分类: iPhone2012-05-28 11:19 837人阅读 评论(0) 收藏 举报 cocoa编程iosuinavigationcontrolleruiviewiphone iPhone编程规 ...

  3. Navicat Win 和 Mac 视图类快捷键对比

    Navicat 查询是根据用户需求从数据库提取可读格式的数据,Navicat 提供两个强大的工具与 SQL 查询工作:查询创建工具和查询编辑器,查询创建工具可视觉化地创建查询,查询编辑器可直接编辑查询 ...

  4. DRF之视图类(mixin)源码解析

     同样的增删改查操作,如果我们还像之前序列化组件那样做,代码重复率过多,所以我们用视图表示: 具体源码实现:首先定义一个视图类,然后根据mixin点进去有五个封装好的方法,这五个方法共有的属性就是都需 ...

  5. WorldWind源码剖析系列:插件列表视图类PluginListView和插件列表视图项类PluginListItem

    WorldWind中的插件类是个庞大的类,可以说从软件设计层面上统筹可扩展的插件体系的设计思想是WorldWind中的精华,值得学习和借鉴.插件体系中的所用到的类可以分为两大类,一类是插件类Plugi ...

  6. 关于在MFC的视图类里面添加各种控件 以及给这些控件添加对用的函数。2015-03-24 13:46:00

    首先我们把题目所示的要求分为两个问题: 问题一:如何给基于MFC的单文档视图类里面添加 控件.就是那种类似工具箱里面的控件. 问题二:如何给已经添加的控件 定义一些消息的响应函数. ××××××××× ...

  7. drf04 drf视图类

    REST framework 提供了众多的通用视图基类与扩展类,以简化视图的编写. 1.2个视图基类 1.1. APIView rest_framework.views.APIView APIView ...

  8. drf之视图类与路由

    视图 Django REST framwork 提供的视图的主要作用: 控制序列化器的执行(检验.保存.转换数据) 控制数据库查询的执行 2个视图基类 APIView rest_framework.v ...

  9. FlaskCBV视图类

    路由视图类 from flask import Flask app = Flask(name) 视图类 Views文件 看views源码 继承最后一个类 导入CBV的视图基类 from flask i ...

  10. flask框架(四)——flask CBV视图类解析

    CBV视图类的两种基本写法 #第一种写法class IndexView(views.View): methods = ['GET'] decorators = [auth, ] def dispatc ...

随机推荐

  1. .NET在单台Windows2008下百万TCP连接测试

    测试客户端: 客户端程序建立TCP连接,发送一条几个字节的数据. 虚拟机8台,PC机8台,服务器1台. 设置MaxUserPort=60000,有一台机没有设置约在1.5万左右.最后因为差一点到100 ...

  2. three.js基础用法

    import * as THREE from '../libs/build/three.module.js'; import { OrbitControls } from '../libs/jsm/c ...

  3. react native 上传图片(后面有空写一个,完整的案例)

    图片上传的思路很正确 https://www.jianshu.com/p/c9f030fa6754 1. 获取图片路径 利用react-native-image-crop-pick 从手机中获得图片的 ...

  4. Excel Vlookup用法和常见报错#REF! #Value!

    VLOOKUP(E2,$A$2:$C$5,2,FALSE) E2 为选中查找的条件 $A$2:$C$5 1为需要查找的区域,这个区域一般是固定的,所以要加上$符号 2这个区域可以在前面加上SHEET2 ...

  5. Linux常用指令1

    1.文件和目录的相关指令: ·cd:打开 ·pwd:查看当前所在的目录 ·mkdir:新建目录 ·rmdir:删除目录 ·ls:文件和目录查看 ·cp:复制 ·rm:删除 ·mv:移动 2.文本文件内 ...

  6. mySql查询-系统公告发布接收人情况

    -- display_name NZ分部所有用户SELECT user_code,display_name FROM scy_user WHERE ou_id=1627 AND is_deleted= ...

  7. 题目集4~6的总结性Blog

    题目集4~6的总结性Blog (1)前言 在这三次作业中,主要考察了正则表达式以及类间的关系.在这三次作业中,相比之下,第四次以及第五次作业的难度明显高于第六次作业,题量与难度相较于以往的作业也有明显 ...

  8. 2021/9/26 Leetcode 两数之和

    题目:给你两个整数 a 和 b ,不使用 运算符 + 和 - ​​​​​​​,计算并返回两整数之和. int getSum(int a, int b) { while(b != 0){ unsigne ...

  9. 解决ESP8266反复启动问题

    ESP8266刷不同固件后,有时会出现反复启动的问题,可能是FLASH里有未擦除干净的区域. 使用乐鑫 Flash 下载工具擦除 选好串口后点击erase擦除,即可正常使用

  10. Mac下如何使用EVE-NG的telnet客户端和wireshark抓包

    当我没有安装SecureCRT,点击启动的设备,弹出使用终端打开,但是由于eve中telnet使用的url是telnet xx.xx.xx.xx:xxxx 的形式,其在终端app中不能正常工作,tel ...