Django与模板
我叫补三补四,很高兴见到大家,欢迎一起学习交流和进步
今天来讲一讲视图
Django与模板文件工作流程
模板引擎:主要参与模板渲染的系统。
内容源:输入的数据流。比较常见的有数据库、XML文件和用户请求这样的网络数据。
模板:一般是和语言相关的文本。
工作流程:
作为一个web框架,Django自带了一套模板系统动态生成HTML文本
模板主要包含两个部分:HTML的静态部分和描述如何插入动态内容的特殊语法
模板系统的相关配置
模板的配置也在settings.py当中实现
TEMPLATES = [ # 模板配置变量{'BACKEND': 'django.template.backends.django.DjangoTemplates', # 配置使用自带模板'DIRS': [ # 配置寻址目录'/var/www/html/site.com','/var/www/html/default',]},{'BACKEND': 'django.template.backends.jinja2.Jinja2', # 配置使用Jinja2模板'DIRS': '/var/www/html/another_app' # 配置寻址路径}]
这段代码是Django框架中用于配置模板引擎的设置。Django是一个高级的Python Web框架,它允许开发者使用Python编写服务器端代码。模板引擎是Django中用于生成HTML页面的工具,它允许开发者将动态内容插入到静态HTML模板中。
代码中的`TEMPLATES`变量是一个列表,包含多个字典,每个字典定义了一组模板配置。这些配置告诉Django如何渲染模板。
下面是代码的详细解释:
1. `TEMPLATES = [ ... ]`:定义了一个名为`TEMPLATES`的列表,其中包含多个模板配置。
2. 第一个字典配置:
• `'BACKEND': 'django.template.backends.django.DjangoTemplates'`:指定使用Django自带的模板引擎。这是Django默认的模板引擎,它基于Python编写。
• `'DIRS': [ ... ]`:定义了一个目录列表,Django会在这些目录中查找模板文件。在这个例子中,Django会在`/var/www/html/site.com`和`/var/www/html/default`这两个目录中查找模板文件。
3. 第二个字典配置:
• `'BACKEND': 'django.template.backends.jinja2.Jinja2'`:指定使用Jinja2模板引擎。Jinja2是一个流行的Python模板引擎,它支持更复杂的模板语法和功能。
• `'DIRS': '/var/www/html/another_app'`:定义了一个单一的目录,Django会在该目录中查找Jinja2模板文件。在这个例子中,Django会在`/var/www/html/another_app`目录中查找模板文件。
通过这种配置,Django项目可以同时使用Django自带的模板引擎和Jinja2模板引擎,从而提供更大的灵活性和选择。开发者可以根据需要选择使用哪种模板引擎,或者在不同的应用中使用不同的模板引擎。
(简单理解BACKEND就是import了一些库)
模板语言
模板引擎可以识别模板中的特殊结构,以动态生成文本。主要的特殊结构有变量和标签。
在进行渲染的时候,模板引擎根据上下文对模板中的变量进行替换,并且根据操作标签来执行操作,输出文本。
Django的模板语言当中包含了四种结构:变量、标签、过滤器和注释
Django模板语言包含四个主要结构:变量、标签、过滤器和注释。
1.变量(Variables)
变量用于在模板中显示来自视图(view)传递的数据。变量通常以双大括号`{{ }}`包裹。例如:
<p>Hello, {{ name }}!</p>
如果`name`的值是`"Alice"`,那么模板渲染后会显示:
<p>Hello, Alice!</p>
2.标签(Tags)
标签用于控制模板的逻辑,例如循环、条件判断、加载外部模板等。标签以`{% %}`包裹。常见的标签包括:
• `{% if %}`:条件判断
• `{% for %}`:循环
• `{% include %}`:加载外部模板
• `{% extends %}`和`{% block %}`:模板继承
例如:
{% if user.is_authenticated %}<p>Welcome, {{ user.username }}!</p>{% else %}<p>Please login.</p>{% endif %}
3.过滤器(Filters)
过滤器用于对变量进行格式化或转换。过滤器通过管道符号`|`应用到变量上。例如:
<p>{{ date|date:"Y-m-d" }}</p>
如果`date`是一个`datetime`对象,过滤器会将其格式化为指定的格式。
Django内置了许多过滤器,如`upper`、`lower`、`truncatewords`等。
4.注释(Comments)
模板注释用于在模板中添加说明性内容,这些内容在渲染时会被忽略。Django模板注释使用`{# #}`包裹。例如:
{# This is a comment in the template #}<p>Hello, {{ name }}!</p>
模板继承
在真实开发环境下,不乏不同网页结构和样式一样的情况,为减少重复,增加可维护性,我们会使用模板继承
具体实现:
在Web开发中,模板继承是一种常见的模式,它允许你创建一个基础模板,然后让其他模板继承这个基础模板的结构,同时能够覆盖或添加特定的内容。这种机制在许多模板引擎中都有实现,比如Django(Python)、Jinja2(Python)、Twig(PHP)等。
实现步骤
1.创建基础模板(base.html)
基础模板定义了页面的通用结构,包括HTML的基本骨架、头部、尾部、导航栏等。你可以在基础模板中定义一些“块”(block),这些块可以在子模板中被覆盖。
<!-- base.html --><!DOCTYPE html><html lang="en"><head><link rel="stylesheet" href="style.css">{% block title %}<title>Default Title</title>{% endblock %}</head><body><div id="sidebar"><ul><li>主页</li><li>帮助</li></ul></div><div id="content">{% block content %}<!-- 默认内容 -->{% endblock %}</div><footer id="footer">我是页脚</footer></body></html>
2.创建子模板并继承基础模板
子模板通过使用`{% extends %}`标签来继承基础模板。然后,子模板可以使用`{% block %}`标签来覆盖基础模板中定义的块。
<!-- home.html -->{% extends "base.html" %}{% block title %}<title>主页</title>{% endblock %}{% block content %}<h1>欢迎来到主页!</h1><p>虽然这个网站什么内容都没有,但是它展示了使用模板继承的用法。</p>{% endblock %}
3.Django视图函数中指定模板
在你的Django视图函数中,你需要指定使用哪个模板来渲染页面。
from django.shortcuts import renderdef home(request):return render(request, 'home.html')
4.模板引擎如何处理继承
当Django的模板引擎处理`home.html`时,它会首先加载`base.html`,然后查找`home.html`中定义的块,并用这些块替换`base.html`中的相应块。最终,模板引擎会生成一个完整的HTML页面,其中包含了基础模板的结构和子模板的特定内容。
在上面代码中,实现继承的关键是extends标签。它告诉模板引擎该模板扩展了另外一个模板。当模板系统渲染主页面时,首先要找到父模板,即base.html文件。在父模板中,引擎会找到两个block标签,然后用子模板中的内容填充这个区域。
多级继承
常见的网站模板继承结构往往是三级的,通常用于提高代码复用性和维护效率。
---
1.第一级模板(基础模板)
第一级模板是整个网站的“骨架”,它定义了网站的整体布局和通用元素。这些元素通常包括:
• 头部(Header):包含网站的logo、导航栏(Navigation Bar)、登录/注册入口等。
• 底部(Footer):包含版权信息、联系方式、网站地图、隐私政策等。
• 侧边栏(Sidebar,可选):用于放置广告、快捷链接或其他辅助信息。
• 主内容区域(Main Content Area):这是页面的核心区域,用于展示具体的内容。第一级模板通常会在这里预留一个占位符(Placeholder),供子模板填充具体内容。
第一级模板的作用是为整个网站提供一个统一的外观和风格,确保所有页面在结构和视觉上保持一致。例如,一个电商网站的头部可能始终显示“首页”“商品分类”“购物车”“我的订单”等导航链接,而底部则包含“关于我们”“售后服务”“联系方式”等通用信息。
---
2.第二级模板(功能分类模板)
第二级模板是对第一级模板的扩展,它专注于网站的某个功能模块或分类。例如:
• 用户中心:包含用户相关的功能,如“我的订单”“我的收藏”“个人信息”“账户设置”等。
• 商品中心:包含商品相关的功能,如“商品分类”“商品列表”“热门商品推荐”“搜索结果”等。
• 帮助中心:包含常见问题解答(FAQ)、联系客服、使用说明等。
第二级模板会继承第一级模板的结构,并在主内容区域填充与该功能模块相关的通用内容。例如,在“用户中心”模板中,主内容区域可能会显示一个用户操作的导航菜单,如:
• 我的订单:显示订单列表。
• 我的收藏:显示收藏的商品列表。
• 个人信息:提供用户信息的编辑表单。
这些内容通常以列表的形式呈现,为第三级模板提供进一步的细化空间。第二级模板的作用是将网站的功能模块化,方便管理和扩展。
---
3.第三级模板(具体页面模板)
第三级模板是具体页面的实现,它继承第二级模板,并在主内容区域填充具体的页面内容。例如:
• 用户详情页面:继承“用户中心”模板,展示用户的详细信息,如头像、昵称、注册时间、积分等。
• 商品详情页面:继承“商品中心”模板,展示商品的详细信息,如商品图片、价格、规格、用户评价、购买按钮等。
• 帮助页面:继承“帮助中心”模板,展示具体的帮助内容,如常见问题的详细解答、联系方式等。
第三级模板的作用是实现具体的功能页面,满足用户的具体需求。它通过继承第二级模板,复用了通用的布局和功能模块,同时通过填充具体的内容,实现了页面的个性化。
---
4.模板继承的实现(以HTML为例)
模板继承可以通过模板引擎(如Django模板、Jinja2等)实现。以下是一个简单的示例:
第一级模板(base.html)
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>{% block title %}My Website{% endblock %}</title></head><body><header><h1>My Website</h1><nav><ul><li>Home</li><li>User Center</li><li>Product Center</li><li>Help</li></ul></nav></header><main>{% block content %}<!-- 主内容区域的占位符 -->{% endblock %}</main><footer><p>© 2025 My Website</p></footer></body></html>
第二级模板(user_center.html)
{% extends "base.html" %}{% block title %}User Center - My Website{% endblock %}{% block content %}<h2>User Center</h2><ul><li>My Orders</li><li>My Favorites</li><li>Profile</li></ul><div>{% block user_content %}<!-- 用户中心的具体内容占位符 -->{% endblock %}</div>{% endblock %}
第三级模板(user_profile.html)
{% extends "user_center.html" %}{% block title %}Profile - User Center - My Website{% endblock %}{% block user_content %}<h3>User Profile</h3><p>Welcome, {{ user.name }}!</p><p>Email: {{ user.email }}</p><p>Registered since: {{ user.register_date }}</p>{% endblock %}
帮助页面的实现
帮助页面的实现可以类似地继承“帮助中心”模板。例如:
• 帮助中心模板(help_center.html)
{% extends "base.html" %}{% block title %}Help Center - My Website{% endblock %}{% block content %}<h2>Help Center</h2><ul><li>FAQ</li><li>Contact Us</li></ul><div>{% block help_content %}<!-- 帮助中心的具体内容占位符 -->{% endblock %}</div>{% endblock %}
• 具体帮助页面(help_faq.html)
{% extends "help_center.html" %}{% block title %}FAQ - Help Center - My Website{% endblock %}{% block help_content %}<h3>Frequently Asked Questions</h3><p>Here are some common questions and answers...</p><!-- 具体的FAQ内容 -->{% endblock %}
---
5.总结
这种三级模板继承结构的优点包括:
• 代码复用性高:通过继承,通用的布局和功能可以在多个页面中复用。
• 维护方便:只需要修改基础模板或功能分类模板,即可更新整个网站的外观或功能模块。
• 扩展性强:可以轻松添加新的功能模块或页面,而无需重新设计整个布局。
这种结构在实际开发中非常常见,尤其是在大型网站或复杂的应用中,能够显著提高开发效率和代码质量。
字符转义
用处
在HTML模板渲染中,如果直接将用户输入的内容(如用户名)插入到HTML中,而没有进行适当的转义或过滤,就可能引发XSS(跨站脚本)攻击。XSS攻击是一种安全漏洞,攻击者通过在用户输入中嵌入恶意代码(如JavaScript脚本),当这些代码被渲染到页面上时,就会在用户的浏览器中执行,从而可能窃取用户信息、篡改页面内容或进行其他恶意操作。
例如:
你好, {{ username }}
如果用户将用户名设置为 <script>alert('一次攻击')</script> ,那么渲染后的HTML就会变成:
你好, <script>alert('一次攻击')</script>
当页面加载时,浏览器会执行这段JavaScript代码,这种攻击方式称之为XSS攻击:
XSS攻击的核心就是攻击者通过某种方式(通常是用户输入)将恶意脚本注入到网页中,然后让这个脚本在其他用户的浏览器中执行。简单来说,就是:
攻击者→输入恶意脚本→网站响应体返回脚本→浏览器执行脚本
我们可以用一个更详细的流程来解释这个过程:
---
1.正常流程
正常情况下,用户输入的内容是安全的,网站会正确处理并显示这些内容。例如:
• 用户输入:`小明`
• 网站处理后显示:`你好,小明`
---
2.XSS攻击的流程
XSS攻击的关键在于攻击者利用了网站对用户输入的处理漏洞,将恶意脚本注入到网页中。具体步骤如下:
步骤1:攻击者输入恶意脚本
攻击者在网站的输入框中输入的不是正常内容,而是一段JavaScript代码。例如:
<script>alert('你被攻击了!')</script>
步骤2:网站将恶意脚本返回到响应体中
如果网站没有对用户输入进行过滤或转义,就会直接将这段恶意代码插入到网页中。例如,网站的欢迎页面会变成:
<p>你好,<script>alert('你被攻击了!')</script></p>
步骤3:浏览器执行恶意脚本
当其他用户访问这个页面时,浏览器会将这段HTML代码解析并渲染到页面上。由于`<script>`标签内的内容是可执行的JavaScript代码,浏览器会自动执行这段代码,从而弹出一个警告框,显示“你被攻击了!”
---
3.关键点:请求体和响应体
• 请求体(Request Body):攻击者通过输入框或其他方式将恶意脚本发送给服务器。这是攻击的“入口”。
• 响应体(Response Body):服务器将用户输入的内容(包括恶意脚本)返回到网页中。这是攻击的“出口”。
XSS攻击的核心就是攻击者通过请求体注入恶意脚本,然后让服务器将这些脚本嵌入到响应体中,最终在其他用户的浏览器中执行。
---
4.XSS攻击的类型
XSS攻击主要有两种类型:
存储型XSS(Stored XSS)
• 特点:恶意脚本被存储在服务器上(如数据库中),每次其他用户访问页面时,都会触发脚本执行。
• 例子:攻击者在论坛发帖时插入恶意脚本,其他用户查看帖子时就会被攻击。
反射型XSS(Reflected XSS)
• 特点:恶意脚本直接通过URL或表单提交到服务器,服务器将脚本反射回页面,用户访问时触发脚本执行。
• 例子:攻击者构造一个带有恶意脚本的链接,用户点击后,脚本会被服务器反射到页面并执行。
Django转义处理
使用Django处理这种问题有两种选择。
(1)对不信任的变量执行escape过滤,这个过滤器会对潜在的危险字符串进行转义。这个方法依赖开发者调用的转义过滤器。鉴于开发者有可能会忘记调用这个过滤器,因此网页有可能还是会被攻击。
(2)使用Django自动对HTML文本进行转义。默认情况下,Django会对模板中变量的输出进行自动转义,这是一个比较理想的处理方式。
具体地说,5个字符串会被自动转义,它们分别如下:“<”变为“<”“>”变为“>”,单引号变为“'”,双引号变为“"”“&”变为“&”。
Django几乎为所有的行为都提供配置,转义自然也不例外。有时候模板变量包含开发者打算作为原始HTML呈现的数据,那么这时可能希望内容不被转义。
要想对单个变量关闭自动转义功能,则可以使用safe过滤器,如下面的模板代码:
这个会转义: {{ data }} 这个不会转义: {{ data|safe }}
另外,也可以控制对模板的自动转义,这时要用到autoescape标签,这个标签用来将要控制的模板包裹起来,例如:
{% autoescape off %}这个不会被自动转义{{ data }}.{% autoescape on %}重新开启自动转义 {{ name }}{% endautoescape %}这个也不会被自动转义 {{ other_data }}{% endautoescape %}
需要注意的是,过滤器是支持字符串作为参数的。这些字符串并不会被自动转义,这背后的思想是模板的作者应该控制文本的内容。因此,开发者应该确保在编写模板时对文本进行正确的转义。
自定义标签和过滤器
自定义标签
自定义标签和和过滤器应该统一放在放在一个文件当中——为此,可以在应用到目录当中创建一个templatetags文件夹:
myapp/
│
├── __init__.py
├── models.py
├── templatetags/
│ ├── __init__.py
│ └── customize.py
├── tests.py
└── views.py
并且将模块放在customize.py当中
完整流程如下:
1. 创建自定义标签库:
• 在你的Django应用目录下(例如`myapp`),创建一个名为`templatetags`的文件夹。
• 在`templatetags`文件夹内,创建一个空的`__init__.py`文件,使其成为一个Python包。
• 在`templatetags`文件夹内,创建一个新的Python文件,比如`customize.py`,这将包含你的自定义标签和过滤器。
2. 编写自定义标签:
• 在`customize.py`文件中,你可以定义自定义标签和过滤器。例如,创建一个简单的标签:
from django import templateregister = template.Library()@register.simple_tagdef hello_name(name):return f"Hello, {name}!"
3. 加载自定义标签:
• 在你的Django模板文件中,使用`{% load %}`标签来加载你的自定义标签库。假设你的自定义标签库位于`myapp/templatetags/`目录下,你可以这样加载它:
{% load customize %}
4. 使用自定义标签:
• 加载标签库后,你可以在模板中使用你定义的标签。例如,使用上面定义的`hello_name`标签:
<p>{% hello_name "Alice" %}</p>
这将在模板中输出:`<p>Hello, Alice!</p>`
在Django中编写自定义过滤器与编写自定义标签类似,但过滤器用于处理模板变量的值。以下是编写自定义过滤器的步骤:
自定义过滤器
1. 创建自定义过滤器库:
• 确保你的Django应用目录下有一个`templatetags`文件夹,并且在该文件夹内有一个`__init__.py`文件。
2. 编写自定义过滤器:
• 在`templatetags`文件夹内,创建一个新的Python文件,比如`customize.py`,这将包含你的自定义过滤器。
3. 定义过滤器:
• 在`customize.py`文件中,你可以定义一个或多个过滤器。每个过滤器都是一个函数,它接收一个值并返回处理后的值。例如:
from django import templateregister = template.Library()@register.filter(name='upper')def upper(value):return value.upper()@register.filter(name='lower')def lower(value):return value.lower()
在这个例子中,我们定义了两个过滤器:`upper`和`lower`。`upper`过滤器将输入的字符串转换为大写,而`lower`过滤器将输入的字符串转换为小写。
4. 加载自定义过滤器:
• 在你的Django模板文件中,使用`{% load %}`标签来加载你的自定义过滤器库。例如:
{% load customize %}
5. 使用自定义过滤器:
• 加载过滤器库后,你可以在模板中使用你定义的过滤器。例如,使用上面定义的`upper`和`lower`过滤器:
<p>{{ my_string|upper }}</p><p>{{ my_string|lower }}</p>
这将在模板中输出:
<p>MY_STRING</p><p>my_string</p>
两者比较
它们都是在`templatetags`目录下创建的,都需要使用`template.Library()`来注册,并且都需要在模板中使用`{% load %}`标签来加载。不过,它们的用途和工作方式有所不同:
自定义标签(Tags)
• 用途:自定义标签通常用于执行一些操作,比如条件判断、循环等,它们可以包含一些逻辑处理。
• 工作方式:标签通常不返回值,而是执行某些操作,比如输出HTML代码、调用函数等。
• 示例:一个自定义标签可能用于显示一个用户列表,或者根据某些条件来决定是否显示某些内容。
自定义过滤器(Filters)
• 用途:过滤器主要用于修改变量的值,比如格式化字符串、转换数据类型等。
• 工作方式:过滤器接收一个值作为输入,处理这个值,然后返回处理后的结果。
• 示例:一个自定义过滤器可能用于将字符串转换为大写或小写,或者用于格式化日期。
创建和注册过程
无论是标签还是过滤器,它们的创建和注册过程都非常相似:
1. 创建`templatetags`目录:在你的应用目录下创建一个名为`templatetags`的目录,并在其中创建一个Python文件(如`customize.py`)。
2. 导入`template`模块:在Python文件中导入Django的`template`模块。
3. 创建`Library`实例:创建一个`template.Library()`的实例,并给它一个别名(通常是`register`)。
4. 注册标签或过滤器:使用`@register.tag`装饰器来注册标签,使用`@register.filter`装饰器来注册过滤器。
5. 定义标签或过滤器:定义标签或过滤器的函数,这些函数将包含标签或过滤器的逻辑。
6. 在模板中加载和使用:在模板文件中使用`{% load %}`标签来加载你的自定义标签或过滤器,然后在模板中使用它们。
相关文章:
Django与模板
我叫补三补四,很高兴见到大家,欢迎一起学习交流和进步 今天来讲一讲视图 Django与模板文件工作流程 模板引擎:主要参与模板渲染的系统。 内容源:输入的数据流。比较常见的有数据库、XML文件和用户请求这样的网络数据。 模板&am…...
UFW 配置 Ubuntu 防火墙并设置防火墙规则
一、什么是 UFW? UFW,全称为 Uncomplicated Firewall,顾名思义,它是一种简单易用的防火墙管理工具。与传统的防火墙配置工具相比,UFW 以其简洁明了的命令行界面而闻名。虽然它主要为普通用户设计,但它也具…...
在Keil 5中如何建立一个STM32项目
大家在使用Keil时大多都是利用样板项目来建立自己的项目,为了了解基本建立项目的知识写下了本篇文章。 项目建立流程 1.建立项目文件夹并明确其作用 —— 2.下载HAL库 —— 3.拷贝相关文件到对应文件夹 —— 4.打开Keil 5新建项目 —— 5.将项目文件夹添加到项目 …...
Linux 系统负载过高的排查思路
技术探讨:Linux系统负载过高的排查思路 在Linux服务器运行过程中,如果系统负载过高,可能会导致性能下降和服务不稳定。以下是针对Linux系统负载过高问题的排查思路和解决方法: 1. 查看系统负载: 使用uptime或top命令查…...
kotlin高级用法总结
Kotlin 是一门功能强大且灵活的编程语言,除了基础语法外,它还提供了许多高级特性,可以帮助你编写更简洁、高效和可维护的代码。以下是 Kotlin 的一些高级用法,涵盖了协程、扩展函数、属性委托、内联类、反射等内容。 协程&#x…...
Windows Wise Care 365 PRO-中文便携版
Windows Wise Care 365 PRO 链接:https://pan.xunlei.com/s/VOL9UE-i-GLXYr-6KhdyghHOA1?pwdajqe# - 禁止后续强制升级提示弹窗,杜绝后台下载升级文件 - 禁止自动创建开机启动项、任务计划,删除相关选项 - 去右侧无用区域:用户…...
SpringBoot 自动配置原理
自动配置是Spring Boot的关键特性之一,它简化了传统Spring应用繁琐的配置,通过智能推断和条件化配置简化了Spring应用的开发。 1. 自动配置的核心思想 目标:根据项目的依赖(如类路径中的 JAR 包)和已有的配置…...
HTMLCSS绘制三角形
1.代码: <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>01triangle</title><s…...
WorkTool 技术解析:企业微信自动化办公的合规实现方案
引言:企业微信生态中的自动化需求 随着企业微信用户规模突破4亿(据腾讯2023年财报),其开放生态催生了自动化办公的技术需求。传统RPA(机器人流程自动化)工具在PC端已广泛应用,但移动端自动化仍…...
Linux机器之间排查网络连通问题
网络连通性排查步骤(基于五层模型) 以下按照网络五层架构,从底层到高层逐层排查,并分别列出Ubuntu和CentOS对应的命令。 1. 物理层 排查点:网线、网卡状态、物理连接。 命令(通用):…...
大数据学习(62)- Hadoop-yarn
&&大数据学习&& 🔥系列专栏: 👑哲学语录: 承认自己的无知,乃是开启智慧的大门 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言📝支持一下博主哦ᾑ…...
Stable Diffusion/DALL-E 3图像生成优化策略
Stable Diffusion的最新版本或社区开发的插件,可以补充这些信息以保持内容的时效性。 云端源想 1. 硬件与部署优化(进阶) 显存压缩技术 使用--medvram或--lowvram启动参数(Stable Diffusion WebUI),通过分…...
21 | 全面测试项目功能
提示: 所有体系课见专栏:Go 项目开发极速入门实战课;欢迎加入 云原生 AI 实战 星球,12 高质量体系课、20 高质量实战项目助你在 AI 时代建立技术竞争力(聚焦于 Go、云原生、AI Infra);本节课最终…...
Debian系统grub新增启动项
参考链接 给grub添加自定义启动项_linux grub定制 启动项名称自定义-CSDN博客 www.cnblogs.com 1. boot里面的grub.cfg 使用vim打开boot里面的grub.cfg sudo vim /boot/grub/grub.cfg 这时候会看到文件最上方的提示 2. 真正配置grub的文件 从刚才看到的文件提示中&#x…...
C语言中的assert断言,你了解多少呢?
引言 ‘ 介绍了assert 是什么,以及assert的优缺点 一、什么assert是断言 assert.h 头文件定义了宏 assert() ,用于在运行时确保程序符合指定条件,如果不符合,就报错终止运行。这个宏常常被称为“断言”。 int a 10;asse…...
设计模式之工厂模式
工厂模式属于创建型设计模式的一种,其实在我看来它更是在面向对象编程语言的抽象层的更加灵活的应用。工厂模式其实在创建型模式中难度较高,整体的理解上需要一定时间进行消化,在一些Java常见框架中,这种模式也是频繁出现的设计&a…...
详细学习 pandas 和 xlrd:从零开始
详细学习 pandas 和 xlrd:从零开始 前言 在数据处理和分析中,Excel 文件是最常见的数据格式之一。Python 提供了强大的库 pandas,可以轻松地处理 Excel 文件中的数据。同时,我们还可以使用 xlrd 来读取 Excel 文件,尤…...
BFS比DFS更好理解「翻转二叉树」
一周没发博客,算法好难!一直在复习前面的,哈希表、链表、二叉树已经够我喝一壶了,不过我一定要啃下来,哪怕慢一点,也不能盲目的追求速度,勤于复习才能将知识变成自己的,复习比学习重…...
c++介绍运算符重载九
这段代码中我们可以看到同样是运算符,它的作用是不同的aa<<3;是c内置的移位运算符。 cout<<"hello world"中<<它的作用是插入运算符。将字符串传递给cout对象,从而将字符输出到终端上。这种功能是如何实现的?其…...
重生之我在学Vue--第9天 Vue 3 项目整合
重生之我在学Vue–第9天 Vue 3 项目整合 文章目录 重生之我在学Vue--第9天 Vue 3 项目整合前言一、架构升级:从散件到整机1.1 项目结构重构1.2 核心模块通信图 二、功能整合:CRUD全链路实现2.1 任务管理状态中枢2.2 路由守卫实现数据预取2.3 UI与业务逻辑…...
小程序酒店:如何实现智能预订与在线支付?
在移动互联网快速发展的今天,酒店行业面临着前所未有的机遇与挑战。用户需求日益多样化,市场竞争愈发激烈,传统酒店预订方式已经难以满足现代消费者的需求。而小程序作为一种轻量化、便捷化的移动应用形式,正在成为酒店行业数字化转型的重要工具。通过小程序开发,酒店可以…...
网络信息安全专业(710207)网络安全攻防实训室建设方案
一、引言 随着信息技术的飞速发展,网络空间安全已成为国家安全的重要组成部分,对网络信息安全专业人才的需求日益增长。为满足网络信息安全专业(专业代码710207)的教学需求,提升学生在网络安全攻防领域的实践能力&…...
npm、pnpm、cnpm、yarn、npx之间的区别
区别 特性npmyarnpnpmcnpmnpx核心定位Node.js 默认包管理增强稳定性与性能高效存储与严格隔离国内镜像加速工具临时执行包命令依赖存储方式扁平化 node_modules扁平化 lock 文件全局硬链接 符号链接同 npm不适用安装速度较慢较快(并行下载)最快&#…...
数学:从宇宙密码到人工智能的核心语言
——解析数学本质、历史演进与未来革命的3000年全景图 一、数学本质论:宇宙的元语言 1.1 数学实在论的拓扑诠释 根据丘成桐的卡拉比-丘流形理论,物理定律可表述为: M C Y ↪ C P n 满足 c 1 ( M ) 0 \mathcal{M}_{CY} \hookrightarrow \…...
Java中的加盐加密:提升密码存储安全性的关键实践
引言 在现代应用中,用户密码的安全性至关重要。单纯的哈希算法(如MD5、SHA-1)虽然可以隐藏原始密码,但面对彩虹表攻击和暴力破解时仍存在风险。加盐加密通过在哈希过程中引入随机数据(称为“盐”)…...
开启AI开发新时代——全解析Dify开源LLM应用开发平台
开启AI开发新时代——全解析Dify开源LLM应用开发平台 在人工智能迅速发展的今天,如何快速将创意转化为高效可用的应用成为开发者亟待解决的问题。Dify 作为一款开源的 LLM 应用开发平台,以其直观的界面和强大的功能组合(包括 agentic AI 工作…...
数学建模:MATLAB强化学习
一、强化学习简述 强化学习是一种通过与环境交互,学习状态到行为的映射关系,以获得最大积累期望回报的方法。包含环境,动作和奖励三部分,本质是智能体通过与环境的交互,使得其作出的动作所得到的决策得到的总的奖励达…...
ELK traceId实现跨服务日志追踪
ELK怎么实现跨服务日志追踪,Trace-Id 具体实现方案及代码_kibana关联其他服务器的日志-CSDN博客 ELKMDC追踪日志 ---- SpringCloud实现传递_elk的mdc-CSDN博客 SpringBoot之HandlerInterceptor拦截器的使用 ——(一)-CSDN博客 在使用ELK&a…...
【开源项目-爬虫】Firecrawl
看到其他项目引用了这个项目 Firecrawl 用免费额度试了一下,这个项目和之前的 https://r.jina.ai/ 很像(类似的还有 https://www.scrapingbee.com/?),将爬取到的网页转换为 markdown 格式,这样大语言模型用…...
波特率、比特率、传信率、传码率......
去年搞过一段时间的无线通信,当时我脑子里真的是一团乱麻,本身咱也不是学通信的,咱是学机械出身的,后面又搞电,反正对于通信这一块就不是很懂,后面也慢慢搞出来了一点小东西,但是对于一些细节还…...
用户模块——redis工具类
1. Redis工具类与基础配置 1.1 什么是Redis,为什么使用它? Redis(Remote Dictionary Server)是一个开源的高性能键值对存储数据库,通常用于缓存数据、存储会话信息等场景。它的主要优点是速度快,支持多种数…...
Synology 部署的 WordPress 無法升級至最新版本時,可以透過以下改良版指南進行排查和解決。
當 Synology 部署的 WordPress 無法升級至最新版本時,可以透過以下改良版指南進行排查和解決。我對內容進行了補充和重新組織,希望能幫助你更高效地處理這類問題: 權限相關問題處理 檢查文件和目錄權限: 確保 WordPress 安裝目錄…...
012-Benchmark
Benchmark 以下是一篇关于Google Benchmark库的全面介绍及使用指南,包含完整C代码示例和核心功能覆盖: Google Benchmark:C 性能基准测试指南 一、库简介 Google Benchmark 是一个专为 C 设计的微基准测试库,用于精确测量代码片…...
百某田网任务脚本
自动化操作百田游戏的任务脚本,特别是用于完成每日任务和积分兑换的功能。 主要功能 任务管理: 脚本通过定时任务查询并执行每天的任务,自动完成任务并兑换积分。 每个任务通过调用do_list()和do_task()函数来查询和完成。 多账号支持: 支持多个账号的登录和管理,账号信息…...
使用纯CSS 实现 侧边栏 拖拽效果
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、效果实现原理二、代码演示三.简单解释下样式四 完整的DEMO总结 前言 有不少需求是要拖动改变侧边栏宽高的,以下就是在不适用js ,只使用css 的情…...
c语言笔记 函数入门
c语言的函数就是用来实现某种功能的,如果说我们的程序代码都写在main函数中,这样会显得很难读懂,而且代码太长过于冗余,显得没有质量。所以我们可以把一些功能用分函数的方法实现功能独立分开,实现c程序的工整还有方便…...
运维新手入门——线缆的使用(Beginner‘s Guide to Operations and Maintenance - Cable Usage)
运维新手入门——线缆的使用 近期不断的有朋友问到线缆的传输距离,我们每天都在与线缆打交道,清楚了解线缆的使用才能在项目中得心应手,我们之前有提到过。 本期我们一起再来总结下常用的线缆传输距离。 01) 网线:超…...
JS—闭包:3分钟从入门到放弃
个人博客:haichenyi.com。感谢关注 一. 目录 一–目录二–基础定义三–闭包的运行机制四–闭包实战应用场景五–内存泄漏预防指南六–最佳实践总结 二. 基础定义 闭包:能够访问外部函数作用域的函数,以及其词法环境的组合。举个老生常谈栗…...
python pandas模块
python pandas模块 终于也到介绍pandas的时候了,python中用于处理data的一个lib 从wiki中找到的关于pandas的介绍,如下, Original author(s) Wes McKinney Developer(s) Community Initial release 11 January 2008; 17 years ago [citatio…...
系统部署【信创名录】及其查询地址
一、信创类型 (一)服务器: 1.华为云 2.腾讯云 3.阿里云 (二)中央处理器(CPU): 1.海思,鲲鹏920服务器 (三)中间件 1.人大金仓 ࿰…...
docker-compose部署MongoDB分片集群
前言 MongoDB 使用 keyFile 进行 节点间身份验证,我们需要先创建一个 keyFile 并确保所有副本集的节点使用相同的 keyFile。 openssl rand -base64 756 > mongo-keyfile chmod 400 mongo-keyfiledocker-compose部署分片集群 无密码方式 # docker-compose-mongodb.yml s…...
博奥龙Nanoantibody系列IP专用抗体
货号名称BDAA0260 HRP-Nanoantibody anti Mouse for IP BDAA0261 AbBox Fluor 680-Nanoantibody anti Mouse for IP BDAA0262 AbBox Fluor 800-Nanoantibody anti Mouse for IP ——无轻/重链干扰,更高亲和力和特异性 01Nanoantibody系列抗体 是利用噬菌体展示纳…...
CTFshow 【WEB入门】信息搜集 【VIP限免】 web1-web17
CTFshow 【 WEB入门】、【VIP限免】 web1 ----源码泄露 首先第一步,看源代码 web2----前台JS绕过 简单点击查看不了源代码,可以强制查看 比如 Ctrl Shift ICtrl U或者在url前加一个view-source: view-source:http://79999ca1-7403-46da-b25b-7ba9…...
css 知识点整理
1.css 层叠样式表 中的 inherit、initial、unset 关键字适用属性类型行为逻辑典型场景inherit所有属性强制继承父级值统一子元素样式initial所有属性重置为规范初始值清除自定义或继承样式unset所有属性自动判断继承或重置简化全局样式重置或覆盖 2. sass 常用语法 2.1、变量…...
02.Kubernetes 集群部署
Kubernetes 集群部署 Kubernetes 相关端口 1. Kubernetes 集群组件运行模式 独立组件模式 除 Add-ons 以外,各关键组件以二进制方式部署于节点上,并运行于守护进程;各 Add-ons 以 Pod 形式运行 静态 Pod 模式 控制平面各组件以静态 Pod …...
支持向量机(SVM)原理与应用
背景 支持向量机(Support Vector Machine, SVM)是一种经典的监督学习算法,广泛应用于分类和回归问题。SVM以其强大的数学基础和优异的性能在机器学习领域占据了重要地位。本文将详细介绍SVM的原理、核函数的作用以及如何在Python中使用SVM解决…...
【文献阅读】SPRec:用自我博弈打破大语言模型推荐的“同质化”困境
📜研究背景 在如今的信息洪流中,推荐系统已经成为了我们生活中的“贴心小助手”,无论是看电影、听音乐还是购物,推荐系统都在努力为我们提供个性化的内容。但这些看似贴心的推荐背后,其实隐藏着一个严重的问题——同质…...
【WRF模拟】如何查看 WPS 的输入静态地理数据(二进制格式)?
查看 WPS 的输入静态地理数据方法总结 方法 1:使用 gdal_translate 将二进制数据转换为 GeoTIFFgdal_translate 工具概述使用 gdal_translate 将二进制数据转换为 GeoTIFF方法 2:使用 ncdump 查看 geo_em.dXX.nc方法 3:使用 Python xarray + matplotlib 可视化 geo_em.dXX.n…...
介绍如何使用RDDM(残差噪声双扩散模型)进行知识蒸馏
下面为你详细介绍如何使用RDDM(残差噪声双扩散模型)进行知识蒸馏,从而实现学生RDDM模型的一步去噪。这里假定你已经有了RDDM模型,并且使用PyTorch深度学习框架。 整体思路 数据准备:加载训练数据并进行必要的预处理。…...
【lf中的git实战】
1)开发分支 develop 2)各种功能分支 author/feature_func 3)release分支 4)合并author/feature_func到develop author/feature_func 到 develop时: cd develop git merge --squash author/feature_func 5)develop合并到author/feature_func时: cd author/feature_func g…...