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

Django系列教程(8)——函数视图及通用类视图

目录

什么是视图(View)及其工作原理

接近现实的函数视图

更复杂的案例: 视图处理用户提交的数据

基于函数的视图和基于类的视图

Django通用类视图

a. ListView

b. DetailView

c. CreateView

d. UpdateView

e. FormView

f. DeleteView

小结


Django的视图(view)是处理业务逻辑的核心,它负责处理用户的请求并返回响应数据。Django提供了两种编写视图的方式:基于函数的视图和基于类的视图。本章会详细介绍如何编写视图以及如何使用Django提供的通用类视图。

什么是视图(View)及其工作原理

Django的Web开发也遵循经典软件设计MVC模式开发的。View (视图) 主要根据用户的请求返回数据,用来展示用户可以看到的内容(比如网页,图片),也可以用来处理用户提交的数据,比如保存到数据库中。Django的视图(views.py)通常和URL路由(URLconf)一起工作的。服务器在收到用户通过浏览器发来的请求后,会根据用户请求的url地址和urls.py里配置的url-视图映射关系,去执行相应视图函数或视图类,从而返回给客户端响应数据。

我们先看一个最简单的函数视图。当用户发来一个请求request时,我们通过HttpResponse打印出Hello, World!

# views.py
from django.http import HttpResponsedef index(request):return HttpResponse("Hello, World!")

提示:每个视图函数的第一个默认参数都必需是request, 它是一个全局变量。Django把每个用户请求封装成了request对象,它包含里当前请求的所有信息,比如请求路径request.path, 当前用户request.user以及用户通过POST提交的数据request.POST

上面例子过于简单。在实际Web开发过程中,我们的View不仅要负责从数据库读写数据,还需要指定显示内容的模板,并提供模板渲染页面所需的内容对象(context object)。接下来我们要看一个更接近现实的案例。

接近现实的函数视图

我们依然以blog为例,需要编写两个视图函数,一个用于展示文章列表,一个用于展示文章详情,你的urls.pyviews.py正常情况下应如下所示:

# blog/urls.py
from django.urls import path
from . import viewsurlpatterns = [path('blog/', views.index, name='index'),path('blog/articles/<int:id>/', views.article_detail, name='article_detail'),
]# blog/views.py
from django.shortcuts import render, get_object_or_404
from .models import Article# 展示所有文章
def index(request):latest_articles = Article.objects.all().order_by('-pub_date')return render(request, 'blog/article_list.html', {"latest_articles": latest_articles})# 展示所有文章
def article_detail(request, id):article = get_object_or_404(Article, pk=id)return render(request, 'blog/article_detail.html', {"article": article})

那么上面这段代码是如何工作的呢?

  • 当用户在浏览器输入/blog/时,URL收到请求后会调用视图views.py里的index函数,展示所有文章。
  • 当用户在浏览器输入/blog/article/5/时,URL不仅调用了views.py里的article_detail函数,而且还把参数文章id通过<int:id>括号的形式传递给了视图里的article_detail函数。。
  • views.py里的index函数先提取要展示的数据对象列表latest_articles, 然后通过render方法传递给模板blog/article_list.html.。
  • views.py里的article_detail方法先通过get_object_or_404方法和id调取某篇具体的文章对象article,然后通过render方法传递给模板blog/article_detail.html显示。

在本例中,我们使用了视图函数里常用的2个便捷方法render()get_object_or_404()

  • render方法有4个参数。第一个是request, 第二个是模板的名称和位置,第三个是需要传递给模板的内容, 也被称为context object。第四个参数是可选参数content_type(内容类型), 我们什么也没写。
  • get_object_or_404方法第一个参数是模型Models或数据集queryset的名字,第二个参数是需要满足的条件(比如pk = id, title = ‘python’)。当需要获取的对象不存在时,给方法会自动返回Http 404错误。

下图是模板的代码。模板可以直接调用通过视图传递过来的内容。

# blog/article_list.html{% block content %}
{% for article in latest_articles %}{{ article.title }}{{ article.pub_date }}
{% endfor %}
{% endblock %}# blog/article_detail.html
{% block content %}{{ article.title }}{{ article.pub_date }}{{ article.body }}
{% endblock %}

更复杂的案例: 视图处理用户提交的数据

视图View不仅用于确定给客户展示什么内容,以什么形式展示,而且也用来处理用户通过表单提交的数据。我们再来看两个创建和修改文章的视图函数article_createarticle_update,看看它们是如何处理用户通过表单POST提交过来的数据。

 from django.shortcuts import render, redirect, get_object_or_404from django.urls import reversefrom .models import Articlefrom .forms import ArticleForm# 创建文章def article_create(request):# 如果用户通过POST提交,通过request.POST获取提交数据if request.method == "POST":# 将用户提交数据与ArticleForm表单绑定form = ArticleForm(request.POST)# 表单验证,如果表单有效,将数据存入数据库if form.is_valid():form.save()# 创建成功,跳转到文章列表return redirect(reverse("blog:article_list"))else:# 否则空表单form = ArticleForm()return render(request, "blog/article_form.html", { "form": form, })# 更新文章def article_update(request, pk):# 从url里获取单篇文章的id值,然后查询数据库获得单个对象实例article = get_object_or_404(Article, pk=id)# 如果用户通过POST提交,通过request.POST获取提交数据if request.method == 'POST':# 将用户提交数据与ArticleForm表单绑定,进行验证form = ArticleForm(instance=article, data=request.POST)if form.is_valid():form.save()# 更新成功,跳转到文章详情return redirect(reverse("blog:article_detail", args=[pk,]))else:# 否则用实例生成表单form = ArticleForm(instance=article)return render(request, "blog/article_form.html", { "form": form, "object": article})

我们给每一行代码添加了说明。值得一提的是在创建和更新文章时我们向模板传递了form这个变量,模板会根据我们自定义的Form类自动生成表单。我们还使用了自定义的Form类对用户提交的数据(request.POST)进行验证,并将通过验证的数据存入数据库。

这里所使用ArticleForm实际上是非常简单的,仅包含了titlebody两个字段。

#blog/forms.py
from .models import Article
from django import formsclass ArticleForm(forms.ModelForm):class Meta:model = Articlefields = ['title', 'body']

基于函数的视图和基于类的视图

Django提供了两种编写视图的方式: 基于函数的视图(Function Base View, FBV)和基于类的视图(Class Based View, CBV)。前面案例中的indexarticle_detailarticle_update的方法都是基于函数的视图。函数视图的优点是比较直接,容易读者理解, 缺点是不便于继承和重用。

基于类的视图以class定义,而不是函数视图的def定义。使用类视图后可以将视图对应的不同请求方式以类中的不同方法来区别定义(get方法处理GET请求,post方法处理POST请求),相对于函数视图逻辑更清晰,代码也有更高的复用性。

from django.views.generic import Viewclass MyClassView(View):"""类视图"""def get(self, request):"""处理GET请求"""return render(request, 'register.html')def post(self, request):"""处理POST请求"""return ...

注意:在URL配置文件中使用类视图时,需要使用as_view()将其伪装成方法:

# blog/urls.py
from django.urls import path, re_path
from . import viewsurlpatterns = [path('', views.MyClassView.as_view()),
]

Django通用类视图

在实际Web开发过程中,我们对不同的数据或模型总是反复进行以下同样的操作,使用通用的类视图可以大大简化我们的代码量。

  • 展示对象列表(比如所有用户,所有文章)
  • 查看某个对象的详细信息(比如用户资料,比如文章详情)
  • 通过表单创建某个对象(比如创建用户,新建文章)
  • 通过表单更新某个对象信息(比如修改密码,修改文字内容)
  • 用户填写表单提交后转到某个完成页面
  • 删除某个对象

Django提供了很多通用的基于类的视图,来帮我们简化视图的编写。这些View与上述操作的对应关系如下:

  • 展示对象列表(比如所有用户,所有文章)- ListView

  • 展示某个对象的详细信息(比如用户资料,比如文章详情) - DetailView

  • 通过表单创建某个对象(比如创建用户,新建文章)- CreateView

  • 通过表单更新某个对象信息(比如修改密码,修改文字内容)- UpdateView

  • 用户填写表单后转到某个完成页面 - FormView

  • 删除某个对象 - DeleteView

上述常用通用视图一共有6个,前2个属于展示类视图(Display view), 后面4个属于编辑类视图(Edit view)。下面我们就来看下这些通用视图是如何工作的,如何简化我们代码的。

注意:如果你要使用Edit view,请务必在模型里里定义get_absolute_url()方法,否则会出现错误。这是因为通用视图在对一个对象完成编辑后,需要一个返回链接。get_absolute_url()可以为某个对象生成独一无二的url。

a. ListView

ListView用来展示一个对象的列表。它只需要一个参数模型名称即可。比如我们希望展示所有文章列表,我们的views.py可以简化为:

# Create your views here.
from django.views.generic import ListView
from .models import Articleclass IndexView(ListView):model = Article

上述代码等同于:

# 展示所有文章
def index(request):queryset = Article.objects.all()return render(request, 'blog/article_list.html', {"article_list": queryset})

尽管我们只写了一行model = ArticleListView实际上在背后做了很多事情:

  • 提取了需要显示的对象列表或数据集queryset: Article.objects.all()
  • 指定了用来显示对象列表的模板名称: 默认app_name/model_name_list.html, 即blog/article_list.html.
  • 指定了内容对象名称(context object name):默认值object_list

你或许已经注意到了2个问题:需要显示的文章对象列表并没有按发布时间逆序排列,默认内容对象名称object_list也不友好。或许你也不喜欢默认的模板名字,还希望通过这个视图给模板传递额外的内容(比如现在的时间)。你可以轻易地通过重写querysettemplate_namecontext_object_name来完成ListView的自定义。

如果你还需要传递模型以外的内容,比如现在的时间,你还可以通过重写get_context_data方法传递额外的参数或内容。

# Create your views here.
from django.views.generic import ListView
from .models import Article
from django.utils import timezoneclass IndexView(ListView):queryset = Article.objects.all().order_by("-pub_date")template_name = 'blog/article_list.html'context_object_name = 'latest_articles'def get_context_data(self, **kwargs):context = super().get_context_data(**kwargs)context['now'] = timezone.now()return context

如果上述的queryset还不能满足你的要求,比如你希望一个用户只看到自己发表的文章清单,你可以通过更具体的get_queryset()方法来返回一个需要显示的对象列表。

# Create your views here.
from django.views.generic import ListView
from .models import Article
from django.utils import timezoneclass IndexView(ListView):template_name = 'blog/article_list.html'context_object_name = 'latest_articles'def get_queryset(self):return Article.objects.filter(author=self.request.user).order_by('-pub_date')def get_context_data(self, **kwargs):context = super().get_context_data(**kwargs)context['now'] = timezone.now()return context

b. DetailView

DetailView用来展示一个具体对象的详细信息。它需要URL传递某个对象的具体参数(如id, pk, slug值)。本例中用来展示某篇文章详细内容的view可以简写为:

# Create your views here.
from django.views.generic import DetailView
from .models import Articleclass ArticleDetailView(DetailView):model = Article

DetailView默认的模板是app/model_name_detail.html,默认的内容对象名字context_object_name是model_name。本例中默认模板是blog/article_detail.html, 默认对象名字是article, 在模板里可通过 ``获取文章标题。

你同样可以通过重写querysettemplate_namecontext_object_name来完成DetailView的自定义。你还可以通过重写get_context_data方法传递额外的参数或内容。如果你指定了queryset, 那么返回的object是queryset.get(pk = id), 而不是model.objects.get(pk = id)。

# Create your views here.
from django.views.generic import ListView,DetailView
from .models import Article
from django.utils import timezoneclass ArticleDetailView(DetailView):queryset = Article.objects.all().order_by("-pub_date") # 一般不写template_name = 'blog/article_detail.html'context_object_name = 'article'def get_context_data(self, **kwargs):context = super().get_context_data(**kwargs)context['now'] = timezone.now()return context

c. CreateView

CreateView一般通过某个表单创建某个对象,通常完成后会转到对象列表。比如一个最简单的文章创建CreateView可以写成:

from django.views.generic.edit import CreateView
from .models import Articleclass ArticleCreateView(CreateView):model = Articlefields = ['title', 'body',]

CreateView默认的模板是model_name_form.html, 即article_form.html。这里CreateView还会根据fields自动生成表单字段。默认的context_object_name是form。模板代码如下图所示:

# blog/article_form.html<form method="post">{% csrf_token %}{{ form.as_p }}<input type="submit" value="Save" />
</form>

如果你不想使用默认的模板和默认的表单,你可以通过重写template_nameform_class来完成CreateView的自定义。

对于CreateView, 重写它的form_valid方法不是必需,但很有用。当用户提交的数据是有效的时候,执行该方法。你可以通过定义此方法做些别的事情,比如发送邮件,存取额外的数据。

from django.views.generic.edit import CreateView
from .models import Article
from .forms import ArticleCreateFormclass ArticleCreateView(CreateView):model = Articletemplate_name = 'blog/article_create_form.html'form_class = ArticleCreateFormdef form_valid(self, form):form.do_sth()return super(ArticleCreateView, self).form_valid(form)

form_valid方法一个常见用途就是就是将创建对象的用户与model里的user结合(需要用户先登录再提交)。见下面例子。

from django.contrib.auth.mixins import LoginRequiredMixin
from django.views.generic.edit import CreateView
from .models import Articleclass ArticleCreate(LoginRequiredMixin, CreateView):model = Articlefields = ['title', 'body']def form_valid(self, form):form.instance.author = self.request.userreturn super().form_valid(form)

d. UpdateView

UpdateView一般通过某个表单更新现有对象的信息,更新完成后会转到对象详细信息页面。它需要URL提供访问某个对象的具体参数(如pk, slug值)。比如一个最简单的文章更新的UpdateView如下所示。

from django.views.generic.edit import UpdateView
from .models import Articleclass ArticleUpdateView(UpdateView):model = Articlefields = ['title', 'body',]

UpdateView和CreateView很类似,比如默认模板都是model_name_form.html, 因此它们可以共用一个模板。但是区别有两点:

  • CreateView显示的表单是空表单,UpdateView中的表单会显示现有对象的数据。
  • 用户提交表单后,CreateView转向对象列表,UpdateView转向对象详细信息页面。

你可以通过重写template_nameform_class来完成UpdateView的自定义。

  • 本例中默认的模板是article_form.html, 你可以改为article_update_form.html
  • 虽然form_valid方法不是必需,但很有用。当用户提交的数据是有效的时候,你可以通过定义此方法做些别的事情,比如发送邮件,存取额外的数据。
from django.views.generic.edit import UpdateView
from .models import Article
from .forms import ArticleUpdateFormclass ArticleUpdateView(UpdateView):model = Articletemplate_name = 'blog/article_update_form.html'form_class = ArticleUpdateFormdef form_valid(self, form):form.do_sth()return super(ArticleUpdateView, self).form_valid(form)

另一个进行UpdateView的常用自定义方法是get_object方法。比如你希望一个用户只能编辑自己发表的文章对象。当一个用户尝试编辑别人的文章时,返回http 404错误。这时候你可以通过更具体的get_object()方法来返回一个更具体的对象。代码如下:

from django.views.generic.edit import UpdateView
from .models import Article
from .forms import ArticleUpdateFormclass ArticleUpdateView(UpdateView):model = Articletemplate_name = 'blog/article_update_form.html'form_class = ArticleUpdateFormdef get_object(self, queryset=None):obj = super().get_object(queryset=queryset)if obj.author != self.request.user:raise Http404()return obj

e. FormView

FormView一般用来展示某个表单,而不是用于创建或更新某个模型对象。当用户输入信息未通过表单验证,显示错误信息。当用户输入信息通过表单验证提交后,跳到其它页面。使用FormView一般需要定义template_nameform_classsuccess_url.

见下面代码。

# views.py - Use FormView
from myapp.forms import ContactForm
from django.views.generic.edit import FormViewclass ContactView(FormView):template_name = 'contact.html'form_class = ContactFormsuccess_url = '/thanks/'def form_valid(self, form):# This method is called when valid form data has been POSTed.# It should return an HttpResponse.form.send_email()return super().form_valid(form)

f. DeleteView

DeleteView一般用来删除某个具体对象。它要求用户点击确认后再删除一个对象。使用这个通用视图,你需要定义模型的名称model和成功删除对象后的返回的URL。默认模板是myapp/model_confirm_delete.html。默认内容对象名字是model_name。本例中为article。

本例使用了默认的模板blog/article_confirm_delete.html,删除文章后通过reverse_lazy方法返回到index页面。

from django.urls import reverse_lazy
from django.views.generic.edit import DeleteView
from .models import Articleclass ArticleDelete(DeleteView):model = Articlesuccess_url = reverse_lazy('index')

模板内容如下:

# blog/article_confirm_delete.html<form method="post">{% csrf_token %}<p>Are you sure you want to delete "{{ article }}"?</p><input type="submit" value="Confirm" />
</form>

小结

本章我们详细介绍了Django的视图(View)是如何工作的,并展示了如何使用基于函数的视图和通用类视图(ListViewDetailViewCreateViewUpdateViewDeleteView)编写基本的增删改查视图。在Django进阶部分我们将介绍更多视图编写技巧。下章我们将讲解模板语言, 常见的模板标签和过滤器以及如何正确配置模板文件。

相关文章:

Django系列教程(8)——函数视图及通用类视图

目录 什么是视图(View)及其工作原理 接近现实的函数视图 更复杂的案例: 视图处理用户提交的数据 基于函数的视图和基于类的视图 Django通用类视图 a. ListView b. DetailView c. CreateView d. UpdateView e. FormView f. DeleteView 小结 Django的视图(view)是处理…...

【C#学习笔记04】C语言格式化输出

引言 ​​printf()​​函数不仅可以将数据输出到控制台&#xff0c;还可以通过格式化字符串灵活地控制输出的格式。​​printf()​​​函数的使用规则&#xff0c;包括标志说明、字段宽度、转换精度、长度修饰、转换说明、转义字符。 1. ​​printf()​​函数概述 ​​printf…...

九点标定和十二点标定的区别

九点标定和十二点标定是机器视觉中常用的两种手眼标定方法&#xff0c;用于建立图像坐标系与机械坐标系之间的映射关系。它们的核心区别在于标定点的数量、变换模型和适用场景。以下是详细对比&#xff1a; 1. 九点标定 特点 标定点数量&#xff1a;9 个点&#xff0c;通常排…...

qt+opengl 播放yuv视频

一、实现效果 二、pro文件 Qt widgets opengl 三、主要代码 #include "glwidget.h"GLWidget::GLWidget(QWidget *parent) : QOpenGLWidget(parent) {connect(&m_timer, &QTimer::timeout, this,[&](){this->update();});m_timer.start(1000/33); }v…...

【揭秘测绘艺术】从基础到法律,绘制地球的智慧蓝图

在人类探索与塑造世界的征途中&#xff0c;有一门古老而又现代的科学默默发挥着基石作用——测绘。它不仅仅是地图的绘制&#xff0c;更是对地球空间信息的精准捕捉与智慧应用。今天&#xff0c;让我们一起走进测绘的世界&#xff0c;解码“测绘”与“基础测绘”的内涵&#xf…...

基于DeepSeek×MWORKS 2025a的ROM Builder自动化降阶实战

一、引言 当前&#xff0c;工业仿真领域正经历着前所未有的「智能焦虑」——当自动驾驶算法已能理解城市路网&#xff0c;当大模型开始设计蛋白质结构&#xff0c;这个驱动大国重器研发的核心领域&#xff0c;却仍在与千万级方程组成的庞杂模型艰难博弈。传统仿真降阶如同在数…...

NetAssist 5.0.14网络助手基础使用及自动应答使用方案

以下是NetAssist v5.0.14自动应答功能的详细使用步骤&#xff1a; 一、基础准备&#xff1a; 工具下载网址页面&#xff1a;https://www.cmsoft.cn/resource/102.html 下载安装好后&#xff0c;根据需要可以创建多个server&#xff0c;双击程序图标运行即可&#xff0c;下面…...

MySQL中有哪几种锁?

大家好&#xff0c;我是锋哥。今天分享关于【MySQL中有哪几种锁&#xff1f;】面试题。希望对大家有帮助&#xff1b; MySQL中有哪几种锁&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在MySQL中&#xff0c;锁是用来控制并发访问的机制&#xff0c;确…...

vue2的webpack(vue.config.js) 怎么使用请求转发 devServer.proxy

首先用 express 搭建后端服务器&#xff0c;注意使用中间件解析json格式的请求体&#xff0c;才会获取到 post 参数 app.use(express.json()); app.js const express require(express) const app express() app.use(express.json()); const port 3000app.post(/api/vue2, …...

【开源+代码解读】Search-R1:基于强化学习的检索增强大语言模型框架3小时即可打造个人AI-search

大语言模型(LLMs)在处理复杂推理和实时信息检索时面临两大挑战:知识局限性(无法获取最新外部知识)和检索灵活性不足(传统方法依赖固定检索流程)。现有方法如检索增强生成(RAG)和工具调用(Tool-Use)存在以下问题: RAG:单轮检索导致上下文不足,无法适应多轮交互场景…...

CSS中固定定位

1.如何设置为固定定位? 给元素设置position: fixed 即可实现固定定位. 可以使用left, right, top ,bottom 四个属性调整位置 2.固定定位的参考点在哪里? 参考他的视口 视口-->对于PC浏览器来说,视口就是我们看网页的那扇"窗户". 3.固定定位元素的特点 1.脱离文档…...

Kotlin高效实现 Android ViewPager2 顶部导航:动态配置与性能优化指南

高效实现&#xff1a;强调代码的性能优化。Android ViewPager2&#xff1a;明确技术栈。顶部导航&#xff1a;核心功能点。动态配置与性能优化指南&#xff1a;突出动态配置的灵活性和性能优化的重点。 在 Android 开发中&#xff0c;使用 ViewPager2 实现高效的顶部导航&…...

MFCday01、模式对话框

对话框类和应用程序类。 MFC中 Combo Box List Box List Control三种列表控件&#xff0c;日期控件Date Time Picker...

C++ 布尔类型(bool)深度解析

引言 在 C 编程里&#xff0c;布尔类型&#xff08;bool&#xff09;是一种基础且极为关键的数据类型。它专门用于表达逻辑值&#xff0c;在程序的条件判断、循环控制等诸多方面都发挥着重要作用。接下来&#xff0c;我们将对 C 中的布尔类型展开全面且深入的探讨。 一、布尔…...

新鲜速递:OpenAI-Agents-Python:构建智能代理系统的轻量级框架

图片来自于官方README.md 一、什么是OpenAI Agents SDK&#xff1f; OpenAI Agents SDK是一个轻量级但功能强大的框架&#xff0c;专为构建多智能体工作流而设计。作为OpenAI之前实验项目Swarm的生产级升级版本&#xff0c;该SDK提供了极少但高效的抽象概念&#xff0c;使开发…...

单例模式的五种实现方式

1、饿汉式 ①实现&#xff1a;在类加载的时候就初始化实例 ②优点&#xff1a;线程安全 ③缺点&#xff1a;实例在类加载的时候创建&#xff0c;可能会浪费资源 //饿汉式 public class EagerSingleton{private EagerSingleton(){} //私有构造方法private static EagerSingle…...

行为模式---状态模式

概念 状态模式是一种行为模式&#xff0c;用于在内部状态改变的时候改变其行为。它的核心思想就是允许一个对象在其内部状态改变的时候改变它的行为。状态模式通过将对象的状态封装成独立的类&#xff0c;并将其行为委托给当前的状态对象&#xff0c;从而使得对象行为随着状态…...

统一 Elastic 向量数据库与 LLM 功能,实现智能查询

作者&#xff1a;来自 Elastic Sunile Manjee 利用 LLM 功能进行查询解析&#xff0c;并使用 Elasticsearch 搜索模板&#xff0c;将复杂的用户请求转换为结构化的、基于模式的搜索&#xff0c;从而实现高精度查询结果。 想象一下&#xff0c;你在搜索“距离 Belongil Beach 25…...

(Lauterbach调试器学习笔记)一、首次连接TriCore开发板调试

Lauterbach调试器学习笔记 文章目录 Lauterbach调试器学习笔记前言一、Lauterbach调试器介绍二、调试步骤三、常用代码四、不常用代码&#xff0c;但是很有意思总结 前言 第一篇简单记录一下Lauterbach调试器的使用过程&#xff0c;主要是想写第二篇python api。 一、Lauterba…...

HTML星球大冒险之路线图

第一章&#xff1a;欢迎来到 HTML 星球&#xff01; 1.1 宇宙的基石&#xff1a;HTML 是什么&#xff1f; &#x1f30d; 比喻&#xff1a;HTML 是网页世界的「乐高积木」&#xff0c;用标签搭建一切可见内容&#x1f3af; 目标&#xff1a;理解 HTML 的作用&#xff0c;掌握…...

网络安全与七层架构

网络安全与七层架构 随着互联网技术的迅猛发展&#xff0c;网络安全问题日益凸显。网络安全不仅影响到个人用户的信息安全&#xff0c;更是企业及国家安全的重要组成部分。而七层架构&#xff08;OSI模型&#xff09;为网络通信提供了理论支撑&#xff0c;能够有效地帮助我们理…...

2025-03-13 学习记录--C/C++-PTA 练习2-17 生成3的乘方表

合抱之木&#xff0c;生于毫末&#xff1b;九层之台&#xff0c;起于累土&#xff1b;千里之行&#xff0c;始于足下。&#x1f4aa;&#x1f3fb; 一、题目描述 ⭐️ 练习2-17 生成3的乘方表 输入一个非负整数n&#xff0c;生成一张3的乘方表&#xff0c;输出3^0~$$3^n$$的值…...

改进YOLOv8系列,AAAI 2025,多尺度特征提取自注意力模块,全局信息聚合,即插即用!分享

**论文:https://arxiv.org/pdf/2404.07846 **代码地址: https://github.com/nagejacob/TBSN/blob/main/network/tbsn.py 改进YOLOv8系列:多尺度特征提取自注意力模块,全局信息聚合,即插即用!分享 🚀论文研究概括🚀加入到网络中的理论研究🚀需要修改的代码1 🍀🍀…...

我又又又又又又更新了~~纯手工编写C++画图,有注释~~~

再再再次感谢Ttcofee提的问题 本次更新内容&#xff1a; 鼠标图案&#xff08;切换&#xff09;&#xff0c;版本号获取&#xff0c;输入框复制剪切板 提前申明&#xff1a;如果运行不了&#xff0c;请到主页查看RedpandaDevc下载&#xff0c;若还是不行就卸了重装。 版本号&…...

Vue源码深度解析:从2.x到3.x的架构演进与核心原理剖析

Vue源码深度解析&#xff1a;从2.x到3.x的架构演进与核心原理剖析 一、框架演变&#xff1a;从Vue2到Vue3的跨越 1.1 革命性升级 Vue3的发布标志着前端框架进入新纪元&#xff0c;其核心改进体现在三个方面&#xff1a; 性能飞跃&#xff1a;包体积减少41%&#xff0c;初始…...

评委打分5个评委 去掉一个最高分和一个最低分 取平均分

一键替换max用min 按shiftF6 public static int getMin(int[]scores){int min scores[0];for (int i 0; i < scores.length; i) {if(scores[i]> min){min scores[i];}}return min;} 这里有和c/c不一样的知识点 c/c调用函数类似于java的方法,但是c/c的函数调用需要声明…...

javabean类(测试类之外的类)

altinsert快捷键生成构造方法和get、set方法 或者插件ptg&#xff08;连接外网搜索插件并且下载&#xff09;...

C++ 邻接矩阵(代码)

C邻接矩阵代码&#xff0c;见下&#xff1a; #include<iostream>using namespace std;#define inf -1 class Graph{ private:int vertices;int **edges;public:Graph(int vertices);~Graph();void addEdge(int u, int v, int w);void printGraph(); };Graph::Graph(int …...

Cookie与Session详解

Cookie简介 Cookie 是浏览器提供的持久化存储数据的一种机制。是指某些网站为了辨别用户身份、进行会话跟踪而储存在用户本地终端上的数据&#xff08;通常经过加密&#xff09;。以下是关于 Cookie 的详细介绍&#xff1a; Cookie工作原理 当你访问一个网站时&#xff0c;该网…...

OpenBMC:BmcWeb 处理http请求

OpenBMC:BmcWeb 读取http请求头-CSDN博客 介绍了,在读取完http头后,将调用Connection::handle处理http请求 1.Connection::handle void handle() {...req = std::make_shared<crow::Request>(parser->release(), reqEc);...req->session = userSession;accept …...

【算法题解答·六】栈队列堆

【算法题解答六】栈队列堆 接上文【算法方法总结六】栈队列堆的一些技巧和注意事项 栈队列堆相关题目如下&#xff1a; 232.用栈实现队列 简单 准备两个栈&#xff0c;一个负责入队的栈A&#xff0c;一个负责出队的栈B出队和返回队列开头元素&#xff0c;都要先进行以下操作…...

计算机视觉算法实战——手势识别(主页有源码)

✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ ​ ​​​ 1. 领域简介&#xff1a;手势识别的价值与挑战 手势识别是连接人类自然行为与数字世界的核心交互技术&#xff0c;在智能设备控制、…...

JobScheduler省电机制

1.前言 JobScheduler&#xff08;任务调度器&#xff09;是 Android 提供的一种任务调度机制&#xff0c;可以替代传统的 WakeLock 和 Alarm 来执行后台任务。那么&#xff0c;它们之间的区别是什么&#xff1f;JobScheduler 又有哪些特别之处呢&#xff1f; 1.1 WakeLock 和 …...

设计模式学习笔记——命令模式

2025年3月13日&#xff0c;周四下午 相同的保存逻辑在各个组件中重复出现。 且需要修改保存逻辑时&#xff0c;各个组件的保存逻辑都需要进行相应修改。 使用了命令模式把保存逻辑从三个组件中独立出来后&#xff0c;减少了代码冗余。 可以通过“保存命令”来使用保存逻辑&am…...

[TPCTF 2025] crypto 复现两题

周末很忙。比赛都没怎么看。晚上把密码复现两个。 randomized random 这题在小鸡块博客里见过&#xff0c;稍有区别。 # FROM python:3 import random with open("flag.txt","rb") as f:flagf.read() for i in range(2**64):print(random.getrandbits(3…...

电子元器件选型与实战应用—16 怎么选一个合适的MCU芯片?

文章目录 1. 选型要素1.1 价格1.2 技术支持1.3 厂家优势1.4 功耗1.5 特殊功能1.6 统计外设1.7 确定外设占用的内存和flash大小1.8 确定外设通信接口1.9 确定外设通信接口的电平1.10 确定外设的GPIO数量1.11 确定外设的供电和功耗1.12 确定外设GPIO的种类1.13 确定ADC的数量1.14…...

第6关:牛牛鱼缸-附加题

任务描述 本关任务&#xff1a;问题描述&#xff1a;牛牛有一个鱼缸&#xff0c;鱼缸里面已经有n条鱼&#xff0c;每条鱼的大小为fishSizei&#xff0c;牛牛现在想把新捕捉的鱼放入鱼缸。鱼缸里存在着大鱼吃小鱼的定律。经过观察&#xff0c;牛牛发现一条鱼A的大小为另外一条鱼…...

go中间件学习

本博文源于笔者正在学习go中间件&#xff0c;罗列了较为常用的中间件&#xff0c;例如日志记录、认证授权、跨域资源共享、请求体解析、静态文件处理、错误处理、性能分析、速率限制、session 1、日志记录中间件 可以追加打印用&#xff0c;例如&#xff0c;将请求进行打印 …...

若依RuoYi-Cloud-Plus微服务版(完整版)前后端部署

一.目标 在浏览器上成功登录进入 二.源码下载 后端源码&#xff1a;前往Gitee下载页面(https://gitee.com/dromara/RuoYi-Cloud-Plus)下载解压到工作目录。 前端源码&#xff1a; 前往Gitee下载页面(https://gitee.com/JavaLionLi/plus-ui)下载解压到工作目录。 文档地址&a…...

航空电动力系统适航标准要点手册

航空电动力系统适航标准要点手册 1.标准制定背景与必要性1.1 为什么需要制定和遵循标准&#xff1f;1.2 标准制定依据与发布机构 2.关键核心标准概述2.1 电动航空与电推进系统2.2 混合动力系统2.3 硬件与通用要求 3.标准详细解读与应用场景3.1 DO-160G&#xff1a;环境适应性测…...

深入理解JavaScript构造函数与原型链:从原理到最佳实践

一、开篇&#xff1a;为什么需要理解原型链&#xff1f; 在JavaScript开发中&#xff0c;90%以上的"诡异"bug都与原型链机制相关。理解构造函数与原型链的运行原理&#xff0c;不仅能帮助我们写出更优雅的代码&#xff0c;还能在框架源码阅读、性能优化等场景中游刃…...

java每日精进 3.12 【WebSocket进阶】

基于 SpringWebSocket 进行二次封装&#xff0c;实现了更加简单的使用方式。例如说&#xff0c;WebSocket 的认证、Session 的管理、WebSocket 集群的消息广播等等。 1. 用户认证与登录用户信息传递 1.1 Token 过滤器 (TokenAuthenticationFilter) ① 在 WebSocket 连接建立…...

国家网络安全事件应急预案

目 录 1 总则 1.1 编制目的 1.2 编制依据 1.3 适用范围 1.4 事件分级 1.5 工作原则 2 组织机构与职责 2.1 领导机构与职责 2.2 办事机构与职责 2.3 各部门职责 2.4 各省&#xff08;区、市&#xff09;职责 3 监测与预警 3.1 预警分级 3.2 预警监测 3.3 预警研判…...

Markdown:Mermaid 画图

目录 安装基本语法流程图时序图甘特图总结 Mermaid 是一款用于生成流程图、时序图、甘特图等图表的 JavaScript 库。它可以将简单的文本描述转化为美观的图表&#xff0c;方便开发者进行可视化展示。 安装 Mermaid 可以直接在浏览器中使用&#xff0c;也可以在 Node.js 环境中…...

【视频】ffmpeg、Nginx搭建RTMP、HLS服务器

1、源码安装Nginx 1)源码下载 因为要使用Nginx的模块nginx-rtmp-module,所以要下载 nginx 和 nginx-rtmp-module 的源码。 下载地址: http://nginx.org/en/download.html https://github.com/arut/nginx-rtmp-module/tags2)解压、配置 在同一个目录中解压 nginx 和 nginx…...

时间有限,如何精确设计测试用例?5种关键方法

精确设计测试用例能够迅速识别并修复主要缺陷&#xff0c;确保产品质量&#xff0c;降低后期维护成本&#xff0c;并通过专注于核心功能来提升用户体验&#xff0c;为项目的成功奠定坚实基础。若未能精确设计测试用例&#xff0c;可能会导致关键功能测试不充分&#xff0c;使得…...

【算法】图论

⭐️个人主页&#xff1a;小羊 ⭐️所属专栏&#xff1a;Linux 很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~ 目录 持续更新中...1、DFS2、BFSN 叉树的层序遍历二叉树的锯齿形层序遍历二叉树最大宽度 3、多源BFS腐烂的苹果 4、拓扑排序 持续更新中…...

ADQ32 5G采集卡

ADQ32是一款高端12位双通道数据采集板&#xff0c;针对高通量科学应用进行了优化。ADQ32具有以下特性: 一个和两个模拟输入通道包括每通道5和2.5 GSPS7GB/s的持续数据传输速率至GPU7GB/秒的持续数据传输速率两个外部触发器通用输入/输出&#xff08;GPIO&#xff09;开放式FPG…...

机器人领域专业名词汇总

1. 电机与驱动 电机类型 DC Motor&#xff08;直流电机&#xff09;&#xff1a;通过直流电源驱动的电机。Stepper Motor&#xff08;步进电机&#xff09;&#xff1a;通过脉冲信号控制旋转角度的电机。Servo Motor&#xff08;伺服电机&#xff09;&#xff1a;带有反馈控制的…...

拆解 “ES 已死“ 伪命题:Agentic RAG 时代搜索引擎的终极形态

作者&#xff1a;来自 Elastic 李捷 xxx&#xff1a;“ES已死&#xff0c;#%#……” 我&#xff1a;&#xff1f;&#xff1f;&#xff1f; 最近&#xff0c;某厂商发了一堆公关文章&#xff0c;翻来覆去地炒作 “ES 已死”&#xff0c;“放弃 ES”。这哪是什么正经的技术文章&…...