Django框架的源码解析

2023-11-12

简述

在此写下我在阅读Django源码时的心得体会。
选择Django版本为3.1.3.
本人是一个python入门选手,这是我第一次阅读大型框架源码,并不知道该以何种顺序阅读。故此,阅读顺序完全按照个人习惯,从框架如何开始建立项目为头,慢慢解析。
解析中会穿插着我的一些个人总结,及一些需要后续深入了解展开解析的内容。
解析中的任何不足和错误,请大家积极指出。谢谢各位!

从django-admin startproject [name]开始

想建立一个django项目,第一步就是需要在终端使用 django-admin startproject project 命令生成一个django项目框架。
django-admin (命令的路径此处就不多说了。)在终端中找到命令路径,通过cat命令,可以看到下面内容:

$ cat django-admin

#!/home/MyProject/env/env-import-python3.6/bin/python3.6
# -*- coding: utf-8 -*-
import re
import sys
from django.core.management import execute_from_command_line
if __name__ == '__main__':
    sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
    sys.exit(execute_from_command_line())

sys.arg:是sys模块的一个全局变量,也称sys模块的一个属性。argv本身为一个list类型的对象,该对象持有的第1个元素是命令行中传入的模块名、从第2个元素开始(含),均为命令行中传入的参数。
r’(-script.pyw|.exe)?$’ 这个正则挺简单的。作用就是把字符串中结尾处的 .exe 或者 -script.pyw 替换掉。因为不同系统下,文件名后缀不同,替换掉不同的部分,统一程序名。

execute_from_command_line 方法在core.management.init.py文件中。

img

def execute_from_command_line(argv=None):
    """Run a ManagementUtility."""
    utility = ManagementUtility(argv)
    utility.execute()

ManagementUtility 是封装的django-admin和manage.py程序的逻辑方法。
execute() 方法:获取命令行参数,找出需要运行的子命令,创建一个适合该命令的解析器,然后运行它。

img

需要运行的命令赋值给 subcommand 。
创建一个解析器实例。这个解析器的类CommandParser在core.management.base.py中,是基于ArgumentParser的。ArgumentParser位于python的argparse 模块,可以让人轻松编写用户友好的命令行接口。
创建解析器实例之后,对命令行传输过来的参数进行合理性判断,并预处理pythonpath和settings 加入到环境变量。

在运行django-admin 创建项目的时候,还没有自己配置的settings,故使用的是默认的conf下的global_settings.py。
确认了settings之后,进行校验,具体的校验代码在conf中。此处先不展开。
settings校验之后,判断要运行的子命令:此处分为runserver 命令和其他命令两个分支。(runserver后续展开)。
创建项目时,此处传入的命令是 startproject .
运行 django.setup()方法(在django.init.py)。

img

接下来是一个自动补全的调用 self.autocomplete(). 方法中说,如果用户不设置,就跳过。我没有使用过,这里就直接跳过了。(有用过的朋友,欢迎指教~)

然后是关于 help 和 version 的调用。如果命令行中有这些参数,会在终端输出关于该命令的帮助或版本信息。

最后,就是查找并执行我们输入的子命令了。

img

fetch_command()方法中,先用get_commands()检索所有的子命令模块。

img

get_commands()方法使用了python3.2之后新添加的lru_cache 装饰器。这是一个很好的缓存机制,有兴趣的朋友可以自行去了解。
get_commands()方法使用pkgutil (python的包管理工具模块)中的iter_modules方法返回一个{command_name: app_name}形式的字典。
方法中还对用户自己定义的commands方法进行了检索,这个是后话,容后再叙。

get_commands()返回了命令字典后,fetch_command()对传参进来的子命令进行校验,是否在已经定义了的命令中。

确认命令存在之后,判断该命令是否已经加载,如果已经加载,直接使用。如果没有,加载该命令并返回Command类。
(Commmand类继承自management.templates.py中的template类。template类又是继承自management.base.py中的BaseCommand类。)
调用实例化之后命令的run_from_argv()方法,设置所有要求的环境变量,进行系统自检。最终执行handle()方法,把conf下project_template目录中的所有内容,修改名称后缀之后复制到要创建项目的位置。

至此,项目创建完成,django-admin startproject 命令结束。

以上就是django-admin startproject [name] 命令的简略解析。

小结

通过对整个流程源码的阅读可以看出,django-admin startproject 命令其实简单来说就是 通过解析命令行传输进来的参数,把位于conf下的project_template文件夹内容更名之后复制到用户所设定的位置。
流程大部分的源码,都是django-admin 和 manage命令复用的。startproject 也只是诸多子命令中的一个,由此可见,我们在项目中,可以根据需求,自助封装子命令。具体方法我们后续解析。

其中涉及到的 BaseCommand,基于BaseCommand的TemplateCommand,需要再深入阅读。

django.core.management

解析完django-admin startproject 命令,我顺势整体解析coer.management模块。
这个模块主要是完成django-admin 和 manage 命令的各种功能。

该模块的目录结构如下:

img

init.py

这个文件中包含了5个方法和一个 ManagementUtility 类。

1. 5个方法
  • find_commands():传入一个地址参数,返回一个包含所有有效命令的列表。
  • load_command_class():传入应用名和命令名,返回一个Command类的实例。
  • get_commands():检索所有命令。django.core包下的命令必定会被检索到。如果项目中有用户自主封装的命令,也会被一并检索。返回一个{command_name: app_name}类型的字典。
  • call_command():这是一个私有接口,通过传入 命令名或命令实例 和 各种参数,来直接调用命令。
  • execute_from_command_line():实例化一个ManagementUtility ,并执行。django-admin和manage 中都是调用的这个方法。
2. ManagementUtility 类

包含4个方法

  • main_help_text():以字符串形式返回脚本的主帮助文档。
  • fetch_command():匹配命令,如果正确匹配上命令,返回命令实例。
  • autocomplete():
  • execute():验证命令并执行。创建一个CommandParser实例解析参数。其中当子命令为 runserver 时, 涉及到一个autoreload 模块。我们后续解析到utils工具模块的时候再看。

小结

从__init__.py的源码中,我们可以看出django对于命令行命令的解析和执行流程。按照这个流程,我们可以在项目中封装自己的命令。
流程:在已配置的app中,建立management包(需要包含__init__.py文件),在management包中在创建一个commands包(需要包含__init__.py文件),在commands包就可以创建属于我们自己的命令文件了(文件名即为命令名)。命令文件中必须包含一个基于BaseCommand(位于core.management.base)的Command类,这个类就是执行命令时所需要实例化的类。类中要包含 handle 方法。handle方法要接受 *args **options 参数。这个handle方法就是执行命令时最终调用的方法,也就是命令的逻辑内容。
按照上述流程创建好一个命令之后,可以在终端使用 python manage.py [name] 来调用。也可以在程序中使用call_command()这个私有api调用。

base.py

可被django-admin 和 manage.py 执行的命令的基类。
包含8个类和2个方法:

1. 2个方法:
  • handle_default_options(): 设置配置文件和pythonpath。
  • no_translations():一个装饰器,强制命令在禁用翻译的情况下运行。(translation模块我现在还不知道是干嘛的,后边解析。。)
2. CommandError(Exception):
  • 继承自Exception的一个命令异常类,重写了__init__方法,添加了一个returncode的参数。
3. SystemCheckError(CommandError):
4. CommandParser(ArgumentParser):
  • 自定义的ArgumentParser类,以改进某些错误消息并在某些情况下阻止SystemExit,因为当以编程方式调用命令时,SystemExit是不可接受的。
  • 多了两个参数,missing_args_message和called_from_command_line。
  • error() 方法中实现了如果命令是在命令行中执行的,出现异常则直接exit,如果是进程调用则抛出异常,至于是否退出,需要看类实例化调用处的处理。比如__init__.py ManagementUtility() 的 excute()方法中的如下代码则不退出:

img

5. DjangoHelpFormatter(HelpFormatter):
  • 自定义帮助格式化程序。
6. OutputWrapper(TextIOBase):
7. BaseCommand:

命令基类。

  • 几个可能影响流程中各个步骤的属性:
    help : 关于命令的简短描述,会在帮助信息中打印出来。
    output_transaction: 一个布尔类型的标志,标志命令是否输出SQL声明。默认为FALSE,如果设置为TRUE的话,会自动包装上 BEGIN; and COMMIT;
    requires_system_checks:布尔类型属性,默认为True,在执行命令之前,整个django项目将会检查错误。
    requires_migrations_checks:布尔类型属性,如果为TRUE,在磁盘上的migrations设置和数据库中的migrations设置不匹配时,会打印出一个warning。
    stealth_options:一个包含所有 命令会用到的 未被参数解析器定义的 可选参数。
  • get_version(): 返回django版本。
  • create_parser():创建解析器实例,并添加几个默认可选参数。
  • add_arguments():子类重写。
  • print_help():打印帮助信息。
  • run_from_argv():设置要求的环境变化,然后执行execute()。
  • execute():执行handle()方法。执行之前进行一系列检查。
  • check():使用core.checks模块,对整个django项目检查错误。
  • check_migrations():当在磁盘上的migrations设置和数据库中的migrations设置不匹配时,打印出一个warning。
  • handle():子类中需重写此方法,未重写的话,会raise异常。
8. AppCommand(BaseCommand):

app命令基类,继承自BaseCommand.

  • add_arguments():重写基类中的add_arguments(),执行parser对象的add_argument方法添加一个 nargs='+'的参数,表示在命令行中可以输入一个或多个应用程序标签。
  • handle():引入django.apps 模块,使用模块中的get_app_config()方法,对命令行中传输进来的args参数列表进行遍历,返回应用程序的配置list,然后遍历应用程序的配置list,逐个传入handle_app_config方法并执行。返回结果。
  • handle_app_config():子类中需重写的方法。未重写的话,会raise异常。
9. LabelCommand(BaseCommand):

label命令基类,继承自BaseCommand.

  • add_arguments():重写基类中的add_arguments(),执行parser对象的add_argument方法添加一个 nargs='+'的参数,表示在命令行中可以输入一个或多个标签。
  • handle():遍历传入的labels列表,执行handle_label方法。返回结果。
  • handle_label():子类中需重写的方法。未重写的话,会raise异常。

color.py

这个模块是用来设置终端颜色显示方案。包含4个方法,一个类。
如果环境变量中没有设置DJANGO_COLORS变量,使用django.utils.termcolors的颜色配置。

sql.py

def sql_flush(style, connection, only_django=False, reset_sequences=True, allow_cascade=False):

返回一个用来刷新数据库的sql语句列表。

emit_pre_migrate_signal(verbosity, interactive, db, **kwargs):

为每个应用程序发出预迁移信号。

emit_post_migrate_signal(verbosity, interactive, db, **kwargs):

为每个应用程序发出迁移后信号。

templates.py

class TemplateCommand(BaseCommand):

此类是用来复制Django app 布局模板或Django project 布局模板到指定的目录中,来创建app或project。
此中包含9个方法。

  • add_arguments(self, parser):添加命令行参数,包括name,directory,–template,–extension,–name
  • handle(self, app_or_project, name, target=None, **options):主要执行的创建app或project的逻辑方法。
  • handle_template(self, template, subdir):明确app或project模板的地址。
  • validate_name(self, name, name_or_dir=‘name’):验证name,并查看是否可以导入,如果可以导入,证明已存在,raise异常。
  • download(self, url):下载传入的url文件,并返回文件名。
  • splitext(self, the_path):分割传入的文件路径。类似os.path.splitext,增加了对tar文件的特殊处理。
  • extract(self, filename):将给定的文件临时解压缩到,并返回包含提取内容的目录的路径。
  • is_url(self, template): 如果template的地址格式类似url则返回True,
  • make_writeable(self, filename):确保文件是可写的。

utils.py

management的工具集。这里就不展开了,都是很简单的方法。

commands

所有django 内置的子命令。

check.py

检查整个django项目中可能存在的错误。
这个命令引入了core.checks模块。

compilemessages.py

这个命令是Django官方提供的项目国际化命令,这个命令需要配合makemessages命令使用。makemessages命令生成一个po文件,compilemessages把po文件编译生成mo文件。
具体国际化的使用方式,我从网上浏览学习的时候发现了这个文章,介绍的很不错。https://www.jb51.net/article/143337.htm大家有兴趣的可以去学习。

createcachetable.py

当项目的缓存方式使用数据库缓存时,执行此命令自动生成缓存使用数据库表。python manage.py createcachetable

dbshell.py

python manage.py dbshell
Django 会自动进入在settings.py中设置的数据库,如果是 MySQL 或 postgreSQL,会要求输入数据库用户密码。

diffsettings.py

我们在使用djnago项目的时候,都会根据需要,配置项目中settings.py。Django默认的settings是django.conf.global_settings.py。如果我们需要对照我们写的settings与默认settings的区别,可以使用此命令。
django在编译时,先载入global_settings.py中的配置,然后加载指定的settings文件,重写改变的设定。
在其他module中,如果希望访问settings文件,可以使用from django.conf import settings来导入。不要导入global_settings或者我们自己写的settings。因为,django.conf.setting提取了global_settings和我们自己写的settings里面的内容。相比直接导入自己写的settings文件和global_settings文件,它提供给我们的是一个接口。可以实现解耦的作用。

dumpdata.py

此命令用于导出项目数据库中的数据
python manage.py dumpdata -o /home/b.json accounts.User --indent 2
-o 后面接输出文件路径
后边的accounts.User 是app名和model名
–indent 可以设置导出的格式。

flush

此命令可以清空数据库中所有数据,留下空表

inspectdb

Django用来反向生成Model的方法。此命令可以把配置中连接的数据库中的数据表,反向生成在指定app下的model中。
python manage.py inspecdb > [your app name]\models.py

loaddata

主要用于单元测试时测试数据的导入。

makemessages

国际化命令,见上compilemessages命令。

makemigrations

python manage.py makemigrations这个命令是记录我们对models.py的所有改动,并且将这个改动迁移到migrations这个文件下生成一个文件例如:0001文件。

migrate

此命令是把执行makemigrations之后所记录的改动,执行到数据库。

runserver

开发测试时常用到的,用来在本地通过Django内置服务器启动项目。

sendtestemail

发送测试邮件,验证配置中的邮箱是否有效。

shell

python manage shell 命令,将自动帮你处理DJANGO_SETTINGS_MODULE。这样在命令行中,即可直接对项目进行操作无需在配置环境变量。

showmigrations

执行python manage showmigrations 命令,将在终端看到当前项目可以获得的所有迁移信息。

sqlflush

打印出将数据库中的所有表返回到刚安装后的状态所需的SQL语句列表。即如何实现的flush命令。

sqlmigrate

打印出 migration 所需执行的sql语句。

sqlsequencereset

打印用于顺序重置给定应用程序名称的SQL语句。

squashmigration

压缩合并迁移文件

startapp

新建一个app。

startproject

新建一个项目。

test

用来测试项目模块功能。命令行中需输入要测试的功能模块
python manage.py test …

testserver

启用一个测试开发服务,命令行输入fixture路径来提供需要用到数据。

总结

core.management 是管理Django命令的模块。其中包含的内置命令是用来快速搭建项目并为开发者提供一些便捷的开发测试环境。
在准备使用这一模块建立属于自己的命令或者想对源码有深入的理解,需要提前熟悉以下Python库:
argparse,concurrent.futures。
整个management模块简单理解其实就是基于argparse库的二次开发。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Django框架的源码解析 的相关文章

  • 如何使用固定的 pandas 数据框进行动态 matplotlib 绘图?

    我有一个名为的数据框benchmark returns and strategy returns 两者具有相同的时间跨度 我想找到一种方法以漂亮的动画风格绘制数据点 以便它显示逐渐加载的所有点 我知道有一个matplotlib animat
  • Python 多处理示例不起作用

    我正在尝试学习如何使用multiprocessing但我无法让它发挥作用 这是代码文档 http docs python org 2 library multiprocessing html from multiprocessing imp
  • pandas 替换多个值

    以下是示例数据框 gt gt gt df pd DataFrame a 1 1 1 2 2 b 11 22 33 44 55 gt gt gt df a b 0 1 11 1 1 22 2 1 33 3 2 44 4 3 55 现在我想根据
  • 如何等到 Excel 计算公式后再继续 win32com

    我有一个 win32com Python 脚本 它将多个 Excel 文件合并到电子表格中并将其另存为 PDF 现在的工作原理是输出几乎都是 NAME 因为文件是在计算 Excel 文件内容之前输出的 这可能需要一分钟 如何强制工作簿计算值
  • Spark的distinct()函数是否仅对每个分区中的不同元组进行洗牌

    据我了解 distinct 哈希分区 RDD 来识别唯一键 但它是否针对仅移动每个分区的不同元组进行了优化 想象一个具有以下分区的 RDD 1 2 2 1 4 2 2 1 3 3 5 4 5 5 5 在此 RDD 上的不同键上 所有重复键
  • 为 pandas 数据透视表中的每个值列定义 aggfunc

    试图生成具有多个 值 列的数据透视表 我知道我可以使用 aggfunc 按照我想要的方式聚合值 但是如果我不想对两列求和或求平均值 而是想要一列的总和 同时求另一列的平均值 该怎么办 那么使用 pandas 可以做到这一点吗 df pd D
  • Python tcl 未正确安装

    我刚刚为 python 安装了graphics py 但是当我尝试运行以下代码时 from graphics import def main win GraphWin My Circle 100 100 c Circle Point 50
  • 从 scikit-learn 导入 make_blobs [重复]

    这个问题在这里已经有答案了 我收到下一个警告 D Programming Python ML venv lib site packages sklearn utils deprecation py 77 DeprecationWarning
  • 运行多个 scrapy 蜘蛛的正确方法

    我只是尝试使用在同一进程中运行多个蜘蛛新的 scrapy 文档 http doc scrapy org en 1 0 topics practices html但我得到 AttributeError CrawlerProcess objec
  • 在 NumPy 中获取 ndarray 的索引和值

    我有一个 ndarrayA任意维数N 我想创建一个数组B元组 数组或列表 其中第一个N每个元组中的元素是索引 最后一个元素是该索引的值A 例如 A array 1 2 3 4 5 6 Then B 0 0 1 0 1 2 0 2 3 1 0
  • ExpectedFailure 被计为错误而不是通过

    我在用着expectedFailure因为有一个我想记录的错误 我现在无法修复 但想将来再回来解决 我的理解expectedFailure是它会将测试计为通过 但在摘要中表示预期失败的数量为 x 类似于它如何处理跳过的 tets 但是 当我
  • Python - 在窗口最小化或隐藏时使用 pywinauto 控制窗口

    我正在尝试做的事情 我正在尝试使用 pywinauto 在 python 中创建一个脚本 以在后台自动安装 notepad 隐藏或最小化 notepad 只是一个示例 因为我将编辑它以与其他软件一起使用 Problem 问题是我想在安装程序
  • 在 Django 中定期运行一个函数

    我在 Django 中编写一个应用程序来监视一组服务器中的某些服务 我希望定期更新观点 到目前为止 我已经研究过编写自定义管理命令 链接在这里 http docs djangoproject com en dev howto custom
  • Nuitka 未使用 nuitka --recurse-all hello.py [错误] 编译 exe

    我正在尝试通过 nuitka 创建一个简单的 exe 这样我就可以在我的笔记本电脑上运行它 而无需安装 Python 我在 Windows 10 上并使用 Anaconda Python 3 我输入 nuitka recurse all h
  • 检查所有值是否作为字典中的键存在

    我有一个值列表和一本字典 我想确保列表中的每个值都作为字典中的键存在 目前我正在使用两组来确定字典中是否存在任何值 unmapped set foo set bar keys 有没有更Pythonic的方法来测试这个 感觉有点像黑客 您的方
  • 用于运行可执行文件的python多线程进程

    我正在尝试将一个在 Windows 上运行可执行文件并管理文本输出文件的 python 脚本升级到使用多线程进程的版本 以便我可以利用多个核心 我有四个独立版本的可执行文件 每个线程都知道要访问它们 这部分工作正常 我遇到问题的地方是当它们
  • 对输入求 Keras 模型的导数返回全零

    所以我有一个 Keras 模型 我想将模型的梯度应用于其输入 这就是我所做的 import tensorflow as tf from keras models import Sequential from keras layers imp
  • 在python中,如何仅搜索所选子字符串之前的一个单词

    给定文本文件中的长行列表 我只想返回紧邻其前面的子字符串 例如单词狗 描述狗的单词 例如 假设有这些行包含狗 hotdog big dog is dogged dog spy with my dog brown dogs 在这种情况下 期望
  • 在 Python 类中动态定义实例字段

    我是 Python 新手 主要从事 Java 编程 我目前正在思考Python中的类是如何实例化的 我明白那个 init 就像Java中的构造函数 然而 有时 python 类没有 init 方法 在这种情况下我假设有一个默认构造函数 就像
  • PyAudio ErrNo 输入溢出 -9981

    我遇到了与用户相同的错误 Python 使用 Pyaudio 以 16000Hz 录制音频时出错 https stackoverflow com questions 12994981 python error audio recording

随机推荐

  • 将一句汉字文本转化为对应的拼音

    语音合成时 数据预处理 需要将一句汉字文本转化为对应的拼音 其中 汉字文本包含标点符号 而拼音含有声调不含标点符号 具体格式举例如下 输入 设置文件名 怎么样 输出 she4 zhi4 wen2 jian4 ming2 zen3 me5 y
  • JAVA单元测试框架-7-invocationCount和invocationTimeOut

    1 invocationCount 字面意思就是调用的次数统计 就是这个测试用例被调用执行的次数 2 invocationTimeOut 字面意思是调用的超时 设置一个最大的毫秒数来计算执行多次后总共耗时多少 耗时值不能超过设置的最大毫秒数
  • PL0语言出错编号表

    Notes 编译原理第 3 版的书貌似没有这个表 做实验和写课设的时候很不方便 把别人拍的第 2 版书上的这个表在这备份一份 Error Code Table 出错编号 出错原因 1 常数说明中的 写成 2 常数说明中的 后应是数字 3 常
  • 为什么JAVA文件中只能含有一个Public类

    1 一个 java 源文件中是否可以包括多个类 不是内部类 有什么限制 答 可以有多个类 但只能有一个public的类 并且public的类名必须与文件名相一致 2 为什么一个文件中只能有一个public的类 答 编译器在编译时 针对一个j
  • 编程中常用设计模式

    单例模式 单例模式的优点 1 在单例模式中 活动的单例只有一个实例 对单例类的所有实例化得到的都是相同的一个实例 这样就防止了其他对象对自己的实例化 确保所有的对象都访问同一个实例 2 单例模式具有一定的伸缩性 类自己来控制实例化进程 类就
  • 【云风skynet】详解skynet的多核高并发编程丨actor模型丨游戏开发丨游戏服务端开发丨多线程丨Linux服务器开发丨后端开发

    skynet中多核高并发编程给我们的启发 1 多核并发编程 2 actor模型详解 3 手撕一个万人同时在线游戏 视频讲解如下 点击观看 云风skynet 详解skynet的多核高并发编程丨actor模型丨游戏开发丨游戏服务端开发丨多线程丨
  • C++设计日志:读写定界符文件

    C 设计日志 读写定界符文件 荣耀 2003 我将撰写的 C 设计实践 系列文章 会讲到一些数据处理系统设计方法 我并不希望文章局限于特定数据库产品 我也不喜欢空对空地讲述太多抽象道理 我必须编写一些模拟数据库操作的代码 用于读写定界符文件
  • notepad linux,适用于Linux的11种最佳Notepad ++替代品

    Notepadd 是一个完全免费的源代码编辑器 作为Windows上的 Notepad的替代品而创建 基于Scintilla在C 中编写 并实现了Win32 API和STL 以确保程序大小小 执行速度快 这些功能使其成为一个家族开发者名字
  • 有哪些值得推荐的LoRa模块?

    随着物联网技术的发展 LoRa模块已经被应用到各行各业 其在市场上受欢迎程度非比一般 业内对于LoRa技术的发展前景有着非常乐观的看法 目前国内生产LoRa相关产业的企业数量已超过数千家 创新微MinewSemi在LoRa模块方面也积累了一
  • inux启动输入密码出现module is unknown

    当启动输入密码无法登录时 重启按下e键 在linux16这一行中找到ro 将ro改变为rw 并在结尾添加init bin sh 查看 var log secure日志文件中排查错误 最终发现是 lib security pam limits
  • 2021年全国职业院校技能大赛(中职组)网络安全竞赛试题(1)详细解析教程

    2021年全国职业院校技能大赛 中职组 比赛环境可以私信博主获得 网络安全竞赛讨论可以加扣群421865857 网络安全竞赛试题 1 总分100分 赛题说明 一 竞赛项目简介 网络安全 竞赛共分A 基础设施设置与安全加固 B 网络安全事件响
  • cpp: Abstract Factory Pattern

    Gold h 此文件包含 Gold 类 Abstract Factory Pattern C 14 2023年4月30日 涂聚文 Geovin Du Visual Studio 2022 edit pragma once ifndef GO
  • C++中vector使用方法

    目录 1 基本操作 2 算法 3 输出vector的中的元素 三种方法 在C 中 vector是一个十分有用的容器 是一个能够存放任意类型的动态数组 能够增加和压缩数据 vector的优点 1 可将容器中元素翻转 复制元素 找到元素值对应的
  • 信号与系统学习总结 第三章 傅里叶变换

    信号与系统学习总结 第三章 傅里叶变换 章节思路 傅里叶级数 傅里叶变换 周期信号傅里叶变换 抽样定理 傅里叶级数 满足狄利赫里条件的周期函数f t 可以分解为a0 直流分量 cos n 1t 和sin n 1t 的和 根据欧拉公式 还可以
  • C语言实现银行家算法

    问题描述 银行家算法描述 假设系统中有n个进程 m种资源 对于该道题目而言 n为5 m为4 定义一个5 4的allocation分配矩阵 用来表示对所有进程的资源分配情况 Allocation i j k 表示进程Pi已经获得j资源k个 同
  • 区块链节点和区块区别_区块链中主链和侧链的区别

    区块链尤其是公有链都有主网和测试网 主网是区块链社区公认的可信区块链网络 其交易信息被全体成员所认可 有效的区块在经过区块链网络的共识后会被追加到主网的区块账本中 按区块链网络的独立程度 分为两种 主链 侧链 两者的区别如下 1 主链指正式
  • Windows Terminal + wsl 之调整ls命令颜色、底色方法

    1 显示预设置 执行 cd dircolors p gt dircolors 2 接着修改 用vi 可预览效果 vi dircolors 找到如下条目 修改字体颜色和背景色如下 STICKY OTHER WRITABLE 30 46 dir
  • Matplotlib

    文章目录 1 什么是matplotlib 2 实现一个简单的matplotlib绘图 3 matplotlib图像结构 4 matplotlib基础绘图 多个坐标系显示 plt subplots 面向对象的画图方法 5 常见图形种类 1 什
  • 浏览器控制台反调试

    反反调试 常规方法 前文所提到的几个反调试方法 除debugger方式外 均判断是否打开开发者工具 破解的方式也很简单 基本只需两步就可以搞定 将开发者工具以独立窗口形式打开 打开开发者工具后再打开网址 反反调试 debugger方法 若使
  • Django框架的源码解析

    简述 从django admin startproject name 开始 小结 django core management init py 1 5个方法 2 ManagementUtility 类 小结 base py 1 2个方法 2