【Python】从0开始的Django基础
Django框架基础
- unit01
- 一、`Django`基础
- 1.1 什么是`Django?`
- 1.2 安装与卸载
- 1.2.1 `Python`与`Django`的版本
- 1.2.2 安装
- 1.2.3 查看`Django`版本
- 1.2.4 卸载
- 二、`Django`项目
- 2.1 概述
- 2.2 创建项目
- 2.3 启动项目
- 2.4 项目的目录结构
- 2.5 配置
- 三、`URL` 调度器
- 3.2 定义`URL`路由
- 3.2 定义首页的路由
- 3.3 便捷管理路由及视图函数
- 3.4 路径转换器
- 3.4.1 `int`
- 3.4.2 `str`
- 3.4.3 `slug`
- 3.4.4 `uuid`
- 3.4.5 `path`
- 四、模块
- 4.1 创建模块
- 4.2 注册模块
- 4.3 分布式路由
- unit02
- 一、`DTL`
- 1.1 什么是`DTL?`
- 1.2 模板配置
- 1.3 `render()`函数
- 二、`DTL`
- 2.1 变量
- 2.2 标签
- 2.2.1 `for`标签
- 2.2.2 `if`标签
- 2.2.3 表单
- 2.2.4 `csrf_token`
- 2.2.5 静态资源
- 2.2.5.1 静态资源的配置
- 2.2.5.2 访问静态资源
- unit03
- 一、`DTL`
- 1.1 标签
- `include`标签
- `cycle`标签
- 注释
- 1.2 过滤器
- `safe`
- `striptags`
- `truncatechars`
- `floatformat`
- `date`
- `yesno`
- `join`
- 二、`Http`请求
- 3.1 属性
- `method`属性
- `POST`属性
- `GET`属性
- 具有浏览框的表单的限制
- `FILES`属性
- 3.2 `QueryDict`对象
- unit04
- 一、`HTTP`响应
- 二、模型
- 2.1 概述
- 2.2 配置
- 2.3 创建模型
- 2.4 数据类型
- 2.5 数据迁移
- 三、管理器
- 四、`QuerySet`
- `all()`方法
- `get()`
- `filter()`
- `first()`
- `last()`
- `order_by()`
- 查询谓语
- `F`函数
- unit05
- 一、模型
- `values()`
- `values_list()`
- `only()`
- `query`
- `Q`函数
- `exclude()`
- `count()`
- `aggregate()`
- `annotate`
- unit 06
- 一、`HttpRequest`对象
unit01
一、Django基础
1.1 什么是Django?
Django是一个基于Python语言的、开源的、重量级的WEB开发框架。
Django适用于开发各类WEB应用程序,包括但不限于电商网站、博客等。
Django的官网:http://www.djangoproject.com
1.2 安装与卸载
1.2.1 Python与Django的版本
| Django 版本 | Python 版本 |
|---|---|
| 3.2 | 3.6, 3.7, 3.8, 3.9, 3.10 (在 3.2.9 中就已经加入了) |
| 4.0 | 3.8,3.9,3.10 |
| 4.1 | 3.8,3.9,3.10,3.11(4.1.3 添加) |
| 4.2 | 3.8, 3.9, 3.10, 3.11, 3.12 (4.2.8 添加) |
| 5.0 | 3.10、3.11、3.12 |
1.2.2 安装
$ pip3 install django[==version]
1.2.3 查看Django版本
$ python3 -m django --version
$ django-admin --version
1.2.4 卸载
$ pip3 uninstall django
二、Django项目
2.1 概述
Django项目由一个或多个应用程序(指模块)组成,在每个模块中有相对独立的路由、视图、模型、模板等。
2.2 创建项目
$ django-admin startproject projectname
2.3 启动项目
第一步:在命令行输入以下命令:
$ python3 manage.py runserver [[address:]port]
如:
$ python3 manage.py runserver
$ python3 manage.py runserver 8888
$ python3 manage.py runserver 0.0.0.0:8888
第二步:启动浏览器输入地址即可
在Pycharm中启动Django项目
第一步:鼠标右击manage.py,然后从弹出的快捷菜单中选择Modify Run Configuration,再在Parameters文本框中输入runserver [[address:]port]
第二步:鼠标右击manage.py,然后从弹出的快捷菜单中选择Run manage
2.4 项目的目录结构
djangoBasic/,项目根目录
├── db.sqlite3,默认的sqlite3数据库文件
├── djangoBasic,内层目录 -- 包
│ ├── asgi.py
│ ├── __init__.py
│ ├── settings.py,项目配置文件
│ ├── urls.py,根路由文件
│ └── wsgi.py
└── manage.py,入口文件
2.5 配置
# 项目的根目录
BASE_DIR = Path(__file__).resolve().parent.parent# 是否开启调试模式:在开发环境中需要开启调试模式,在生产环境中需要关闭调试模式
DEBUG = True# 已安装且启动的应用程序(模块)
INSTALLED_APPS = []# 已安装且启用的中间件
MIDDLEWARE = []# 项目的根路由
ROOT_URLCONF = 'djangoBasic.urls'# 模板(`Templates`)的配置
TEMPLATES = []# 数据库的配置
DATABASES = {}# 语言代码
LANGUAGE_CODE = 'zh-Hans'# 时区
TIME_ZONE = 'Asia/Shanghai'
三、URL 调度器
URL 调度器也称为URL路由,它允许程序员自由的设计URL地址
3.2 定义URL路由
第一步:在根路由文件(urls.py)中定义路由
path(router,view)
URL地址为字母、数字、下划线、短横线的组合
如:
path('hello/',????)
第二步:定义(视图)函数
def function_name(request):......
如:
def hello(request):print('Hello Django')
相对完整的示例代码如下:
# 函数
def hello(request):print('Hello,Django')# 路由
urlpatterns = [# ....#代表的是当通过 http://127.0.0.1:8000/hello/访问时,将调用hello函数path('hello/',hello),
]
运行结果如下:

此时产生错误的原因是:(视图)函数没有返回响应对象
在Django.http包中提供了HttpResponse类,它用于完成Http响应,所以:
from django.http import HttpResponse
# 函数
def hello(request):return HttpResponse('Hello,Django')
此时的运行结果如下:

第三步:通过链接或表单的action来访问相关的路由
此时产生了另外的两个问题:
第一:如果来访问http://127.0.0.1:8000时将产生404 错误 – 怎么解决?
第二:现在在urls.py中既有路由又有视图函数 – 不便于管理 – 如何便捷管理?
3.2 定义首页的路由
path('',视图函数)
示例代码
from django.http import HttpResponsedef index(request):return HttpResponse('Index Page')urlpatterns = [# 首页路由path('',index),
]
3.3 便捷管理路由及视图函数
为了便于管理视图函数,强烈建议将视图函数存储到views.py中,然后再在urls.py中引用该模块即可
urls.py的示例代码如下:
from django.contrib import admin
from django.urls import path
from . import viewsurlpatterns = [path('admin/', admin.site.urls),path('', views.index),path('hello/', views.hello),
]
views.py的示例代码如下:
from django.http import HttpResponsedef hello(request):return HttpResponse('Hello Django')def index(request):return HttpResponse('Index Page')
对于静态的路由可以直接按需要进行定义,但是对于动态的路由,如访问某一个文章时的ID,此时如何定义?
3.4 路径转换器
路径转换器主要解决动态路由的问题,如:
http://127.0.0.1:8000/user/<id>
路径转换器的基本语法:
path("<类型:参数名称>/<类型:参数名称>",视图函数)
需要注意的是:在定义视图函数时,如果路由中存在路径转换器,那么视图函数也必须存在相同名称的参数
3.4.1 int
int类型的路径转换器自动匹配正整数,类型为int,如:
path("users/<int:id>",views.userinfo),
userinfo的函数代码示例如下:
def userinfo(request,id):.......
3.4.2 str
str类型的路径转换器自动匹配字符串,/除外,类型为str,如:
path("topic/<str:topic>/",views.topic),
3.4.3 slug
slug匹配任意由字母、数字、短横线与下划线组成的字符,其类型为str,如:
path('blog/<slug:title>',views.blog),
3.4.4 uuid
UUID的格式为8-4-4-4-12的十六位进制数字组成,其类型为uuid
Python的uuid模块import uuid# 基于当前服务器ID和时间 uuid.uuid1() # 基于随机数 uuid.uuid4()
3.4.5 path
path 匹配路径,包括/
path('download/<path:path>/',views.download),
组合使用的案例
path('carts/<str:username>/id/<int:id>/',views.carts),path('<str:username>/<int:id>/',views.goods),
四、模块
每个Django项目至少存在一个模块(应用程序)
4.1 创建模块
$ python3 manage.py startapp app_name
如:
$ python3 manage.py startapp users$ python3 manage.py startapp goods
4.2 注册模块
将创建的模块名称添加到配置文件的INSTALLED_APPS列表中,如:
INSTALLED_APPS = [# ...'goods','users',
]
4.3 分布式路由
所谓的分布式路由是将某个模块下以共同字符串开头的路由写在根路由文件中,不同的部分写在模块内部的urls.py中,当访问时系统将自动把两个部分的URL进行拼接。
include()函数位于django.urls模块内,其作用是将当前路由与指定包含文件的路由进行拼接
include("URLS文件")
# urls.py最简陋的样子
from django.urls import path
from . import viewsurlpatterns = [path('',views.index),
]
# views.py最简陋的样子
def index(request):......
unit02
一、DTL
1.1 什么是DTL?
DTL(Django Templates Language),Django模板语言,实际上就是将HTML页面与程序代码进行混合的技术。
1.2 模板配置
#模板配置
TEMPLATES = [{# 模板的引擎'BACKEND': 'django.template.backends.django.DjangoTemplates',# 配置模板文件的路径'DIRS': [BASE_DIR / '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',],},},
]
1.3 render()函数
render()函数位于django.shortcuts模板内:
from django.shortcuts import render
render()函数的语法结构为:
render(request,template_name,context=None)
request代表的HttpRequest 对象
template_name指要渲染的模板文件路径及名称
context指要传递到模板的数据,其类型必须为dict
二、DTL
模板文件内可以使用:注释、变量、标签等
2.1 变量
# 变量
{{ variable_name }}
# 列表或元组
{{ variable_name.index }}
# 字典
{{ variable_name.key }}
#对象属性
{{ variable_name.property }}
#对象方法
{{ varible_name.method s}}
2.2 标签
标签是指模板中进行逻辑控制的代码,如分支结构、循环结构等,标签的基本语法结构为:
{% 标签名称 %}或者{% 开始标签名称 %}
...
...
{% 结束标签名称%}
2.2.1 for标签
{% for variable in iterable %}......
{% endfor %}
{% for variable in iterable %}......
{% empty %}......
{% endfor %}
在DTL中为循环提供了在其内部使用的变量:
| 变量 | 描述 |
|---|---|
forloop.counter | 正向循环计数器,从1开始 |
forloop.counter0 | 正向循环计数器,从0开始 |
forloop.revcounter | 反向循环计数器,从1开始 |
forloop.revcounter0 | 反向循环计数器,从0开始 |
forloop.first | 当前循环为第一次循环时为True |
forloop.last | 当前循环为最后一次循环时为True |
2.2.2 if标签
{% if condition %}...
{% endif %}{% if condition %}...
{% else %}...
{% endif %}{% if condition %}...
{% elif condition %}...
{% elif condition %}...
{% else %}...
{% endif %}
2.2.3 表单
1.表单的action属性值为空或者省略action属性,代表表单将提交给自身
2.表单的method属性值为空或者省略method属性,代表表单的提交方式为get
2.2.4 csrf_token
{% csrf_token %}
在以post方式提交的表单内必须在使用{% csrf_token %} 产生令牌
当在表单内添加{% csrf_token %}标签后将产生个名称为csrfmiddlewaretoken的隐藏域
<input type="hidden" name="csrfmiddlewaretoken" value="7erwqas">
2.2.5 静态资源
静态资源是网站用于布局的样式文件、图片文件及脚本文件。
2.2.5.1 静态资源的配置
# 静态文件的路由
STATIC_URL = '/static/'# 静态文件的位置
STATICFILES_DIRS = [BASE_DIR / 'static'
]
2.2.5.2 访问静态资源
第一步:通过{% load static %}标签加载static标签
{% load static %}
第二步:在模板文件中通过static标签来访问静态资源
{% static '静态文件的的路径及名称' %}
被静态文件引用的文件(如在CSS文件内引用图片),因为该静态文件没有经过模板引擎处理,所以不能使用{% static %}标签来加载 – 只能通过其相对路径实现
unit03
一、DTL
1.1 标签
include标签
include标签用于在一个模板文件中包含另外一个模板文件,语法结构为:
{% include '被包含的模板文件的位置及名称' with variable=value variable=value %}
cycle标签
当每次遇到cycle标签时都会产生一个值,第一次产生第一个值,第二个产生第二值,依次类推。当值用尽时,再次遇到该标签时,就产生第一个值。
{% cycle 'value1' 'value2' 'value3' ... %}
注释
{# 这是一个单行注释 #}{% comment %}第一行第二行
{% endcomment%}
1.2 过滤器
过滤器用于转换变量或标签参数的值,其基本语法结构为:
{{ 变量名称|过滤器:参数:参数 }}
safe
当通过变量向模板文件传递HTML内容时,在模板中将把HTML内容中的特殊符号进行替换操作,如>替换为>,<替换为<。
之所以进行替换的原因是为了防止XSS(Cross-site scripting)攻击(译为跨站脚本攻击)。举例说明:
假设在某个网站中对于某条新闻发表了评论,内容如下:
这篇新闻很好
<script>
while(true){window.alert("哈哈哈");
}
</script>
当用户发表该评论后,其内容将写入到服务器的数据库 — 不会产生任何问题
但是,如果该评论被某个用户通过浏览器进行访问时,那么其中的
<script>
while(true){window.alert("哈哈哈");
}
</script>
将被浏览器认为是JavaScript脚本 - - 并且为死循环!!!
如何解决 – 将输入的>、<等替换为对于HTML实体,如果此时再有用户输入以下评论:
这篇新闻很好
<script>
while(true){window.alert("哈哈哈");
}
</script>
将输入的>、<等替换为对于HTML实体的结果为:
这篇新闻很好<script>
while(true){window.alert("哈哈哈");
}
</script>
在Django模板中如果认为传递到模板的HTML内容为安全内容,则需要通过safe过滤器
striptags
striptags过滤器用于去掉所有的HTML标记
truncatechars
truncatechars过滤器用于截断字符串并且指定长度
floatformat
floatformat过滤器用于对浮点数进行四舍五入
date
date过滤器用于格式化日期和时间
| 格式 | 描述 |
|---|---|
Y | 年 |
m | 月,带有前导零 |
d | 日,带有前导零 |
H | 小时,带有前导零 |
i | 分钟,带有前导零 |
s | 秒,带有前导零 |
yesno
将True,False,None(可选)的值映射到以逗号分隔的字符串
join
join过滤器使用指定的分隔符将列表成员连接成字符串
二、Http请求
当一个url被请求时,Django会自动创建HttpRequest对象,在该对象内包含的请求的元数据,然后再加载相应的视图函数,并且将HttpRequest对象作为视图函数的第一个参数
# 当前request参数代表的就是HttpRequest对象
def function_name(request):......
HttpRequest对象存在的属性除非另有说明外都是只读属性
3.1 属性
method属性
method属性用于获取HTTP的请求方式,返回结果为英文大写字母
str HttpRequest.method
POST属性
HttpRequest 对象的POST 属性将返回django.http.request.QueryDict的对象,包含HTTP POST提交的数据,其语法结构为:
QueryDict HttpRequest.POST
GET属性
HttpRequest 对象的GET属性将返回django.http.request.QueryDict的对象,包含HTTP GET提交的数据,其语法结构为:
QueryDict HttpRequest.GET
具有浏览框的表单的限制
A.表单的提交方式只能为POST
B.必须设置表单的enctype="multipart/form-data"属性
<form method="post" enctype="multipart/form-data">......
</form>
FILES属性
FILES属性返回django.utils.datastructures.MultiValueDict对象
对于上传的文件超过2.5MB 将返回TemporaryUploadedFile对象,否则返回InMemoryUploadedFile对象,它们都继承自UploadedFile对象,而UploadedFile继承自File对象,所以可以访问File对象的name、size等属性
3.2 QueryDict对象
QueryDict对象继承自django.utils.datastructures.MultlValuDict对象,MultiValue对象的方法有:
get()用于获取指定key的值,否则返回default
MultiValue.get(key,default=None)
getlist()用于获取指定key的值,否则返回default
list MultiValue.getlist(key,default=None)
keys()返回由键名组成的列表
list MultiValue.keys()
values()返回由键值组成的列表
list MultiValue.value()
items()
dict()返回由键名和键值组成的字典
dict MultiValue.dict()
unit04
一、HTTP响应
每一个视图函数必须存在一个响应对象。
render()函数返回是HttpResponse对象,它的基本原理是将传递的模板文件与字典数据进进行混合后返回一个字符串的结果,该结果带入到HttpResponse对象的参数中。
HttpReponse对象位于django.http模板内
from django.http import HttpResponse
其构造函数的结构为:
HttpResponse(content,content_type='text/html')
其中
content 代表的是响应的字符串信息
content_type 代表的响应的类型,默认为text/html
常用的响应类型有
| 响应类型 | 说明 |
|---|---|
text/plain | 文本 |
text/html | HTML |
text/css | CSS |
text/javascript、application/javascript | JS |
application/json | JSON |
JsonResponse对象
JsonResponse 对象继承自HttpResponse对象,其作用是返回JSON响应,语法结构为:
#默认情况下,只能为字典对象转换为JSON格式的字符串
#对于非字典数据(列表数据)必须将safe参数设置为False
JsonResponse(data,safe=True)
二、模型
2.1 概述
模型 (Model)是Django为了构建和操纵数据库而提供的抽象层。
模型用于表示和操纵数据表及其记录。
所以首先通过MySQL客户端创建数据库,如:
CREATE DATABASE IF NOT EXISTS knowbase;SHOW DATABASES;
2.2 配置
DATABASES = {'default': {# 数据库引擎的类型'ENGINE': 'django.db.backends.mysql',# MySQL数据库服务器的地址'HOST':'127.0.0.1',# MySQL数据库服务器的端口号'PORT':3306,# MySQL数据库服务器用户的用户名'USER':'root',# MySQL数据库服务器用户的密码'PASSWORD':'123456',# MySQL数据库服务器的数据库名称'NAME': 'knowbase',}
}
2.3 创建模型
模型需要在模块下的models.py文件中进行定义,所有的模型都必须继承自django.db.models.Model类,结构如下:
class ClassName(models.Model):field_name = models.数据类型([选项[,...]])......
2.4 数据类型
| 数据类型 | 描述 |
|---|---|
CharField(max_length=长度) | VARCHAR |
SmallIntegerField() | SMALLINT |
PositiveSmallIntegerField() | SMALLINT UNSIGNED |
IntegerField() | INT |
PositiveIntegerField() | INT UNSIGNED |
BigIntegerField() | BIGINT |
PositiveBigIntegerField() | BIGINT UNSIGNED |
BooleanField | TINYINT(1) |
FloatField(max_digits=数字总长度,decimal_places=小数点后的数字长度) | FLOAT(M,D) |
DecimalField(max_digits=数字总长度,decimal_places=小数点后的数字长度)) | DOUBLE(M,D) |
TextField() | LONGTEXT |
DateField() | DATE |
TimeField() | TIME |
DateTimeField(auto_now_add=是否自动记录创建时间,auto_now=是否自动记录修改时间) | DATETIME |
2.5 数据迁移
第一步:生成移迁文件
$ python3 manage.py makemigrations
第二步:数据迁移
$ python3 manage.py migrate
add过滤器用于进行字符串的拼接,如{{ username|add:'ABC'}} <!--假定username变量的值为Tom,那么拼接完的结果为 TomABC -->
三、管理器
在Django的模型中要实现数据表中记录的管理是通过管理器来实现的
Django为每个模型提供了一个名称为objects的管理器,它作为模型的属性进行访问
模型类.objects
如:
from .models import Bookprint(type(Book.objects))
all()方法
all()方法用于返回管理器的全部对象,其语法结构为:
QuerySet Manager.all()
get()方法
get()方法用于获取单个对象,如果没有符合条件的记录或者可以查询到多个记录都会产生异常
Object Manager.get(condition[,....])
如果以主键字段进行查找的话,可以写为
Book.objects.get(id=5) # 或者 Book.objects.get(pk=5)
四、QuerySet
QuerySet称为查询集或者查询结果集,用于表示与管理器相关查询结果。
Queryset可以进行切片、复制及过滤等操作
all()方法
all()方法用于返回结果集中的全部对象,其语法结构为:
QuerySet QuerySet.all()
get()
get()方法用于获取单个对象,如果没有符合条件的记录或者可以查询到多个记录都会产生异常
Object QuerySet.get(condition[,...])
filter()
filter()方法用于根据指定的条件对结果集进行过滤,返回一个新的结果集
QuerySet QuerySet.filter(字段名称__查询谓语=值[,...])
first()
first()方法用于返回结果集中的第一条记录
object QuerySet.first()
last()
last()方法用于返回结果集中的最后一条记录
object QuerySet.last()
order_by()
order_by()方法用于对结果集进行排序
QuerySet QuerySet.order_by('字段名称'[,....])
降序排列时,字段名称的写法为-字段名称
查询谓语
exact,相等(区分大小写),可以在使用时直接用=进行操作iexact,相等,不区分大小写gt,大于gte,大于等于lt,小于lte,小于等于in,在指定值内,字段名称__in=(value,value,vlaue,..)range,区间范围同,字段名称__range=(min,max)contains,包含指定的字符,区分大小写icontains,包含指定的字符,不区分大小写startswith,以指定字符开头,区分大小写istartswith,以指定字符开头,不区分大小写endswith,以指定字符结尾,区分大小写iendwith,以指定字符结尾,不区分大小写
F函数
from django.db.models import F
在查询时使用到某表内的字段时,必须通过F函数将其引用
Book.objects.filter(sale_price__gte=200+F('cost_price'))
unit05
一、模型
values()
values()方法用于限制返回的字段,可迭代对象为字典
QuerySet QuerySet.values(*fields)
结果样式如:
<QuerySet [{'id': 1}, {'id': 2}]>
values_list()
values_list()方法用于限制返回的字段,可迭代对象为元组
QuerySet QuerySet.values_list(*fields)
结果样式如:
<QuerySet [(1,), (2,)]>
only()
only()方法用于限制返回的字段,可迭代对象为模型实例
QuerySet QuerySet.only(*fields)
结果样式如:
<QuerySet [<Book: Book object (1)>, <Book: Book object (2)>]>
query
query属性返回当前查询结果集对应的SQL语句
str QuerySet.query
Q函数
Q函数用于对查询表达式进行连接,然后进行逻辑运算
from django.db.models import Q
exclude()
exclude()方法返回不符合指定条件的记录
Queryset QuerySet.exclude(条件表达式)
count()
count()方法用于获取结果集包含的记录总数
int QuerySet.count()
aggregate()
聚合函数有Count、Max、Min、Sum和Avg,位于
from django.db.models import Count,Sum,Avg,Max,Min
dict QuerySet.aggregate(key=Count('field_name'))
dict QuerySet.aggregate(key=Max('field_name'))
dict QuerySet.aggregate(key=Min('field_name'))
dict QuerySet.aggregate(key=Sum('field_name'))
dict QuerySet.aggregate(key=Avg('field_name'))
annotate
aggregate()方法用于对整个Queryset进行聚合操作,而annotate()方法用于对特定的字段进行聚合
Queryset QuerySet.annotate(key=Count('field_name'))
Queryset QuerySet.annotate(key=Max('field_name'))
Queryset QuerySet.annotate(key=Min('field_name'))
Queryset QuerySet.annotate(key=Sum('field_name'))
Queryset QuerySet.annotate(key=Avg('field_name'))
unit 06
一、HttpRequest对象
path属性
path属性用于获取请求URL
str HttpRequest.path
get_full_path()方法
get_full_path()方法用于获取请求URL及查询字符串
str HttpRequest.get_full_path()
redirect() 函数
redirect()函数用于跳转到其他URL
from django.shortcuts import redirectredirect(to)相关文章:
【Python】从0开始的Django基础
Django框架基础 unit01一、Django基础1.1 什么是Django?1.2 安装与卸载1.2.1 Python与Django的版本1.2.2 安装1.2.3 查看Django版本1.2.4 卸载 二、Django项目2.1 概述2.2 创建项目2.3 启动项目2.4 项目的目录结构2.5 配置 三、URL 调度器3.2 定义URL路由3.2 定义首页的路由3.…...
红黑树(数据结构篇)
数据结构之红黑树 红黑树(RB-tree) 概念: 红黑树是AVL树的变种,它是每一个节点或者着成红色,或者着成黑色的一棵二叉查找树。对红黑树的操作在最坏情形下花费O(logN)时间,它的插入操作使用的是非递归形式实现红黑树的高度最多是…...
高级视频编码器性能对比(H265、VP9、AV1)
1、背景介绍 目前在视频编解码器中,H264已经成为绝对的主流,被大部分设备、浏览器所支持。虽然有更先进的编码器推出,但是受限于推广速度和设备支持成本,一直未能成为主流。 今年公司目标是持续降本增效,现在将”屠刀…...
示例:WPF中DataGrid简单设置合并列头
一、目的:应用DataGridTemplateColumn列模板,去拆分列头和单元格布局的方式设置列头合并样式 二、实现 效果如下 三、环境 VS2022 四、示例 应用DataGridTemplateColumn自定义列头信息和单元格信息 <DataGrid AutoGenerateColumns"False"…...
Matlab图像处理——细胞图像的分割和计数显示
一. 项目介绍 使用MATLAB编写的细胞图像分割及计数系统,实现了对图像内细胞的计数,以及对每个细胞周长和面积的测量,并分别展示了分割后的每个细胞的图像。实验步骤共分为图像预处理、图像预分割、空洞填充、黏连细胞分割、细胞个数统计、细胞…...
六爻排盘神机
选修课留了3000字的论文......确实,削微有那么一点小困难…… 但是,倘若我拿出已经占了6419个字符的 “六爻排盘神机” ,阁下…应该…不会…骂我吧 且看,六爻排盘神机! import random import datetime from lunarcale…...
【ARMv8/v9 GIC 系列 2.1 -- GIC SPI 中断的 pending 和 clear pending 配置】
文章目录 GIC Pending 和 Clear PendingGICD_ISPENDR<n>GICD_ICPENDR<n>参数<n>编号解释使用举例设置中断ID 100为挂起状态清除中断ID 100的挂起状态 代码实现小结 GIC Pending 和 Clear Pending 在ARMv8体系结构中,GICD_ISPENDR<n> 和 GI…...
SpringBoot集成logback初始化源码解析(部分)
一.SpringBoot配置扩展点 SpringBoot日志模块使用监听的方式进行初始化,在SpringBoot项目启动后,会通知日志监听器 在日志监听器中ApplicationStartingEvent事件用来确定到底使用哪个日志系统,logback log4j等 在日志监听器中ApplicationEn…...
【Linux工具】yum软件包管理器与Vim编辑器的高效运用
目录 Linux 软件包管理器 YUM 什么是软件包 安装工具 rzsz 及注意事项 查看软件包 安装和卸载软件 安装软件 卸载软件 Linux 开发工具 编辑器 - Vim 使用 编辑 Vim 与 Vi 的区别 Vim 的基本概念 三种模式 Vim 的基本操作 操作尝试: Vim 命令集解释…...
Matlab数学建模实战应用:案例4 - 图像处理
目录 前言 一、图像处理基础 二、Matlab图像处理工具箱 三、案例:图像锐化、去噪和分割 步骤 1:读取和显示图像 步骤 2:图像锐化 步骤 3:图像去噪 步骤 4:图像分割 完整代码示例 四、实际应用 实例总结 总…...
Studying-代码随想录训练营day15| 222.完全二叉树的节点个数、110.平衡二叉树、257.二叉树的所有路径、404.左叶子之和
第十五天,二叉树part03💪,编程语言:C 目录 257.完全二叉树的节点个数 110.平衡二叉树 257.二叉树的所有路径 404.左叶子之和 总结 257.完全二叉树的节点个数 文档讲解:代码随想录完全二叉树的节点个数 视频讲解…...
Python 基础:异常
目录 一、异常概念二、处理异常2.1 抛出异常2.2 使用 try-except 代码块2.3 使用 try-except-else 代码块2.4 静默失败 三、总结 遇到看不明白的地方,欢迎在评论中留言呐,一起讨论,一起进步! 本文参考:《Python编程&a…...
XML 应用程序
XML 应用程序 XML(可扩展标记语言)是一种用于存储和传输数据的标记语言。它是一种自我描述的语言,允许用户定义自己的标签和文档结构。XML广泛应用于各种应用程序中,包括网站开发、数据交换、文档管理等。本文将探讨XML的一些主要…...
SprringCloud Gateway动态添加路由不重启
文章目录 前言:一、动态路由必要性二、SpringCloud Gateway路由加载过程RouteDefinitionLocator接口PropertiesRouteDefinitionLocator类DiscoveryClientRouteDefinitionLocatorInMemoryRouteDefinitionRepositoryCompositeRouteDefinitionLocator类CachingRouteDef…...
Windows安装mysql
首先去官网下载社区版本的mysql(如果连不上,挂梯子) https://www.mysql.com/downloads/ 2. 去配置环境变量path 3. 在cmd里面初始化数据库(在搜索框输入cmd,或者在资源管理器下搜索烂输入cmd回车就行) my…...
chatgpt: linux 下用纯c 编写ui
在Linux下用纯C语言编写用户界面(UI),通常会使用GTK或Xlib。GTK是一个更高级的库,提供了丰富的控件和功能,而Xlib则是一个更底层的库,提供了直接操作X Window系统的功能。 下面是一个使用GTK在Linux上创建…...
Java十六进制Dump打印数据
代码 package test;import java.io.IOException;import sun.misc.HexDumpEncoder;@SuppressWarnings("restriction")...
某棋牌渗透测试
前言 由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者不为此承担任何责任。 一、信息收集 这里通过fofa进行收集,语法为:body某棋牌 && titlexxx 图1-1 fofa资产收集 …...
JAVA面试(六)
缓存 MemcachedredisRedis常见数据类型和使用Redis缓存持久化RDB-快照AOF-追加文件 Redis数据过期机制惰性删除定期删除Redis缓存淘汰策略(8种)算法LRU (Least Recently Used):最近最少使用LFU(Least Frequ…...
【C语言】手写学生管理系统丨附源码+教程
最近感觉大家好多在忙C语言课设~ 我来贡献一下,如果对你有帮助的话谢谢大家的点赞收藏喔! 1. 项目分析 小白的神级项目,99%的程序员,都做过这个项目! 掌握这个项目,就基本掌握 C 语言了! 跳…...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...
基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
STM32F4基本定时器使用和原理详解
STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...
屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...
HTML前端开发:JavaScript 常用事件详解
作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...
Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...
MySQL账号权限管理指南:安全创建账户与精细授权技巧
在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则…...
HarmonyOS运动开发:如何用mpchart绘制运动配速图表
##鸿蒙核心技术##运动开发##Sensor Service Kit(传感器服务)# 前言 在运动类应用中,运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据,如配速、距离、卡路里消耗等,用户可以更清晰…...
