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 %}`标签来加载你的自定义标签或过滤器,然后在模板中使用它们。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/916025.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/916025.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

日本上市IT企业|8月25日将在大连举办赴日it招聘会

株式会社GSD的核心战略伙伴贝斯株式会社&#xff0c;将于2025年8月25日在大连香格里拉大酒店商务会议室隆重举办赴日技术人才专场招聘会。本次招聘会面向全国范围内的优秀IT人才&#xff0c;旨在为贝斯株式会社东京本社长期发展招募优质的系统开发与管理人才。招聘计划&#xf…

低功耗设计双目协同画面实现光学变焦内带AI模型

低功耗设计延长续航&#xff0c;集成储能模块保障阴雨天气下的铁塔路线的安全一、智能感知与识别技术 多光谱融合监控结合可见光、红外热成像、激光补光等技术&#xff0c;实现全天候监测。例如&#xff0c;红外热成像可穿透雨雾监测山火隐患&#xff0c;激光补光技术则解决夜间…

datasophon下dolphinscheduler执行脚本出错

执行hive脚本出错&#xff1a; 错误消息&#xff1a; FAILED: RuntimeException Error loading hooks(hive.exec.post.hooks): java.lang.ClassNotFoundException: org.apache.atlas.hive.hook.HiveHookat java.net.URLClassLoader.findClass(URLClassLoader.java:387)at java.…

【Elasticsearch】安全地删除快照仓库、快照

《Elasticsearch 集群》系列&#xff0c;共包含以下文章&#xff1a; 1️⃣ 冷热集群架构2️⃣ 合适的锅炒合适的菜&#xff1a;性能与成本平衡原理公式解析3️⃣ ILM&#xff08;Index Lifecycle Management&#xff09;策略详解4️⃣ Elasticsearch 跨机房部署5️⃣ 快照与恢…

nodejs的npm

1. 什么是 npm&#xff1f; npm&#xff08;Node Package Manager&#xff09; 是 Node.js 的默认包管理工具&#xff0c;用于&#xff1a; 安装和管理依赖&#xff08;第三方库、框架等&#xff09;。运行项目脚本&#xff08;如启动服务、测试、构建等&#xff09;。发布和共…

外网访问内部私有局域网方案,解决运营商只分配内网IP不给公网IP问题

相信不少网友和我一样&#xff0c;为了实现远程控制、NAS访问、组建私有云、摄像头监控之类的需求&#xff0c;把光猫改成了桥接模式&#xff0c;并用自己的路由器拨号、进行端口了映射。本人之前一直用着没啥问题&#xff0c;不过&#xff0c;最近突然出现了无法访问的情况&am…

大模型——上下文工程 (Context Engineering) – 现代 AI 系统的架构基础

上下文工程 (Context Engineering) – 现代 AI 系统的架构基础 最近,AI大神 Andrej Karpathy 在YC的一个演讲《Software in the era of AI 》带火了一个新的概念 Context Engineering,上下文工程,LangChain也于7月2号在官网博客发表以《Context Engineering》为题目的文章(h…

PostgreSQL RelationBuildTupleDesc 分解

/** RelationBuildTupleDesc** Form the relations tuple descriptor from information in* the pg_attribute, pg_attrdef & pg_constraint system catalogs.*///从pg_attribute,pg_attrdef和pg_constraint 获取字段信息以填充relation->rd_att static void //用到的…

在 Alpine Linux 中创建虚拟机时 Cgroup 挂在失败的现象

现象&#xff1a;在 Alpine Linux 中部署 LXD或者incus 服务后&#xff0c;创建 容器或者虚拟机时提示 实例启动失败、退出代码为1&#xff1a;查询启动日志后&#xff0c;发现是 cgroup 挂载失败导致了 container 拉起失败。原因分析&#xff1a;从启动日志上看&#xff0c;是…

让UV管理一切!!!

一、遇到的问题 自己在做AI开发的时候&#xff0c;先用的conda来管理虚拟环境&#xff0c;然后使用pip freeze > reqiurments来打包相关依赖。 优点&#xff0c;conda环境可以让不同的项目有单独的虚拟环境&#xff0c;不会干扰每个项目&#xff0c;还可以多个项目共享一个…

Jmeter使用 - 2

5 参数化 5.1 自定义变量 线程组 --> 配置元件 --> 用户定义的变量 可以自定义变量&#xff0c;通过 ${变量名} 使用 5.2 随机函数 随机数函数 # 生产六位数的随机数字 ${__Random(100000,999999,)} # 生成随机时间: 时间格式yyyy-MM-dd,开始时间,结束时间,设置时区…

部署 Zabbix 企业级分布式监控

目录 一、监控系统的功能概述 1、监控的定义 2、监控的五个层次 &#xff08;1&#xff09;基础设施监控 &#xff08;2&#xff09;系统层监控 &#xff08;3&#xff09;应用层监控 &#xff08;4&#xff09;业务监控 &#xff08;5&#xff09;端用户体验监控 二、…

Silly Tavern 教程②:首次启动与基础设置

本文介绍 Silly Tavern 首次启动后的基础设置&#xff0c;包括语言切换与 AI 后端连接&#xff0c;重点推荐 无需付费即可使用的免费或低成本方案&#xff0c;涵盖 Groq、AI Horde、Gemini 和 OpenRouter。 一、启动 Silly Tavern 并访问界面 完成安装后&#xff0c;执行以下命…

C#解析JSON数据全攻略

还在为C#处理网络API返回的复杂JSON数据头疼吗&#xff1f;据统计&#xff0c;90%的开发者都曾在JSON解析上栽过跟头&#xff01; 本文将手把手教你用C#轻松玩转JSON数据&#xff1a;- HttpClient获取网络JSON数据- System.Text.Json动态解析技巧- 强类型模型转换实战- 特殊字…

8-大语言模型—指令理解:基于 LoRA 的大语言模型指令微调框架

目录 1、模型上下文窗口 1.1、增加上下文窗口的微调&#xff08;Fine-tuning for Longer Context&#xff09; 1.1.1、 核心目标 1.1.2、关键步骤 &#xff08;1&#xff09;数据准备&#xff1a;构建长文本训练集 &#xff08;2&#xff09;微调策略&#xff1a;分阶段适…

工业数据中台:PLC、SCADA、MES 的实时协同架构

在智能制造升级过程中&#xff0c;工业数据的互联互通是突破生产效率瓶颈的关键。PLC&#xff08;可编程逻辑控制器&#xff09;掌控着设备的实时运行参数&#xff0c;SCADA&#xff08;监控与数据采集系统&#xff09;负责车间级的状态监控&#xff0c;MES&#xff08;制造执行…

【Golang】Go语言基础语法

Go语言基础语法 文章目录Go语言基础语法一、Go标记二、行分隔符三、注释四、标识符五、字符串连接六、关键字七、Go语言的空格八、格式化字符串一、Go标记 Go程序可以由多个标记组成吗&#xff0c;可以是关键字、标识符、常量、字符串、符号。如下Go语句由6个标记组成&#xf…

WebRTC指纹——深度分析(中篇)

1. 引言 在上篇中,我们建立了WebRTC审查规避系统分析的理论基础,探讨了技术背景和威胁模型。中篇将深入分析WebRTC协议栈中的具体识别特征,通过对多个主流WebRTC应用的实际协议分析,揭示不同实现之间存在的显著差异。 这些协议层面的特征差异构成了审查系统进行指纹识别的…

谷粒商城篇章13--P340-P360--k8s/KubeSphere【高可用集群篇一】

1 k8s 1.1 简介 Kubernetes 简称 k8s。 是用于自动部署&#xff0c; 扩展和管理容器化应用程序的开源系统。 中文官网&#xff1a; https://kubernetes.io/zh/ 中文社区&#xff1a; https://www.kubernetes.org.cn/ 官方文档&#xff1a; https://kubernetes.io/zh/docs/h…

从零搭建 OpenCV 项目(新手向)-- 第二天 OpenCV图像预处理(一)

目录 一、图像翻转&#xff08;镜像翻转&#xff09; 1. 定义 2. OpenCV 函数 3. 数学表达 二、图像仿射变换 1. 定义 2. 仿射变换的基本原理 3. OpenCV 函数 4. 图像旋转 5. 图像平移 6. 图像缩放 7. 图像剪切 8. 为什么会出现黑色背景&#xff1f; 三、图像色彩…