【Django5】模板引擎

news2024/11/15 4:46:09

系列文章目录

第一章 Django使用的基础知识
第二章 setting.py文件的配置
第三章 路由的定义与使用
第四章 视图的定义与使用
第五章 二进制文件下载响应
第六章 Http请求&HttpRequest请求类
第七章 会话管理(Cookies&Session)
第八章 文件上传实现
第九章 多种视图view
第十章 Django5模板引擎


文章目录

  • 系列文章目录
  • 前言
  • Django5内置模板引擎
    • 1.模板上下文
    • 2.模板标签
    • 3.模板继承
    • 4. 过滤器
  • jinja3模板引擎
    • 1.安装与配置
    • 2.模板语法
    • 3.过滤器


前言

Django作为Web框架,需要一种很便利的方法动态的生成HTML网页,因此有了模板这个概念。模板包含所需HTML的部分代码以及一些特殊语法,特殊语法用于描述如何将视图传递的数据插入HTML网页中。
Django可以配置一个或多个模板引擎(甚至是0个,如前后端分离,Django只提供API接口,无须使用模板引擎),模板引擎有Django模板语言(Django Template Language,DTL)和jinja3.Django模板语言是Django内置的功能之一,jinja3是当前Python流行的模板语言。本章分别讲述Django模板语言和jinja3的使用方法。

Django5内置模板引擎

Django 内置的模板引擎包含模板上下文(亦可称为模板变量)、标签和过滤器,各个功能说明如下:

  • 模板上下文是以变量的形式写入模板文件里面,变量值由视图函数或视图类传递所得。

  • 标签是对模板上下文进行控制输出,比如模板上下文的判断和循环控制等。

  • 模板继承隶属于标签,它是将每个模板文件重复的代码抽取出来并写在一个共用的模板文件中,其他模板文件通过继承共用模板文件来实现完整的网页输出。

  • 过滤器是对模板上下文进行操作处理,比如模板上下文的内容截取、替换或格式转换等。

1.模板上下文

模板上下文是模板中基本的组成单位,上下文的数据由视图函数或视图类传递。它以{{ variable }}表示,variable是上下文的名称,它支持 Python 所有的数据类型,如字典、列表、元组、字符串、整型或实例化对象等。上下文的数据格式不同,在模板里的使用方式也有所差异。

使用变量的一些注意点如下:

  • 当模板引擎遇到一个变量,将计算这个变量,然后输出结果
  • 变量名必须由字母、数字、下划线、点组成,不能由数字和下划线开头
  • 当模板引擎遇到 “ . ” 的时候,按以下顺序进行解析
    • 按照 dict 解析 var[key]
    • 按照对象的属性或方法解析 var.var/func
    • 按照索引解析 var[index]
  • 如果变量不存在,不会引发异常,模板会插入空字符串 ‘’
  • 在模板中使用变量或方法时,不能出现 ()、[]、{}
  • 调用方法时,不能传递参数

实例:
在view中添加函数:

def modelEngine(request):
    myStr = "我是字符串"
    class student:
        name = '张三'
        age = 18
        sex = '男'
        def __init__(self, name, age, sex):
            self.name = name
            self.age = age
            self.sex = sex
    lisi = student('李四', 19, '女')
    myTuple = ('元组1',443,'元组2',111.1)
    myList = [1,2,'ggbond',4,'列表5']
    myDict = {'name':'小弟','age':18,'sex':'中性人'}

    contentValues = {'msg1': myStr, 'msg2': lisi, 'msg3': myTuple, 'msg4': myList, 'msg5': myDict}
    return render(request, 'modelEngine.html',context=contentValues)

urls里加路径:

    path('modelengine/',helloWorld.views.modelEngine)

添加个模板modelEngine.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>模板引擎测试</title>
</head>
<body>
<p>字符串测试:{{ msg1 }}</p>
<p>对象测试:对象姓名:{{ msg2.name }}、对象年龄:{{ msg2.age }}、对象性别:{{ msg2.sex }}、对象爱好:{{ msg2.hobby }}、对象:{{ msg2}}</p>
<p>元组测试:元组第一个{{ msg3.0 }}、元组第三个“{{ msg3.2 }}”、元组第四个{{ msg3.3 }}、元组:{{ msg3 }}</p>
<p>列表测试:列表第一个:{{ msg4.0 }}、列表第二个:{{ msg4.1 }}、列表第三个:{{ msg4.2 }}、列表第四个:{{ msg4.3 }}、列表:{{ msg4 }}</p>
<p>字典测试:字典键name值:{{ msg5.name }}、字典全部:{{ msg5 }}</p>
</body>
</html>

运行测试127.0.0.1/modelengine/:
在这里插入图片描述
综上,能发现在模板上下文(模板变量)中元组、列表、字典、对象都是用”.“来定位索引或键值。实例中没写遇到不存在的索引或键会怎么样,在这里补充一下。遇到这种情况,不会报错,会返回一个空的值。

2.模板标签

标签是对模板上下文进行控制输出,它是以{% tag %}表示的,其中 tag是标签的名称,Django内置了许多模板标签,比如{% if %}(判断标签)、{% for %}(循环标签)或{% url %}(路由标签)等。

常用内置标签如下:

标签描述
{% for %}遍历输出上下文的内容
{% if %}对上下文进行条件判断
{% csrf_token %}生成csrf token的标签,用于防护跨站请求伪造攻击
{% url %}引用路由配置的地址,生成相应的路由地址
{% with %}将上下文名重新命名
{% load %}加载导入 Django的标签库
{% static %}读取静态资源的文件内容
{% extends xxx %}模板继承,xxx为模板文件名,使当前模板继承xxx模板
{% block xxx %}重写父类模板的代码

在for标签中,模板还提供了一些特殊的变量来获取for标签的循环信息,变量说明如下:

变量描述
forloop.counter获取当前循环的索引,从1开始计算
forloop.counter0获取当前循环的索引,从0开始计算
forloop.revcounter索引从最大数开始递减,直到索引到1位置
forloop.revcounter0索引从最大数开始递减,直到索引到0位置
forloop.first当遍历的元素为第一项时为真
forloop.last当遍历的元素为最后一项时为真
forloop.parentloop在嵌套的for循环中,获取上层for循环的forloop

views不用更改,直接在modelEngine.html里写就好了。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>模板引擎测试</title>
</head>
<body>
<p>字符串测试:{{ msg1 }}</p>
<p>对象测试:对象姓名:{{ msg2.name }}、对象年龄:{{ msg2.age }}、对象性别:{{ msg2.sex }}、对象爱好:{{ msg2.hobby }}、对象:{{ msg2}}</p>
<p>元组测试:元组第一个{{ msg3.0 }}、元组第三个“{{ msg3.2 }}”、元组第四个{{ msg3.3 }}、元组:{{ msg3 }}</p>
<p>列表测试:列表第一个:{{ msg4.0 }}、列表第二个:{{ msg4.1 }}、列表第三个:{{ msg4.2 }}、列表第四个:{{ msg4.3 }}、列表:{{ msg4 }}</p>
<p>字典测试:字典键name值:{{ msg5.name }}、字典全部:{{ msg5 }}</p>
<h1>
    模板标签测试
</h1>
<p>
    if标签的用法:<br>
    {% if msg1 == 'hello' %}
    <a>msg1的值是hello</a>
        {% elif msg1 == 'world' %}
    <a>msg1的值是world</a>
    {% else %}
    <a>msg1的值是“{{ msg1 }}</a>
    {% endif %}
</p>
<p>
    for标签的用法:<br>
    {% for i in msg4 %}
        {% if forloop.first %}
            进入循环
        {% endif %}<br>
    这是for标签的第“{{ forloop.counter }}”次循环,变量的值:"{{ i }}"<br>
        <a>循环倒计时:“{{ forloop.revcounter0 }}</a><br>
        {% if forloop.last %}
            <a>循环结束</a>
        {% endif %}
    {% endfor %}<br>
</p>
<p>
    url标签的用法:<br>
    <a href = {% url 'modelengine' %}>点击跳转</a>
</p>
<p>
    with标签的用法:<br>
    <a>
        {% with info=msg5 %}
        info获得的值为:{{ info }}
        {% endwith %}
    </a>
</p>
</body>
</html>

运行测试http://127.0.0.1:8000/modelengine/
在这里插入图片描述
可以看到有if for url with标签的用法。注意写了for就要写end for,写了if也要写end if,甚至with也要搭配end with。这里的url标签的用法很精髓,方便后期部署。只需要在urls中其路径里加上name = 名称,后续herf = {%url ‘名称’%}即可,非常方便。

3.模板继承

Django模板继承是一个强大的工具,可以将通用页面元素(例如页眉、页脚、侧边栏等)分离出来,并在多个页面之间共享他们。

模板继承和 Python 语言中类的继承含义是一样的,在 Django 中模板只是一个文本文件,如 HTML。

模板继承是 Django 模板语言中最强大的部分。模板继承使你可以构建基本的“骨架”模板,将通用的功能或者属性写在基础模板中,也叫基类模板或者父模板。子模板可以继承父类模板,子模板继承后将自动拥有父类中的属性和方法,我们还可以在子模板中对父模板进行重写,即重写父模板中方法或者属性,从而实现子模板的定制。模板继承大大提高了代码的可重用性,减轻开发人员的工作量。

在模板继承中最常用了标签就是 {% block %} 与 {% extends %} 标签,其中 {% block% } 标签与 {% endblock %} 标签成对出现

我们新建一个基础模版base.html


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>
        {% block title %}
            这是基本页面
        {% endblock %}
    </title>
</head>
{% load static %}
<body>
<div id =header>
    <img src="{% static '1.jpg' %}"/><br>
    <a href="/helloWorld/">首页</a>
    <a href="/helloWorld/student/list/">学生信息</a>
    <a href="/helloWorld/extendtest/">继承测试</a>
    <a href="/helloWorld/modelengine/">模板引擎测试</a><br>

    --------------------------------------------------
</div>
<div id =content>
    {% block content %}
        这是基本页面
    {% endblock %}
</div>
<div id =footer>
        --------------------------------------------------<br>
    版权所有   阿树梢
</div>
</body>
</html>

继承模板extendtest.html:

{% extends 'base.html' %}
        {% block title %}
            继承页面
        {% endblock %}

{% block content %}
    <a>这是继承base的页面</a>
{% endblock %}

可以看出来通过继承的模板的代码很方便,大大的减少了开发时间

在views和urls里加个函数和页面路径
views:

def extendtest(request):
    return render(request, 'extendtest.html')

urls:

    path('extendtest/',helloWorld.views.extendtest,name='extendtest')

运行测试访问http://127.0.0.1:8000/extendtest/
在这里插入图片描述
这里说几个注意点。标签block要搭配endblock使用,block像是对象里可重写的属性方法。对于静态资源,可以先使用load static标签,再用{% static ‘文件名’ %}作为它的地址。继承父类模板用extends标签来实现。

4. 过滤器

Django过滤器是一种用于在Django模板中处理数据的技术。过滤器的作用是可以对模板中的变量进行加工、过滤或格式化,返回一个新的值供模板使用。

过滤器作用是在变量输出时,对输出的变量值做进一步的处理。 我们可以使用过滤器来更改变量的输出显示。 过滤器跟模板标签一样,也是在模板中对函数进行调用 对输出的日期进行格式化处理,或者转换大小写字母等,这些都有对应的过滤器去处理它们。

过滤器的语法格式如下: {{ 变量 | 过滤器1:参数值1 | 过滤器2:参数值2 … }}

常用内置过滤器如下:

过滤器说明
add加法
addslashes添加斜杠
capfirst首字母大写
center文本居中
cut切除字符
date日期格式化
default设置默认值
default_if_none为None设置默认值
dictsort字典排序
dictsortreversed字典反向排序
divisibleby整除判断
escape转义
escapejs转义js代码
filesizeformat文件尺寸人性化显示
first第一个元素
floatformat浮点数格式化
force_escape强制立刻转义
get_digit获取数字
iriencode转换IRI
join字符列表链接
last最后一个
length长度
length_is长度等于
linebreaks行转换
linebreaksbr行转换
linenumbers行号
ljust左对齐
lower小写
make_list分割成字符列表
phone2numeric电话号码
pluralize复数形式
pprint调试
random随机获取
rjust右对齐
safe安全确认
safeseq列表安全确认
slice切片
slugify转换成ASCII
stringformat字符串格式化
striptags去除HTML中的标签
time时间格式化
timesince从何时开始
timeuntil到何时多久
title所有单词首字母大写
truncatechars截断字符
truncatechars_html截断字符
truncatewords截断单词
truncatewords_html截断单词
unordered_list无序列表
upper大写
urlencode转义url
urlizeurl转成可点击的链接
urlizetruncurlize的截断方式
wordcount单词计数
wordwrap单词包裹
yesno将True,False和None,映射成字符串‘yes’,‘no’,‘maybe’

根据给定的格式格式化日期

格式字符描述示例输出
a‘a.m.’ or ‘p.m.’‘a.m.’
A‘AM’ or ‘PM’‘AM’
b月份,文字形式,3个字幕库,小写‘jan’
B未实现
cISO 8601格式2008-01-02T10:30:00.000123+02:00
d月的日子,带前导零的2位数字。01’到’31’
D周几的文字表述形式,3个字母。‘Fri’
e时区名称",‘GMT,’-500’,US/Eastern’等
E月份,分地区。
f时间1’,1:30’
g12小时格式,无前导零。"1’到’12’
G24小时格式,无前导零。0’到’23’
h12小时格式。‘01’到’12’
H24小时格式。‘00’到23’
i分钟00’到59’
I夏令时间,无论是否生效。'1’或0
j没有前导零的月份的日子。‘1’到"31’
l星期几,完整英文名‘Friday’
L布尔值是否是—个闰年。True或False
m月,2位数字带前导零。‘01’到’12’
M月,文字,3个字母。"Jan”
n月无前导零。‘1’到’12’
N美联社风格的月份缩写。‘Jan.’ ,‘Feb.’,‘March’,‘May’
oISO-8601周编号‘1999’
O与格林威治时间的差,单位小时。‘+0200’
P时间为12小时1:30 p.m.’ , ‘midnight’ , ‘noon’ , ‘12:30 p.m.’
rRFC 5322格式化日期。‘Thu,21 Dec 2000 16:01:07+0200’
s秒,带前导零的2位数字。‘00’到59’
S一个月的英文序数后缀,2个字符。‘st’ ,‘nd’, ‘rd’或’th’
t给定月份的天数。28 to 31
u微秒。000000 to 999999
U自Unix Epoch以来的秒数(1970年1月1日00:00:00 UTC).
w星期几,数字无前导零。‘O’(星期日)至’6’(星期六)
WISO-8601周数,周数从星期一开始。1,53
y年份,2位数字。99
Y年,4位数。‘1999’
z—年中的日子0到365
Z时区偏移量,单位为秒。-43200到43200

过滤器主要就是用来格式化的工具,所以只需要用的时候来查表就行了

这里来给个实例

<p>
    <h1>内置过滤器测试:</h1>
    <a>
       msg: {{ msg5 }}<br>
        换成全部大写的方法1:用filter upper标签:
        {% filter upper %}
        {{ msg5 }}
        {% endfilter %}<br>
    方法2:
       用过过滤器: {{ msg5|upper }}<br>
    msg:{{ msg }},首字母大写capfirst: {{ msg|capfirst }}<br>
    长度length: {{ msg|length }}
    最后一个last: {{ msg|last }}<br>
    date: {{ date }}<br>----->现在时间是:{{ date|date:"Y-m-d H:i:s" }}
    </a>
</p>

注意一下,这里的date是需要事先在views中定义的。

from datetime import datetime
    date = datetime.now()

运行测试一下,看看效果
在这里插入图片描述

jinja3模板引擎

Jinja是Python里面被广泛应用的模板引擎,最新版本3.1.3 它的设计思想来源于Django的模板引擎,并扩展了其语法和一系列强大的功能。其中最显著的是增加了沙箱执行功能和可选的自动转义功能,这对大多数应用的安全性来说是非常重要。此外,它还具备以下特性:

  • 沙箱执行模式,模板的每个部分都在引擎的监督之下执行,模板将会被明确地标记在白名单或黑名单内,这样对于那些不信任的模板也可以执行。
  • 强大的自动HTML转义系统,可以有效地阻止跨站脚本攻击。
  • 模板继承机制,此机制可以使得所有模板具有相似一致的布局,也方便开发人员对模板进行修改和管理。
  • 高效的执行效率,Jinja3引擎在模板第一次加载时就把源码转换成Python字节码,加快模板执行时间。
  • 调试系统融合了标准的Python的TrackBack功能,使得模板编译和运行期间的错误能及时被发现和调试。
  • 语法配置,可以重新配置Jinja3,使得它更好地适应LaTeX或JavaScript 的输出。官方文档手册,此手册指导设计人员更好地使用Jinja3引擎的各种方法。
  • Django支持 Jinja3模板引擎的使用,由于Jinja3的设计思想来源于Django 的模板引擎,因此Jinja3的使用方法与 Django 的模板语法有相似之处。

开源主页:https://github.com/pallets/jinja

官方文档:https://jinja.palletsprojects.com/en/3.1.x/

1.安装与配置

我们用pip命令安装Jinja3

pip install Jinja2 -i https://pypi.tuna.tsinghua.edu.cn/simple

Jinja3安装成功后,接着在 Django里配置Jinja3模板。由于 Django的内置功能是使用 Django的模板引擎,如果将整个项目都改为Jinja3模板引擎,就会导致内置功能无法正常使用。在这种情况下,既要保证内置功能能够正常使用,又要使用Jinja3模板引擎,只能将两个模板引擎共存在同一个项目里。

首先我们在helloWorld项目库里新建Jinja3.py,用来定义环境参数;

from django.contrib.staticfiles.storage import staticfiles_storage
from django.urls import reverse
from jinja2 import Environment


def environment(**options):
    env = Environment(**options)
    env.globals.update(
        {
            'static': staticfiles_storage.url,
            'url': reverse
        }
    )
    return env

然后我们找到项目配置settings.py:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.jinja2.Jinja2',
        'DIRS': [BASE_DIR / 'templates']
        ,
        'APP_DIRS': True,
        'OPTIONS': {
            'environment': 'helloWorld.Jinja3.environment'
        },
    },

    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [BASE_DIR / 'templates', BASE_DIR / 'helloWorld/templates']
        ,
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

我们测试一下之前用不了的语法,字典[键]。测试结果如下:
在这里插入图片描述
在这里插入图片描述
这是jinja3支持的语法。

2.模板语法

尽管Jinja3的设计思想来源于Django 的模板引擎,但在功能和使用细节上,Jinja3比Django的模板引擎更为完善,而且Jinja3的模板语法在使用上与 Django的模板引擎存在一定的差异。 由于Jinja3有模板设计人员帮助手册(官方文档: https://jinja.palletsprojects.com/en/3.1.x/),并且官方文档对模板语法的使用说明较为详细,因此这里只讲述Jinja3与 Django模板语言的使用差异。
在遍历对象,列表,元组的时候,假如元素或者属性不存在,Jinja3会返回具体的报错信息:no such element

以及url函数用法不一样;在遍历for标签上,属性页不一样,内置的对象是loop

for函数模板变量:

VariableDescription
loop.index循环的当前迭代(索引从1开始)
loop.index0循环的当前迭代(索引从0开始)
loop.revindex循环结束时的迭代次数(索引从1开始)
loop.revindex0循环结束时的迭代次数(索引从0开始)
loop.first如果是第一次迭代,就为True
loop.last如果是最后一次迭代,就为True
loop.length序列中的项目数,即循环总次
loop.cycle辅助函数,用于在序列列表之间循环
loop.depth当前递归循环的深度,从1级开始
loop.depth0当前递归循环的深度,从0级开始
loop.previtem上一次迭代中的对象
loop.nextitem下一次迭代中的对象
loop.changed(*val)若上次迭代的值与当前迭代的值不同,则返回True

这里我就不写实例了,主要来说说两者语法的相同与不同点。

1.内置模板的forloop变为loop。forloop.counter变为loop.length

2.在遇到不存在的列表索引或字典键时,不像内置模板直接为空,而是报没找到对象。
在这里插入图片描述
3.内置模板的标签url和load static改为了更为简便的{{url’name’)}}和{{static(‘文件名’)}}

3.过滤器

Jinja3的过滤器与 Django内置过滤器的使用方法有相似之处,也是由管道符号“|”连接模板上下文和过滤器,但是两者的过滤器名称是不同的,而且过滤器的参数设置方式也不同。Jinja3常用过滤器如下表格:

过滤器说明
abs设置数值的绝对值
default设置默认值
escape转义字符,转成HTML的语法
first获取上下文的第一个元素
last获取上下文的最后一个元素
length获取上下文的长度
join功能与Python的join语法一致
safe将上下文转义处理
int将上下文转换为int类型
float将上下文转换为float类型
lower将字符串转换为小写
upper将字符串转换为大写
replace字符串的替换
truncate字符串的截断
striptags删除字符串中所有的HTML标签
trim截取字符串前面和后面的空白字符
string将上下文转换成字符串
wordcount计算长字符串的单词个数

具体使用可以参考下Jinja3官方文档( https://jinja.palletsprojects.com/en/3.1.x/templates/#filters )

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

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

相关文章

如何检查我的网站是否支持HTTPS

HTTPS是一种用于安全通信的协议&#xff0c;是HTTP的安全版本。HTTPS的主要作用在于为互联网上的数据传输提供安全性和隐私保护。通常是需要在网站安装部署SSL证书来实现网络数据加密传输&#xff0c;安全加密功能。 那么如果要检查你的网站是否支持HTTPS&#xff0c;可以看下…

培训第十一天(nfs与samba共享文件)

上午 1、环境准备 &#xff08;1&#xff09;yum源 &#xff08;一个云仓库pepl仓库&#xff09; [rootweb ~]# vim /etc/yum.repos.d/hh.repo [a]nameabaseurlfile:///mntgpgcheck0[rootweb ~]# vim /etc/fstab /dev/cdrom /mnt iso9660 defaults 0 0[rootweb ~]# mount -a[…

软件测试09 自动化测试技术(Selenium)

重点/难点 重点&#xff1a;理解自动化测试的原理及其流程难点&#xff1a;Selinum自动化测试工具的使用 目录 系统测试 什么是系统测试什么是功能测试什么是性能测试常见的性能指标有哪些 自动化测试概述 测试面临的问题 测试用例数量增多&#xff0c;工作量增大&#xff…

数据结构初阶(C语言)-二叉树

一&#xff0c;树的概念与结构 树是⼀种非线性的数据结构&#xff0c;它是由 n&#xff08;n>0&#xff09; 个有限结点组成⼀个具有层次关系的集合。把它叫做树是因为它看起来像⼀棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的。 1.有⼀个特殊的结点&a…

ubuntu22安装拼音输入法

专栏总目录 一、安装命令&#xff1a; sudo apt update sudo apt install fcitx sudo apt install fcitx-pinyin 二、切换输入法

吴恩达深度学习笔记1 Neural Networks and Deep Learning

参考视频&#xff1a;(超爽中英!) 2024公认最好的【吴恩达深度学习】教程&#xff01;附课件代码 Professionalization of Deep Learning_哔哩哔哩_bilibili Neural Networks and Deep Learning 1. 深度学习引言(Introduction to Deep Learning) 2. 神 经 网 络 的 编 程 基 础…

数据库安全:MySQL安全配置,MySQL安全基线检查加固

「作者简介」&#xff1a;冬奥会网络安全中国代表队&#xff0c;CSDN Top100&#xff0c;就职奇安信多年&#xff0c;以实战工作为基础著作 《网络安全自学教程》&#xff0c;适合基础薄弱的同学系统化的学习网络安全&#xff0c;用最短的时间掌握最核心的技术。 这一章节我们需…

【目标检测】Anaconda+PyTorch(GPU)+PyCharm(Yolo5)配置

前言 本文主要介绍在windows系统上的Anaconda、PyTorch、PyCharm、Yolov5关键步骤安装&#xff0c;为使用yolo所需的环境配置完善。同时也算是记录下我的配置流程&#xff0c;为以后用到的时候能笔记查阅。 Anaconda 软件安装 Anaconda官网&#xff1a;https://www.anaconda…

微软蓝屏事件:网络安全与系统稳定性的反思与前瞻

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

MFC:以消息为基础的事件驱动系统和消息映射机制

以消息为基础的事件驱动系统和消息映射机制 (1)消息 A.What&#xff08;什么是消息&#xff09; 本质是一个数据结构&#xff0c;用于应用程序不同部分之间进行通信和交互 typedef struct tagMSG {HWND hwnd; // 接收该消息的窗口句柄UINT message; // 消息标…

二分查找的实现

前提&#xff1a;数组是有序的 #include <stdio.h>//作用&#xff1a;利用二分查找法查找数据 //返回值&#xff1a;数据在数组中的索引 //找到了&#xff1a;真实索引 没找到&#xff1a;返回-1 int search(int arr[], int num, int len) {//查找范围int min 0;int …

DC系列靶场---DC 2靶场的渗透测试(一)

信息收集 Nmap扫描 nmap -sV -p- -sC -T4 172.30.1.141 域名解析 echo 172.30.1.141 dc-2 >> /etc/hosts 目录枚举 gobuster dir -u http://172.30.1.141 -w work/lab/CTF/ATT_CK_01/SecLists-master/Discovery/Web-Content/big.txt -x .php,.rar,.html,.zip -t 20 -b…

将代码转换为图表的 6大工具

文章目录 将代码转换为图表的 6大工具 - 前言1、[Diagrams](https://diagrams.mingrammer.com/) - Python2、[Go-Diagrams](https://github.com/blushft/go-diagrams) - Go3、[Mermaid ](https://mermaid.js.org/) - JavaScript4、[PlantUML](https://plantuml.com/zh/) - Java…

VUE之---slot插槽

什么是插槽 slot 【插槽】&#xff0c; 是 Vue 的内容分发机制&#xff0c; 组件内部的模板引擎使用slot 元素作为承载分发内容的出口。slot 是子组件的一个模板标签元素&#xff0c; 而这一个标签元素是否显示&#xff0c; 以及怎么显示是由父组件决定的。 VUE中slot【插槽】…

Druid【基础 01】是什么+主要特点+设计原则+架构+数据结构(简单入门Druid)

Druid入门 1. 是什么2. 主要特点3. 三个设计原则4. Architecture 架构5. 数据结构5.1 DataSource 结构5.2 Segment 结构 Druid 非中文官网&#xff0c;内容不少且介绍的挺详细的&#xff0c;需要英文阅读能力或者翻译工具进行辅助。 1. 是什么 先看看官网怎么说&#xff1a; A…

C#初级——基础语法

前言 学习Unity游戏编程开发会使用到两种语言&#xff0c;一种是C#&#xff0c;另一种是Javascript。有学习C语言基础和想学unity游戏开发的萌新一般都推荐学习C#基础编程&#xff0c;以此来快速上手unity的学习。 本次学习使用到的工具为&#xff1a;VS2022 环境安装 首先&a…

对比预测编码表示学习

对比预测编码表示学习 引言 文章主要提出如下几点&#xff1a;首先将高维数据压缩到更加紧凑的潜在嵌入&#xff08;latent embdding&#xff09;空间&#xff0c;在这个空间中条件预测更容易被建模。第二&#xff0c;在这个潜在空间中使用自回归模型&#xff0c;以对未来的多…

PingCAP 王琦智:下一代 RAG,tidb.ai 使用知识图谱增强 RAG 能力

导读 随着 ChatGPT 的流行&#xff0c;LLMs&#xff08;大语言模型&#xff09;再次进入人们的视野。然而&#xff0c;在处理特定领域查询时&#xff0c;大模型生成的内容往往存在信息滞后和准确性不足的问题。如何让 RAG 和向量搜索技术在实际应用中更好地满足企业需求&#…

【C++11】智能指针深度详解(什么是智能指针?为什么需要智能指针?如何使用智能指针?)

目录 一、前言 二、 智能指针的引入 --- 内存泄露 &#x1f4a2;什么是内存泄漏&#xff1f;&#x1f4a2; &#x1f4a2;内存泄漏有那些危害&#xff1f;&#x1f4a2; &#x1f4a2;内存泄漏的原因&#xff1f;&#x1f4a2; &#x1f4a2;解决内存泄漏的方法 &#x…

go-kratos 学习笔记(3) google buf 管理proto

google buf 管理proto&#xff0c;以及从新归档文件的目录结构 什么是 BSR&#xff1f; BSR 将 Protobuf 文件作为版本化模块进行存储和管理&#xff0c;以便个人和组织可以轻松使用和发布他们的 API。 BSR 带有可浏览的 UI、依赖项管理、API 验证、版本控制、生成的文档以及…