深入学习和理解Django模板层:构建动态页面


title: 深入学习和理解Django模板层:构建动态页面
date: 2024/5/5 20:53:51
updated: 2024/5/5 20:53:51
categories:

  • 后端开发

tags:

  • Django模板
  • 表单处理
  • 静态文件
  • 国际化
  • 性能优化
  • 安全防护
  • 部署实践

在这里插入图片描述

第一章:模板语法基础

Django模板语法介绍

Django模板语法是一种简洁而强大的语法,用于在HTML中插入动态数据和控制页面逻辑。以下是一些常用的模板语法元素:

  1. 变量:使用双大括号{{ variable }}来表示变量,可以在模板中输出变量的值。
  2. 标签:使用单大括号和百分号{% tag %}来表示标签,用于执行控制逻辑,如for循环、if语句等。
  3. 过滤器:在变量后面使用管道符|来应用过滤器,对变量进行处理,如格式化输出、大小写转换等。

变量、过滤器和标签

  • 变量:在模板中引用变量时,可以通过点号.来访问变量的属性或字典的键,例如{{ user.name }}
  • 过滤器:过滤器可以对变量进行修改或格式化,如{{ value|lower }}会将变量转换为小写。
  • 标签:标签用于控制模板的逻辑流程,如if语句用于条件判断,for循环用于遍历列表等。

控制结构:if语句、for循环等

  • if语句:用于条件判断,可以包含if、elif和else,语法类似Python的if语句。

    {% if user.is_authenticated %}
        <p>Welcome, {{ user.username }}!</p>
    {% else %}
        <p>Please log in.</p>
    {% endif %}
    
  • for循环:用于遍历列表或字典中的元素,可以使用forloop变量获取循环信息。

    <ul>
    {% for item in items %}
        <li>{{ forloop.counter }}. {{ item.name }}</li>
    {% endfor %}
    </ul>
    

注释和包含其他模板

  • 注释:使用{# comment #}来添加注释,注释内容不会在最终渲染的HTML中显示。
  • 包含其他模板:使用{% include 'template_name.html' %}可以在当前模板中包含其他模板的内容,实现模块化和代码复用。

以上是Django模板语法基础的介绍,掌握这些基本元素将有助于您更好地构建动态的Web页面和应用。

第二章:模板继承和布局

模板继承的概念和用法

模板继承是一种重用代码和布局的技术,通过定义一个基础模板,然后在子模板中继承基础模板并覆盖其中的块(block),实现页面布局的模块化和重用。

定义基础模板和子模板

  1. 基础模板:基础模板包含整体的页面结构和布局,其中定义了一些块(block),用于在子模板中填充内容。
<!-- base.html -->
<!DOCTYPE html>
<html lang="en">
<head>
    <title>{% block title %}My Website{% endblock %}</title>
</head>
<body>
    <header>
        {% block header %}Header Content{% endblock %}
    </header>
    <div class="content">
        {% block content %}{% endblock %}
    </div>
    <footer>
        {% block footer %}Footer Content{% endblock %}
    </footer>
</body>
</html>
  1. 子模板:子模板继承基础模板,并可以覆盖基础模板中定义的块。
<!-- child.html -->
{% extends 'base.html' %}

{% block title %}Child Page{% endblock %}

{% block content %}
    <h1>Welcome to Child Page</h1>
    <p>This is the content of the child page.</p>
{% endblock %}

使用块和扩展模板功能

  • {% extends 'base.html' %}:在子模板中使用extends标签指定要继承的基础模板。
  • {% block block_name %}Content{% endblock %}:在基础模板中使用block定义块,子模板中通过相同的block_name来填充内容。
  • 子模板中可以覆盖基础模板中的块,也可以不覆盖,不覆盖时将保留基础模板中的内容。

模板继承和布局使得页面的设计和维护更加灵活和高效,可以实现整体布局的统一性,同时又能保持页面内容的个性化定制。通过合理使用块和模板继承,可以提高代码的复用性和可维护性。

第三章:表单处理和表单验证

在模板中渲染表单

在Django模板中,可以使用form.as_pform.as_tableform.as_ul等方法来渲染HTML表单。例如:

<!-- forms.py -->
from django import forms
from .models import MyModel

class MyForm(forms.ModelForm):
    class Meta:
        model = MyModel
        fields = '__all__'

# templates/my_form.html
<form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">Submit</button>
</form>

处理用户输入和表单验证

  1. 处理用户输入:在表单的视图函数中,接收POST请求,获取表单数据,然后调用form.save()保存数据。
def form_view(request):
    if request.method == 'POST':
        form = MyForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect('success_view')
    else:
        form = MyForm()
    return render(request, 'my_form.html', {'form': form})
  1. 表单验证:Django的forms.ModelFormforms.Form类会自动进行字段级别的验证。如果验证失败,会返回False,你可以通过form.errors获取错误信息。
if form.is_valid():
    # 验证通过,进行处理
else:
    # 验证失败,显示错误信息
    for field, errors in form.errors.items():
        print(f"{field}: {errors}")

使用模板标签简化表单处理

Django提供了一些模板标签来简化表单处理,如{% csrf_token %}用于嵌入CSRF保护,{{ form.as_p }}等用于渲染表单。你还可以使用form.errors来显示验证错误:

<form method="post">
    {% csrf_token %}
    {% for field in form %}
        {% if field.errors %}
            <p class="error">{{ field.errors }}</p>
        {% endif %}
        {{ field.label_tag }} {{ field }}
    {% endfor %}
    <button type="submit">Submit</button>
</form>

这样,模板负责渲染,视图负责数据处理和验证,保持了前后端逻辑的分离。

第四章:静态文件管理

加载静态文件(CSS, JS, 图片)

在Django中,静态文件(如CSS,JS,图片)通常存储在STATICFILES_DIRS定义的目录中。在项目的settings.py文件中,你需要配置静态文件存储路径和URL。例如:

STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static'),
]
STATIC_URL = '/static/'

然后,你可以在HTML模板中通过模板标签{% static 'path/to/file' %}来加载静态文件:

<head>
    <link rel="stylesheet" type="text/css" href="{% static 'css/style.css' %}">
    <script src="{% static 'js/main.js' %}"></script>
</head>

使用静态文件目录和模板标签

STATICFILES_DIRS定义了多个静态文件的目录,Django会自动合并它们。STATIC_URL定义了静态文件在服务器上的URL前缀。模板中的{% static %}标签会根据这些设置,生成正确的URL。

集成前端框架和库

  • 添加依赖:如果你打算使用如Bootstrap、jQuery等前端框架或库,通常需要在项目的requirements.txtpackage.json(对于npm项目)中添加依赖。
  • 引用文件:在HTML模板中,使用{% static %}标签引用框架或库的CSS和JS文件。例如,对于Bootstrap:
<link rel="stylesheet" href="{% static 'bootstrap/css/bootstrap.min.css' %}">
<script src="{% static 'bootstrap/js/bootstrap.min.js' %}"></script>
  • 更新模板结构:根据框架的文档,可能需要调整HTML结构,比如使用Bootstrap的<div class="container"><form>等。
  • 使用前端构建工具:如果你的前端项目是使用Webpack、Gulp等构建的,可以设置构建过程,以便在生产环境中合并和压缩这些文件。

重要的是,保持前后端分离,前端框架通常在前端代码中管理,而Django主要负责后端逻辑和数据处理。

第五章:国际化和本地化

支持多语言和多地区

Django提供了强大的国际化(i18n)和本地化(l10n)功能,可以轻松支持多语言和多地区的需求。你可以在项目的settings.py中配置支持的语言和时区,例如:

LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_L10N = True

使用Django的国际化功能

  • 定义翻译字符串:在Django项目中,你可以使用gettext()函数或_()快捷方式来标记需要翻译的字符串。例如:
from django.utils.translation import gettext as _

message = _("Hello, world!")
  • 提取翻译字符串:运行django-admin makemessages -l <language_code>命令来提取需要翻译的字符串,并将其保存在locale目录下的.po文件中。
  • 翻译字符串:编辑.po文件,为每个需要翻译的字符串提供翻译。完成后,运行django-admin compilemessages命令来编译翻译文件。
  • 在模板中使用翻译:在模板中,你可以使用{% trans %}标签来翻译字符串。例如:
{% load i18n %}
<h1>{% trans "Hello, world!" %}</h1>

在模板中处理本地化日期、时间等

  • 本地化日期:在模板中,你可以使用{{ value | date }}过滤器来格式化日期。例如:
{{ value | date:"SHORT_DATE_FORMAT" }}
  • 本地化时间:类似地,你可以使用{{ value | time }}过滤器来格式化时间。
  • 本地化数字:如果需要本地化数字,可以使用{{ value | floatformat }}过滤器。

通过使用Django的国际化和本地化功能,你可以轻松地为你的应用程序提供多语言和多地区的支持,同时确保日期、时间等内容在不同语言环境下正确显示。

第六章:性能优化和缓存

缓存模板片段和完整页面

Django提供了多种缓存机制,包括文件系统缓存、内存缓存、数据库缓存和Memcached缓存。你可以在项目的settings.py中配置缓存后端,例如:

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
        'LOCATION': '127.0.0.1:11211',
    }
}
  • 缓存模板片段:在模板中,你可以使用{% cache %}标签来缓存模板片段。例如:
{% load cache %}
{% cache 500 sidebar %}
  <div id="sidebar">
    ...
  </div>
{% endcache %}
  • 缓存完整页面:在视图函数中,你可以使用django.views.decorators.cache.cache_page装饰器来缓存整个页面。例如:
from django.views.decorators.cache import cache_page

@cache_page(60 * 15)
def my_view(request):
    ...

使用缓存标签和中间件

  • 缓存标签:在模板中,你可以使用{% cache %}标签来缓存模板片段。例如:
{% load cache %}
{% cache 500 sidebar %}
  <div id="sidebar">
    ...
  </div>
{% endcache %}
  • 缓存中间件:在项目的settings.py中,你可以启用缓存中间件,以自动缓存每个页面。例如:
MIDDLEWARE = [
    ...
    'django.middleware.cache.UpdateCacheMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.cache.FetchFromCacheMiddleware',
    ...
]

AD:首页 | 一个覆盖广泛主题工具的高效在线平台

提高模板渲染速度的最佳实践

  • 避免使用过多的嵌套:避免在模板中使用过多的嵌套,可以提高渲染速度。
  • 使用模板片段:将重复使用的模板代码提取为模板片段,可以减少模板的大小,提高渲染速度。
  • 使用缓存:使用缓存可以大大提高应用程序的性能,尤其是在处理高并发请求时。
  • 使用静态文件:将CSS、JavaScript和图片等静态文件保存在CDN(内容分发网络)上,可以减少服务器的负载,提高应用程序的性能。

通过使用缓存和提高模板渲染速度的最佳实践,你可以大大提高应用程序的性能,提供更好的用户体验。

第七章:安全防护和XSS防范

防止跨站脚本攻击(XSS)

跨站脚本攻击(Cross-site Scripting, XSS)是一种常见的Web安全漏洞。攻击者可以在网页上注入恶意的JavaScript代码,在用户浏览网页时执行该代码,从而窃取用户的cookie、修改页面内容或发起其他攻击。

为了防止XSS攻击,您可以采取以下措施:

  • 验证用户输入:验证用户输入,确保不包含任何恶意代码。
  • 使用模板过滤器和转义字符:使用模板过滤器和转义字符来转义在页面上显示的任何用户输入。
  • 使用内容安全策略(CSP) :使用CSP来限制脚本和其他潜在有害资源的来源。

使用模板过滤器和转义字符

Django提供了几种模板过滤器来帮助防止XSS攻击:

  • escape:对字符串中的所有HTML特殊字符进行转义。
  • safe:将一个字符串标记为安全,以避免转义。
  • force_escape:无论是否标记为安全,都对字符串中的所有HTML特殊字符进行转义。
  • escapejs:对字符串中的所有JavaScript特殊字符进行转义。

您应该使用这些过滤器来转义在页面上显示的任何用户输入。例如:

<p>{{ user_input|escape }}</p>

CSRF保护和安全最佳实践

跨站请求伪造(Cross-Site Request Forgery, CSRF)是另一种常见的Web安全漏洞。它允许攻击者欺骗用户执行他们并非本意的网站操作。

为了防止CSRF攻击,您可以采取以下措施:

  • 使用CSRF保护:Django提供了内置的CSRF保护机制,您可以用来保护您的视图。
  • 使用HTTPS:使用HTTPS加密用户浏览器和服务器之间的所有通信。
  • 限制用户权限:将用户权限限制在最小必要范围内。
  • 保持软件更新:及时更新软件,安装最新的安全补丁。

通过遵循这些安全最佳实践,您可以帮助保护您的应用程序免受常见的Web安全漏洞的影响。

第八章:高级模板技巧

定义自定义模板标签和过滤器

AD:专业搜索引擎

在Django中,您可以定义自定义模板标签和过滤器来扩展模板的功能。这些自定义标签和过滤器可以帮助您在模板中执行特定的逻辑或处理数据。

定义自定义模板过滤器:

from django import template

register = template.Library()

@register.filter
def custom_filter(value):
    # 在这里实现您的自定义过滤器逻辑
    return modified_value

定义自定义模板标签:

from django import template

register = template.Library()

@register.simple_tag
def custom_tag():
    # 在这里实现您的自定义标签逻辑
    return output

使用模板标签扩展模板功能

您可以在模板中使用自定义标签来扩展模板的功能。例如,在模板中调用自定义标签:

{% custom_tag %}

这将执行您定义的自定义标签逻辑并将结果输出到模板中。

高级模板继承技巧和最佳实践

模板继承是Django中非常强大和灵活的功能,可以帮助您避免重复的代码并更好地组织您的模板。

高级模板继承技巧:

  • 多层继承:您可以创建多个层次的模板继承,使模板更具可扩展性和可维护性。
  • 块覆盖:通过在子模板中覆盖父模板中定义的块,可以灵活地调整模板的外观和布局。
  • 使用include标签:使用include标签将重复的部分提取到单独的模板文件中,以便重复使用。

模板继承最佳实践:

  • 保持模板简洁:避免在模板中包含过多的业务逻辑,将逻辑处理移至视图中。
  • 合理使用块和include:合理使用块和include标签,使模板具有清晰的结构和易于维护。
  • 遵循DRY原则:遵循“不要重复自己”(Don’t Repeat Yourself, DRY)原则,避免在模板中重复相似的代码。

通过定义自定义模板标签和过滤器,以及运用高级模板继承技巧和最佳实践,您可以更好地利用Django的模板系统,提高开发效率并创建更具可维护性的模板。

第九章:测试模板

编写和运行模板测试

AD:漫画首页

在Django中,您可以编写和运行模板测试来确保模板的正确性和稳定性。模板测试可以帮助您验证模板的输出是否符合预期,以及是否正确地渲染了数据。

编写模板测试:

from django.test import TestCase
from django.template import Template, Context

class TemplateTest(TestCase):
    def test_template_output(self):
        template = Template("Hello, {{ name }}!")
        context = Context({"name": "World"})
        rendered_template = template.render(context)
        self.assertEqual(rendered_template, "Hello, World!")

运行模板测试:

您可以使用Django的测试运行器来运行模板测试。在项目根目录下执行以下命令即可运行所有测试:

python manage.py test

使用Django测试工具和单元测试

Django提供了丰富的测试工具和单元测试框架,您可以使用这些工具来编写和运行各种类型的测试,包括模型测试、视图测试、表单测试以及模板测试。

编写单元测试:

from django.test import TestCase

class YourTestCase(TestCase):
    def test_something(self):
        # 在这里编写您的单元测试逻辑
        self.assertEqual(1 + 1, 2)

运行单元测试:

您可以使用Django的测试运行器来运行单元测试,以确保应用程序的各个部分都能正常工作。在项目根目录下执行以下命令即可运行所有测试:

python manage.py test

模拟用户交互和模板渲染测试

在Django中,您可以使用测试客户端来模拟用户的交互行为,并验证视图和模板的渲染结果。

模拟用户交互测试示例:

from django.test import TestCase

class YourViewTest(TestCase):
    def test_view(self):
        response = self.client.get('/your-url/')
        self.assertEqual(response.status_code, 200)

模板渲染测试示例:

from django.test import TestCase

class TemplateTest(TestCase):
    def test_template_output(self):
        response = self.client.get('/your-url/')
        self.assertContains(response, "Hello, World!")

通过编写和运行模板测试,使用Django测试工具和单元测试,以及模拟用户交互和模板渲染测试,您可以确保应用程序的各个部分都能正常工作,并提高应用程序的稳定性和可靠性。

第十章:部署和优化

部署Django应用的最佳实践:

  1. 选择服务器:根据需求选择合适的服务器,如AWS、Google Cloud、DigitalOcean或Heroku等。选择支持Python和Django的环境。
  2. 虚拟环境:使用虚拟环境(venv或conda)管理项目的依赖,确保部署环境与开发环境一致。
  3. 设置环境变量:使用环境变量(如.env文件)管理敏感信息,如数据库密码和API密钥等。
  4. Docker化:使用Docker容器化可以简化部署流程,确保环境的一致性。
  5. 使用Gunicorn或uWSGI:作为WSGI服务器,它们可以处理多请求并提高性能。
  6. Nginx配置:Nginx作为反向代理,可以处理静态文件和负载均衡。
  7. 自动化部署:使用CI/CD工具如GitLab CI, Jenkins或GitHub Actions,自动化部署流程。
  8. 监控和日志:设置监控和日志系统,如Prometheus和Grafana或ELK(Elasticsearch, Logstash, Kibana)堆栈。
  9. 安全:遵循最佳实践,如使用HTTPS、CSRF保护、SQL注入防护等。

静态文件处理和CDN加速:

  1. 收集静态文件:使用collectstatic命令收集所有静态文件到STATIC_ROOT目录。
  2. 配置STATIC_URL:确保在settings.py中正确配置静态文件URL。
  3. 使用白名单:仅允许特定的静态目录被访问,避免目录遍历攻击。
  4. 使用CDN:将静态文件托管在CDN上,如AWS S3、Cloudflare或Akamai,提高内容分发速度。

性能优化和调试技巧:

  1. 缓存:使用Django的缓存系统(如memcached或Redis)缓存常用数据。
  2. 数据库优化:优化查询语句,使用django-debug-toolbar进行SQL查询分析。
  3. 代码优化:避免不必要的数据库查询,减少不必要的计算。
  4. 减少HTTP请求:合并CSS和JS文件,使用数据压缩。
  5. 启用GZIP压缩:减小程序传输大小,提高加载速度。
  6. 使用异步处理:对于耗时操作,如发送邮件或处理大文件,使用异步任务。
  7. 使用性能分析工具:如django-extensionsdjango-debug-toolbar等,帮助定位性能瓶颈。
  8. 调试:在生产环境中,启用调试模式可能会暴露敏感信息,因此在开发时使用,上线时关闭。

遵循这些最佳实践,您可以确保您的Django应用高效、稳定地部署,并通过持续优化提升用户体验。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Windows如何安装hadoop

Hadoop是一个开源的分布式计算平台&#xff0c;旨在处理大规模数据的存储和处理。它提供了分布式文件系统&#xff08;HDFS&#xff09;和分布式计算框架&#xff08;MapReduce&#xff09;&#xff0c;使得用户能够在大规模集群上存储和处理数据。Hadoop最初由Apache软件基金会…

【Java基础】15.脚本、编译、注解

系列文章目录 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 文章目录 系列文章目录15.脚本、编译、注解15.1 Java的脚本机制15.1.1 获取脚本引擎15.1.2 脚本计算与绑定15.1.3 重定向输入和输出15.1.4 调用脚本的函数和方法15.1.5 编…

iOS - Undefined symbols: 解决方法

Undefined symbols: 是让人苦恼的报错&#xff0c;如何知道是 哪个 symbols 不对呢&#xff1f; 今天探索到下面的方法&#xff1a; 1、点击导航上方 最右侧的按钮&#xff0c;查看历史报错 2、选中报错信息&#xff0c;右键选择 Expand All Transcripts 在出现的详细信息面…

【ARM Cortex-M3指南】4:存储器系统

文章目录 四、存储器系统4.1 存储器系统特性概述4.2 存储器映射4.3 存储器访问属性4.4 默认的存储器访问权限4.5 位段操作4.5.1 位段操作的优势4.5.2 不同数据宽度的位段操作4.5.3 C程序实现位段操作 4.6 非对称传输4.7 排他访问4.8 端模式 四、存储器系统 4.1 存储器系统特性…

【汇编语言】中断及外部设备操作

【汇编语言】中断及外部设备操作 文章目录 【汇编语言】中断及外部设备操作前言一、中断及其处理中断的概念8086内中断中断处理程序案例&#xff1a;系统中的0号中断中断过程 二、编制中断处理程序中断处理程序及其结构编制中断处理程序——以除法错误中断为例do0子程序应该放在…

Transformer中的数据输入构造

文章目录 1. 文本内容2. 字典构造2.1 定义一个类用于字典构造2.2 拆分文本2.3 构造结果 3. 完整代码 1. 文本内容 假如我们有如下一段文本内容&#xff1a; Optics It is the branch of physics that studies the behaviour and properties of light . Optical Science 这段…

【计算机科学速成课】笔记二

笔记一 文章目录 7.CPU阶段一&#xff1a;取指令阶段阶段二&#xff1a;解码阶段阶段三&#xff1a;执行阶段 8.指令和程序9.高级CPU设计——流水线与缓存 7.CPU CPU也叫中央处理器&#xff0c;下面我们要用ALU&#xff08;输入二进制&#xff0c;会执行计算&#xff09;、两种…

倪海厦(二)研究任何学问(东西)批判去看

大家好今天我们接着研究&#xff0c;倪海厦是如何思考问题的: 研究任何学问&#xff08;东西&#xff09;&#xff0c;批判去看&#xff0c;假设--验证--结果。以果决其行&#xff01;&#xff01;&#xff01;放空自己。学而后思&#xff0c;思学并进。 今天这一篇呢&#xf…

医疗器械软件相关的追溯关系

在医疗器械软件开发过程中&#xff0c;追溯性是确保产品质量和安全性的关键步骤之一。追溯性要求各个阶段的需求、设计、实现和测试之间能够清晰、连贯地关联起来&#xff0c;以便在整个开发周期中进行有效的跟踪和管理。IEC62304中明确输出的内容要有对应的追溯性&#xff0c;…

golang学习笔记(内存模型和分配机制)

操作系统的存储管理 虚拟内存管理 虚拟内存是一种内存管理技术&#xff0c;它允许操作系统为每个进程提供一个比实际物理内存更大的地址空间。这个地址空间被称为虚拟地址空间&#xff0c;而实际的物理内存则被称为物理地址空间。使用虚拟内存有以下几点好处&#xff1a; 内…

docker系列8:容器卷挂载(上)

目录 传送门 从安装redis说起 什么是容器卷挂载 操作系统的挂载 日志文件一般是"首恶元凶" 挂载命令 容器卷挂载 卷挂载命令 启动时挂载 查看挂载卷信息 容器卷管理 查看卷列表 创建容器卷 具名挂载与匿名挂载 具名挂载 传送门 docker系列1&#xff…

了解并学会使用反射

目录 一、反射的应用场景&#xff08;简单了解&#xff09; 二、反射的定义 三、关于反射的四个重要的类 四、反射的使用 1.Class获取一个class对象的方式 方式一&#xff1a;forName&#xff08;&#xff09;&#xff1a; 方式二&#xff1a;封装类.Class&#xff1a; …

天风证券:水电燃气价格上涨,能推动通胀么?

水电燃气价格上涨对PPI的影响更大&#xff0c;6%的平均价格上涨能够拉动CPI和PPI分别上涨0.3个和0.7个百分点。 近期&#xff0c;国内多地上调水电燃气价格 燃气价格上涨主要针对居民端。目前燃气价格实行居民用气价格限价波动非民用气市场化定价的双轨制&#xff0c;这使得居…

【Linux】目录和文件相关的命令,补充:centos7系统目录结构

【Linux】Linux操作系统的设计理念之一就是“一切皆文件”&#xff08;Everything is a file&#xff09;&#xff0c;即将设备、文件等都当作“文件”处理。 “文件”主要类型有&#xff1a;目录&#xff08;即文件夹&#xff09;&#xff0c;链接文档&#xff08;即快捷方式…

【Linux线程】

目录 线程是操作系统的一个执行流并发编程进程并发的优劣基于线程的并发编程Linux当中的线程 线程的创建使用pthread_createpthread_join对线程进行等待pthread_exit和pthread_cancelpthread_detach线程分离注意事项 原生线程库&#xff0c;详谈Linux的线程pthread库管理线程 线…

云端部署Stirling PDF:构建个人App的API调用指南(附Python源码)

今天发现一个Github的开源项目&#xff0c;Stirling PDF&#xff0c;项目地址如下&#xff1a;https://gitcode.com/Stirling-Tools/Stirling-PDFhttps://gitcode.com/Stirling-Tools/Stirling-PDF?utm_sourceartical_gitcode目前CSDN上已经有好几个up主都介绍了这个项目&…

cocos=》 预乘、混合(黑边、白色)

简介 预乘&#xff0c;指的是在数据提交给GPU之前&#xff0c;就对纹理的RGB分量与alpha值进行计算。 预乘计算 结果颜色 源颜色值 目标颜色值 * (1 - 源 alpha 值) result source.RGB dest.RGB * (1 - source.A); 对应的颜色混合函数设置为 gl.blendFunc(gl.ONE, gl.…

英语复习之英语形近词总结

最近在练习英语口语&#xff0c;有很好的练习场景&#xff0c;和数字人对练&#xff0c;还能纠错&#xff0c;不过开口的基础需要单词量的支撑以及语法的熟悉&#xff0c;因为英语的语法太简单了&#xff0c;没啥需要复习和注意的&#xff0c;音标发音的问题也可以后期再纠正&a…

Angular进阶-NVM管理Node.js实现不同版本Angular环境切换

一、NVM介绍 1. NVM简介 Node Version Manager&#xff08;NVM&#xff09;是一个用于管理多个Node.js版本的工具。它允许用户在同一台机器上安装和使用多个Node.js版本&#xff0c;非常适合需要同时进行多个项目的开发者。NVM是开源的&#xff0c;支持MacOS、Windows和Linux…

wechat_OCR项目打包以及如何使用

&#x1f4da;博客主页&#xff1a;knighthood2001 ✨公众号&#xff1a;认知up吧 &#xff08;目前正在带领大家一起提升认知&#xff0c;感兴趣可以来围观一下&#xff09; &#x1f383;知识星球&#xff1a;【认知up吧|成长|副业】介绍 ❤️感谢大家点赞&#x1f44d;&…
最新文章