当前位置: 首页 > news >正文

web应用开发说明文档

工程目录结构

FACTORY--bin                    #网络流可执行程序 参考后文1.1部分文字说明webrtc-streamer--deployment             #部署相关的配置--mysql              #参考1.3 mysql数据库详细说明--conf           #存放mysql的配置文件--data           #存放pem加密数据,参考后文1.2部分文字说明--nginx              #参考1.5 nginx的详细说明xxx.conf         #正向代理 反向代理 负载均衡 配置文件--factory                #django 基本框架内容,参考1.9asgi.py              #异步(基于 async/await)celery.py            #分布式框架 参考后文1.7flask.conf.py         #flask 配置文件,参考1.8gunicorn.docker.conf.py  #docker 中使用gunicorn部署django应用的配置文件 gunicorn.conf.py         #使用gunicorn部署django应用的配置文件 settings.py          #django项目常用的配置urls.py              #视图函数 Viw 映射到urlswsgi.py              #同步(单线程/多线程/多进程)--hardwarefire.pytem.py--log                    #存放日志--manage                 #管理模块--migrations         #数据库迁移模型  回滚 更新数据库内容  和github 版本管理机制类似#migrations目录中的内容 由python脚本生成。参考1.13详细说明admin.py             #管理 登录界面alisms.py            #阿里云短信服务apps.py              #网页中视图模块broadcast.py         #web应用 广播消息cal_distance.py      #计算人员距离handle_attendance.py #处理事件handle_warnings.py   #处理告警merge_data.py        #合并数据models.py            #数据库字段模型paginations.py       #分页机制rtspyield.py         #产生rtsp 网络流serializers.py       #序列化数据库字段signals.py           #信号storevideo.py        #保存视频task.py              #任务test.py              #测试urls.py              #urls与视图View映射utils.py             #工具views.py             #视图Viewweb_socket.py        #web 应用web_socket2.py--media                  #多媒体文件存放 图像 视频 等--static                 #前端开发使用的静态文件 html文件 图片 css 样式 js脚本等.参考1.10,1.11,1.12--ui                     #用户界面docker-compose.yaml      #使用 Docker Compose 管理多容器应用的核心步骤Dockerfile                #Dockerfile 是一个文本文件,用于定义如何构建 Docker 镜像。它包含一系列指令,告诉 Docker 如何逐步组装镜像(包括基础环境、代码、依赖、配置等)。镜像是容器运行的模板,而容器是镜像的实例化表现gunicorn.conf            #gunicorn 启动django项目的配置文件manage.py                #django项目中的脚本process.pyrequirements.txt        #项目需要的python依赖包,参考1.14详细说明sources.list            #镜像源start copy.shstart_docker.sh         #开启dockerstart.sh                #整个项目的启动入口

1.1 WebRTC Streamer 是一个基于 WebRTC 技术的轻量级流媒体服务器,用于将各种视频源(如摄像头、RTSP流、屏幕捕获等)通过 WebRTC 协议传输到网页浏览器。

1.2  “ pem”是一种常见的加密文件格式,全称是 Privacy Enhanced Mail(隐私增强邮件),但实际上它早已不限于邮件加密用途,而成为存储和传输加密数据的标准格式之一。

1.3 mysql 数据库

        数据库包括 关系型数据库,非关系型数据库(redis为例),文档型数据库(mongoDB为例)。mysql 是一种关系型数据库,结构化查询语言。

        如何清除ubuntu 旧版本mysql

sudo apt purge mysql-*
sudo apt autoremove
sudo apt autoclean
sudo rm -rf /etc/mysql /var/lib/mysql /var/log/mysql /var/run/mysqld
sudo rm -rf /etc/apparmor.d/abstractions/mysql /etc/apparmor.d/cache/usr.sbin.mysqld
sudo deluser mysql 2>/dev/null
sudo delgroup mysql 2>/dev/null
sudo rm /etc/apt/sources.list.d/mysql*

        如何安装mysql 数据库

#mysql数据库的默认端口是3306
#注意 同一台主机可以安装多个版本的数据库 也可以同时启用多个版本的数据库
sudo apt install mysql-server

        数据库的启动,停止和关闭

启用
sudo systemctl start mysql
停止
sudo systemctl stop mysql
关闭
sudo systemctl disable mysql

有时,当启动数据库时会失败,可能原因:清理旧版本数据库不干净。

登录数据库有两种方式:

带密码登录
mysql -uroot -p 
密码是: root_admin_pwd
不需要密码登录方式
sudo mysql -u root

如何更改密码:

mysqladmin -uroot -p’旧密码’password ‘新密码’

如何退出mysql 命令行:

exit;
quit;
\q 直接退出
注意:如果使用ctrl+z强制退出时,下一次启动mysql 时会出现问题

一台主机如何启动多个版本的数据库?

一台主机可以安装和启动多个版本,端口号不一样即可
mysql -u root -p 123 -h localhost -p 3306  // mysql 8.0
mysql -u root -p 123 -h localhost -p 13306  // mysql 5.7

以下是使用数据库的常用语法,基本上包含四种:数据库定义语言DDL, DML数据库操作语言,DQL数据库查询语言,DCL数据库控制语言。

使用mysql 数据库有三种方式:纯命令行手敲; GUI 可视化管理工具navicat等;python/java等编程语言操控数据库,以orm为例。orm为对象关系映射模型。首先介绍命令行常用语法。

命令行方式,数据库语句以";"结束
show databases;          显示数据库
create database mydata;   创建数据库 
drop database mydata;     删除数据库 
use mydata;               使用数据库时  
show tables;              查看数据表 

mysql 配置文件如何编写

[client]
# 客户端配置
[mysqld]
# 服务器配置
[mysqld_safe]
# 安全相关配置
[mysql]
# mysql命令行工具配置
[mysqldump]
# 备份工具配置

1.4 非关系型数据库 redis

redis是一种基于key-value 的 高性能消息中间件;它是一种nosql(not only sql) 类型的数据库,专门为了解决高性能问题。适用于高并发,海量数据处理的场景。支持数据持久化功能,可以将结果保存到硬盘中。补充:上文介绍的mongoDB是一种文档式数据库,还有一种图关系型数据库,用于好友推荐,地图等。

redis也可以作为消息队列中间件使用。在分布式系统框架中,以celery 为例,包含生产者(多线程任务,定时任务),消费者模型;介于生产者和消费者之间的部分,则可以定义为消息队列中间件,用于存储不同的任务。任务执行的结果也可以保存在后端数据库中,比如redis。

因为访问常规mysql数据库有大量的IO操作,如何缓解CPU压力以及IO压力。这时候需要高性能Nosql数据库,即redis。数据直接放在内存中,减少了IO操作,读写效率更高。

nosql类型的数据库,除了redis以外,还包括memcache, mongodb等。memcache只支持单一的数据类型,redis支持多元数据类型,比如string, set, 有序集合zset, hash, list等。memcache不支持数据持久化。

redis 官网链接

https://redis.io/

 本篇介绍redis6的特性与语法

如何安装redis
官网下载tar.gz文件,确保linux系统中安装了gcc编译器,pip install gcc
然后使用make,make install 源码编译redis 也有客户端和服务端,server 和cli
redis-server可以前台启动,也可以后台启动
redis-server  前台启动
redis-cli 通过客户端连接redis
redis-server后台启动 需要更改配置文件
sudo gedit redis.conf 
将配置文件中的daemonize no改为yes
后台启动的命令为 redis-server   redis.conf
然后使用redis-cli 即可以连接redisredis 默认端口为 6379
redis-cli shutdown 关闭redis
或者找到进程号 然后杀掉进程 killmemcache机制: 多线程+锁    vs  redis机制:单线程 多路IO复用keys *           查看当前库中有哪些key
set k1 lucy      设置k1-lucy
get k1           取值
type key         查看key的类型
exists k1        查找是否有k1
del key          直接删除
unlink key       删除,后台删除
expire key       设置过期时间
ttl key          查看还有多少时间过期
select           切换数据库,默认有16个。索引从0开始
dbsize           查看有多少key
flushdb           清空当前数据库
flushall          清空全部库解决功能性问题 扩展问题 性能问题 redis解决性能问题
五大数据类型 字符串 集合 哈希表 list zset有序集合字符串string介绍,最大长度不能超过512M
set key value         设置key  value 键值对,数据类型可以为string
append  key value     在key后面追加value
strlen  key           得到key的长度
setnx key value       key不存在时 ,才能设置
incr key              加1
decr key              减1
incrby key value      加value
decrby key value      减value
原子操作  不会被线程调度机制打断的操作
mset                  同时设置多个key value 对
mget key1 key2
getrange key start end  获取key中从开始到结束的字符,相当于substr操作
setrange key index value 设置新值list操作:
lpush  rpush          从左边插入 右边插入
lpop   rpop           从左边删除 右边删除
rpoplpush             右边取出值 插入左边
lindex                获取指定下标的元素
lrem                  从左边删除n个值
lsetset集合操作 自动去重
sadd k1 v1            添加
smember k1            取值
srandmember           随机取出n个值
sismember             集合中有没有这个元素
scard                 元素个数
spop                  随机吐出一个值
sinter                取得交集
sunion                并集
sdiff                  差集
smove k1 k2 value     将value从一个集合中移动到另外一个集合中哈希操作 hash
hset key:keys  field value   设置       
hget                        取值
hmset                       多元素设置
hmget                       多元素取值
hexists                     是否存在key
hkeys 
hvals有序集合zset 没有重复元素
zadd                       添加元素
zcount key min max         min-max 之间的元素个数
zrank                      返回排名
zrange key start  end      返回min-max 之间的元素
zrangebysocres             从小到大排序
zrevrangebysocres          从大到小排序
zincreby
zrem                       删除指定值redis 配置文件 redis.conf中的内容
bind 127.0.0.1       绑定主机的ip,localhost  加注释的话,其他的主机也可以访问
protected-mode  yes  开启保护模式
tcp-backlog 511      tcp三次握手的总值
timeout 0            开启redis如果不使用,超时机制
daemonize yes        守护进程 后台启动
pidfile               进程号写入文件中
inlcude              包含其他的配置文件
network              网络部分
tcp-keepalive        检测心跳redis 的发布与订阅 客户端可以订阅频道 和ros有点像
SUBSCRIBE topic
publish topicredis6中新数据类型
bitmaps
setbit key index value     设置
getbit key index           取值
bitcount                   二进制表示中1的个数
bitop                      与或非hyperloglog统计页面的访问量 去重 基数统计 
pfcount 统计基数的数量,基数 不含重复元素
pfmerge 合并geospatial  地理信息 经纬度
geoadd  x y city      添加城市经纬度
geopos city           返回经纬度
geodist               两个位置的距离jedis 操作redis6: java 操作redis 客户端工具事务与锁操作
事务的主要操作是 串联多个任务 防止插队
multi 开启任务 组队阶段
exec 执行阶段
discard 放弃组队
组队的时候,有任务失败 则组队失败事务冲突
悲观锁 
每次操作上锁 一个一个操作 效率低
乐观锁 抢票
版本号操作 watch  key 监视锁
秒杀系统 10个商品 1000个人参与持久化操作
rdb redis database 
rdb:在指定的时间间隔内,将内存中的数据集快照写入磁盘
rdb先开一个子进程 fork ,然后生成临时的文件tmp.rdb, 最后tmp覆盖dump.rdb
save 900 1  900秒内有1个发生变化 则持久化AOF	append of file
只写不读,AOF默认不开启
如果adb和aof同时开启,则redis 以aof 为主主从复制
读写分离 提高效率
主服务器写 从服务器读
一主一从  一主多从
容灾的快速恢复如果不使用slaveof,则所有的机器都是主服务器。设置从服务器,则必须使用slaveof 
slaveof 主机的ip
一主两仆 当从机关掉再开启时,默认为主服务器,从新使用slaveof设置从服务器。从机的数据从新复制当主机挂掉再开启时,还是主服务器;
薪火相传 机器比较多时 小组长模式
反客为主 主机挂掉 从机上位
哨兵模式: 反客为主的自动版  需要配置sentinel.conf 集群
redis 容量不够时,如何进行扩容?
并发写操作时 如何分摊?
主机代理 无中心化 互相联通  6台服务器(3对 一主一从)缓存穿透  解决方案 :空值缓存 白名单 布隆过滤器
缓存击穿  数据库访问压力瞬间变大   但是redis正常解决方案:预先设置热门数据 实时调整 使用锁 
缓存雪崩  构建多级缓存架构  nginx   redis缓存 ehcache
分布式锁  一把锁对其他机器也生效  使用setnx设置锁  del 删除锁

1.5 nginx 说明

作用:正向代理,反向代理,负载均衡,动静分离。支持5万个并发连接请求。

正向代理:代理客户端;

反向代理:代理服务器端;

负载均衡:轮询,加权轮询;IP hash 打到固定的服务器上;retry

动静分离:动态资源和静态资源分别放到不同的服务器上。

目前nginx 主流的四个版本:
nginx;nginx plus;  openresty; tengine

安装方法
sudo apt update
sudo apt install nginx
sudo systemctl start nginx
sudo systemctl enable nginx 设置开机自启动
sudo systemctl status nginx 检查nginx 是否在运行
查看nginx位置
whereis nginx
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx /usr/share/man/man8/nginx.8.gz
如何开启或者停止nginx 服务
cd /usr/sbin/
sudo ./nginx -s stop  停止服务
sudo ./nginx -s quit  安全退出
此时,打开浏览器 127.0.0.1,看不到nginx欢迎界面
sudo ./nginx  开启服务
sudo ./nginx -s quit 当用户正在下载文件时,等待用户下载完再停机
sudo ./nginx -s reload 更改完配置文件时,立即生效。不需要重启nginx
nginx.conf 常用配置参数介绍,最小配置文件events {worker_connections 4096;#最大连接数# multi_accept on;
}http配置upstream 负载均衡的配置server {listen 8001;server_name 127.0.0.1;# gzip configgzip on;#启用 Gzip 压缩功能gzip_min_length 1k;#设置触发压缩的最小文件大小gzip_comp_level 9;#控制 Gzip 压缩强度 的配置指令,它定义了压缩级别,取值范围为 1 到 9。级别越高,压缩率越大(文件体积越小),但 CPU 消耗也越高gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;gzip_vary on;#用于控制是否在 HTTP 响应头中添加 Vary: Accept-Encoding 字段。这个字段对浏览器缓存行为和 CDN 缓存策略非常重要gzip_disable "MSIE [1-6]\.";#用于指定哪些用户代理(浏览器)不应该接收 Gzip 压缩的内容。client_max_body_size 200M;#对 Internet Explorer 6 及以下版本禁用 Gzip 压缩,因为这些旧版 IE 浏览器对 Gzip 的支持有问题。root /usr/share/nginx/html/ui/frontend/dist;index index.html;# try_files $uri $uri/index.html /index.html;try_files $uri $uri/ /index.html?s=$uri&$args;location /local-admin/ {alias /usr/share/nginx/html/ui/backend/dist/;index index.html;try_files $uri $uri/ /local-admin/index.html?s=$uri&$args;}location /api {proxy_pass http://web:8000;proxy_set_header   X-Forwarded-Proto $scheme;proxy_set_header   X-Real-IP         $remote_addr;}}配置文件里可以设置多个server,1个server就是一个主机,如果开启多个 server,端口号不能相同
配置文件中的其他参数详解
nginx 启动之后会开启多个进程。主进程为master, 子进程为worker。work_process 为工作进程个数。
include 导入其他的配置文件
mime.type 传输内容的类别,图片,文本,视频,flash等
sendfile on  数据零拷贝 减少一次数据复制过程vhost 虚拟主机
Nginx 虚拟主机(Server Block)可以让你在一台服务器上托管多个网站
http://www.baidu.com/xxxx
整个http是url,xxxx后面的是uri
参数location{}里面的内容就是xxxx的地址
ubuntu 如何配置虚拟主机
打开: etc/hosts 
添加以下内容:
127.0.0.1   example.com  www.example.com也可以在nginx中配置虚拟主机
如何配置本机的域名解析本机的域名解析 外网访问不到;如果需要外网访问到,需要购买域名
本机的域名解析 需要在hosts文件中更改配置。
公网域名配置需要登录阿里云购买域名

1.6 docker

可以实现快速构建,分享,运行应用的程序。

docker主机:安装了docker环境的机器。

docker daemon: docker 后台进程。

docker cli: 客户端

docker : 应用市场

docker ce: 引擎

如何安装docker
卸载旧版本(如果有)
sudo apt-get remove docker docker-engine docker.io containerd runc更新软件包索引并安装依赖
sudo apt-get update
sudo apt-get install \ca-certificates \curl \gnupg \lsb-release添加 Docker 官方 GPG 密钥
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg设置 Docker 仓库
echo \"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null安装 Docker Engine
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin验证安装
sudo docker run hello-world将当前用户加入 docker 组,避免每次使用 sudo
sudo usermod -aG docker $USER
newgrp docker  # 刷新组权限(或重新登录)设置 Docker 开机自启
sudo systemctl enable dockerdocker pull  redis 下载redis
docker run redis   运行程序docker build xxx 构建应用
docker push xxx  推送到应用市场启用docker 
sudo systemctl start docker# 设置开机自启
sudo systemctl enable docker
# 检查运行状态
sudo systemctl status dockerdocker search 搜索镜像# 卸载 Docker
sudo apt purge docker-ce docker-ce-cli containerd.io# 清理残留
sudo rm -rf /var/lib/docker
sudo rm -rf /etc/docker# 重新安装
sudo apt install docker-ce docker-ce-cli containerd.io-p 88:80 端口映射
80为容器的端口号,88为外部主机的端口如何修改doxker 镜像源
sudo gedit /etc/docker/daemon.json添加或者修改以下内容 {"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn","https://hub-mirror.c.163.com","https://mirror.baidubce.com"]
}dcoker images  查看当前镜像
下载制定版本的镜像:
docker pull nginx:latestdocker rmi  删除镜像
docker rm -f删除容器 -f 强制删除docker run -d –-name my_nginx nginx
-d 后台启动
-p 88:80  端口映射  外部访问容器内端口如何修改nginx 欢迎页面  docker exec
docker exec -it my_nginx /bin/bash
-it 为交互模式
使用echo 修改html文件内容提交
docker  commit
docker  commit -m “xxxx”  my_nginx
保存
docker save
docker save -o my_nginx.tar my_nginx
加载
docker load
docker load -i  my_nginx.tar如何分享docker login
docker tag  改名字
docker push目录挂载 -v 命令
-v applocation /usr/share/nginx/html
容器挂了之后,文件夹里的内容还在docker 网络机制可以轻松构建集群
docker container inspect
可以查看 虚拟容器的ip 地址。
不同容器之间可以通信,数据传输由于ip地址经常变动,为了稳定访问,用域名的方式。
docker  network 自定义网络docker  network create myworkdocker 批量执行应用
docker compose  yaml文件配置

1.7 分布式框架celery

完成异步任务调度,延迟任务,定时任务等。每分钟可以处理百万级的任务。

celery可以看做生产者,消费者模型。producer 异步任务 发送短信,视频转码等 耗时任务。

beat 为定时任务。

如何安装celery
pip install celery如何在python程序中使用from .celery import app
@app.task
def func()xxxxbroker指定消息队列中间件,消息队列有rabbitmq ,还可以使用redis 或者 kafka
broker=“redis://127.0.0.1:port”
backen=“redis://127.0.0.1:port”
worker 执行
backen存储  执行完的结果存储在backen里
有时候redis 既可以当做消息队列中间件,还可以用作存储后端运行的结果。如何启动celery 任务
pip install eventlet
celery -A celery_task worker -l info -P eventlet

1.8 flask web 开发框架

web开发框架中最常用的两种,一个是flask,另外一个是django。

下面介绍web开发中的一些常识:

http 协议默认是80端口;https 协议默认是443端口

URL: 统一资源定位符,uniform resurce locator。

flask 目录结构static    存放静态文件
templates 存放jinjia2模板
app.py 入口程序  
debug=True 代码更改时,ctrl+s 保存后,网页端可以快速自动更新修改host=0.0.0.0  
让局域网内别的用户可以访问自己的主机上的flask项目
--host=0.0.0.0
如何修改端口号
--port=8000如何定义带有参数的url
blog/<para>如何使用request,可以当做全局参数
@app.route('/blog/list')
def blog_list():page=request.args.get("page",default=1,type=int)return f"你获取的是第{page}页的内容"查询时,
http://127.0.0.1:5000/blog/list?page=2如果需要丰富网页的内容,不仅仅是纯文本。需要使用html ,css ,js,以及图像 更专业的模块flask 依赖jinja2
如何渲染动态网页内容flask 如何操作数据库,需要安装pymysql 
pip install pymysql 
pip install flask-sqlarchemy
pip install flask-migrateorm 对象关系映射模型,可以用pyhton 编程的方式操作 关系型数据库。django也是如此。

1.9 django web开发框架

如何安装django
pip install django如何使用命令行创建django项目
django-admin startproject demo
运行主程
python manage runserver
浏览器中输入  127.0.0.1:8000 可以看到欢迎界面如何创建app
python manage.py startapp booksetting 文件中开启 debug=true
代码中更改,自动更新到网页url 两种传参方式
查询字符串path 中携带参数
第一种
def index2(request):id=request.GET.get('id')return HttpResponse(f"you are search: {id}")第二种
def index3(request,id):return HttpResponse(f"you are search: {id}")urlpatterns = [path('admin/', admin.site.urls),path('book', views.index2),path('book/<int:id>', views.index3),
]path 函数,<>变量类型
<int:>
slug “-”或者“_”
path 类型,可以包含/url取名字 
url 反转的时候 需要name
path('book/<int:id>', views.index3,name="book"),url 可以从外部导入 includepath('movie/', include(movie.urls) ,name="book"),app_name 取名路由反转 reverse模板渲染
DTL   django template language
jinja2渲染html文件,注意 在setting文件里,把模板包含的路径设置正确
render_to_string模板查找路径的配置、模板中也可以使用参数常用的标签{% if   %}
{% else if     %}
{% endif     %}for in 标签{% for in   %}{% endfor     %}reversed 可以反向遍历
forloop.counter 得到当前遍历的下标注意:for  循环中不存在continue 和break 用法with 标签 定义变量
url  标签,点击可以跳转
<a href=”%url ‘baidu’%”>模板常用过滤器
add 
cut 将字符串中所有的指定字符删掉
date 将日期按照指定格式显示
default 默认参数
stringtags 删除字符串中所有的html标签incldue  应用其他的模板
block 模块
extends 继承 必须放在第一行如何加载静态文件 css  js
<load static>
<scripts>加载js脚本django 如何使用编程语言pyhton连接数据库。orm模型
navicate 可视化操作数据库
pip install  pymysql

gunicorn 是部署django应用的工具。

1.10 前端html

学习html的免费网站 MDN  w3c W3school。


<marquee> 跑马灯效果 </marquee>
<input> 输入框 单标签,不是成对出现    也可以写成<input/>
标签可以嵌套
<marquee> 跑马灯效果<input></marquee>
在标签里可以添加标签属性,比如设置跑马灯为1次
<marquee loop=”1”> 跑马灯效果 </marquee>
<input type=”password”>
<input disable>
<title>网页的标签字符编码 <meta charset=”utf-8”> 加在head头里
文档声明 html文档的第一行加入 <doctype html>
vs code 如何快速添加注释: 将光标放在当前行,ctrl+/
如何设置网页语言 <html lang=”en”> 设置为英语
<html lang=”zh-cn”> 中文简体
快捷键,vscode如何快速删除某一行, ctrl+shift+k
如何设置网页的图标 将ico文件放到html的同级目录
<h1>为一级标题 。。。。。<h6>为6级标题 
<p>为段落标签
<div> 容器 包裹多个标签,比如
<div>   <p>  </div>
<input> 与 <span> 是行内元素 在一行显示
块内元素既可以写块内元素,也可以写行内元素
行内元素内部仅仅可以写行内元素p 标签中不鞥写块元素
常用的文本标签 <em> 着重标记的内容
<strong>也是着重显示的内容
不常用的文本标签
<cite>作品标签
<dfn>专有名词
<del> <ins>删除与插入文本
<sub> <sup>上标与下标
<code>代码
<samp>设备输出
<kdb> 键盘文本
<abbr> 
<bdo>反转文本
<var>标记变量 与code 一起使用
<address>地址信息
<img>图像标签 可以引用别的网站的图像资源,如果设置了防盗链,则不能引用
超链接 <a href=””> 跳转的时候可以在新 旧页签中打开
<a href=”” target=”_blank”> 在新页签中打开
<a href=”” target=”_self”> 在当前页签中打开
<a>标签里面不能有a 标签
<download>直接触发下载
设置描点 
<a href=”#xxx”> 必须有#号键
<p name=”xxx”>
<p id=”xxx”><a href=”#”>  回到顶部
<a href=””>   刷新页面
<a href=”tel:123456789”>  点击拨打电话
<a href=”msm:10086”>  发送短信
<a href=”mailto:123456789@qq.com”>  发送邮件有序列表
<ol> <li>
</ol>无序列表
<ul> <li>
</ul>自定义列表
<dl> <dt><dd> 描述
</dl>无论是ul 还是ol 内部最好使用li ,不能使用其他标签
自定义标签的应用场景:页面最下方合作单位信息等表格属性
<table>
<caption>
<tbody>
<thead>
<tr> row
<th>
<td> 
<tfoot>换行标签<br>
<hr>分割线表单  收集与用户交互
<inform>
<button>登录 注册
单选 多选
<checkbox>
<textarea> 文本域
<select> 下拉框
disable 禁用表单
<label>标签 可以跳转到输入框
<iframe>嵌入 其他的网站
iframe最大的作用 嵌入广告
<meta>元信息 配置网页的描述信息

1.11 前端样式css

css样式可以调整颜色,字体大小等color,font-size
<style>h1{color:red;font-size:80px;}
</style>
<style>标签  需要写到head里行内样式:在html的标签里,可以直接加样式
内部样式:把样式写在html的特定位置,<style>中
外部样式:引用外部文件  <link rel=”stylesheet” href=”xxx.css”>优先级: 行内样式>内部样式=外部样式 后面的覆盖前面的img{width:256 px;
}css中的注释和c++ 很像 /*  注释部分 */
开发时 展开风格,多行展示; 上线时,紧凑风格,一行展示,减少文件的体积 webpack
*{通配选择器
}类选择器
.dog{}
<class=”dog”>
<class=”dog big”> 类别中可以写多个类
id 选择器 最好不要加空格
#id{}
<id=”dog”>交集选择器
p.rich {}.big.rich {}<p class=”rich”>
<p class=”big”>p.rich# wangcai
<p class=”big” id=”wangcai”>并集选择器 竖着写
#id
.big,
.rich,
{}后代选择器
ul 中的 li{}<ul><li>
</ul>子代选择器
div>a  只包括儿子兄弟选择器
div+p 与div紧紧相连的兄弟p通用兄弟选择器
div~p属性选择器 具有 title属性的元素
[title]{}[title=”a”] title和”a”相等
[title^=”a”] 以a开头
[title$=”a”] 以a结尾
[title*=”a”]  只要有a就行a:link 还没访问过
a:visited 访问过
a:hover 选中正在访问
a:active 激活的 
<a ref=””>获取焦点 输入框
input:focus{}
<input >div>p:first-child<div><p> 张三 98<p> 李四 97<p> 王五 100
</div>
p:first-child 是p ,且 是第一个孩子div>p:nth-child(3) 第三个儿子
div>p:nth-child(2n)  2的倍数
div>p:nth-child(-n+5) 前5个   一定要写成an+bdiv>p:first-of-type 找第一个p
div>p:nth-of-child(3) 正数第三个
div>p:nth-of-child(-3) 倒数第三个选中的是没有内容的div
div:empty{}否定选择器
div>p:not(.fall) class 为fall的类UI选择器
input:checked{ 复选框选中则变大}目标伪类
targetdiv::first-letter 第一个字母
div::first-line 第一行
div::selection 鼠标选中
input::placeholder{}行内> 类选择器> 元素选择器> 通配选择器选择器权重!important  提高权重font-family  a b c d e字体可以设置多个
font-size
font-style 风格 倾斜 normal italic    oblique
font-weight  粗细 lighter 细的 normal bold 粗的
字体复合写法 font:bold 100px “微软雅黑”letter-spacing 字体间距text-decorate 文本修饰 : line-through删除线  overline上划线  underline下划线
dotted 虚线 wavy  波浪线 
文本缩径 :首行缩进 text-indent 
如果想要空出2个文字大小,则2*font-size 文本对齐方式: text-align 左中右 默认为左
font-size 字体设计框高
height 整体容器的高度
line-height 行高 行高一般为字体的1.5倍左右
line-height 1.5 意思是font-size的1.5倍
如果没有设置height,height为line-height*行数
vertical-align:top  bottom  middle baseline基线
列表相关的属性
list-style-type:none  squre 方块  decimal 数字
list-style-position  inside
list-style-image
复合属性 list-styletable{border-width  边框宽度border-color 边框颜色border-style 实线
}
简写
border:2px  green solidtable 属性
边框的整体
table{border-width  边框宽度border-color 边框颜色border-style 实线widthtable-layout auto 文字多 列变宽border-spacing 单元格之间的间距border-collapse 合并相邻单元格的边框empty-cells 影藏没有内容的单元格caption-side top  设置表格标题的位置
}图像当背景
background-color
background-image: url设置背景的重复方式
background-repeat no-repeat
background-repeat repeat
background-repeat repeat-x x方向重复
background-repeat repeat-ybackground-position : left top center
background-position :10px 20px相对于左上角
background 复合属性: 鼠标相关的属性
cursor:wait 等待 转圈圈
cursor:move 拖动 移动
cursor:help 帮助
cursor:pointer 鼠标变成小手em 倍速 *font-size ,如果缺少 font-size字段,找父元素的font-size
rem root相对根字体大小 找到祖师爷的字体大小
50% 相对于父元素尺寸行内元素 inline <span> 不可以通过 width height 设置宽高
块元素 block 独占一行  可以通过 width height 设置宽高
行内块元素 inline-block 兼顾以上两个优点
display:block  将行内元素以块元素显示 inline-blockcss 常用长度单位
margin 页边距盒子模型
内容区 边框padding border边框  margin外边距 宽度的最小值,最大值 。缩放浏览器,宽度会变化
高度的最小值,最大值。
默认宽度 不设置宽度的情况下的宽度 padding-left
padding-right
padding-top
padding-bottom
padding: top,right,bottom,left 上右下左行内元素的上下边距不能完美设置,左右边距可以设置border-width
border-color 
border-style
复合属性 border: width color styleborder-left-width
border-left-color 
border-left-style 实线 虚线 
border-left: 复合属性 margin: 复合属性 10 20 30 40 
margin-top 自己往下移动
margin-left自己往右移动
margin-right下一个元素往右移动
margin-bottom 自己不移动
行内元素设置 margin-top margin-bottom没有效果
margin-left auto 距离左边能有多远就有多远
margin-right auto 距离右边能有多远就有多远
margin-left auto margin-right auto  水平居中margin 塌陷问题
第一个子元素 margin-top
最后一个子元素 margin-bottom 被父容器抢走
如何处理内容的溢出
overflow  hidden 溢出之后隐藏
overflow auto 滚动条消失
overflow  scroll 超出部分滚动条
解决方案 给父容器加 border 设置 margin 合并 只存在上下铺之间 不存在左右之间 max(val1,val2)
使用float:left 浮动可以解决隐藏元素的两种方式
display none 虽然内容消失了,还是占据位置
visibility  hidden 默认为show样式的继承
子继承父  有些能继承 有些不能继承
背景色不能继承
和字体相关的基本可以继承
超链接 p1-p6 h body都有默认样式行内元素的空白问题行内块元素的幽灵空白问题浮动 文字环绕图像 float left
弹性盒子clear left 清除浮动效果 父元素的高度不塌陷
clear right
clear both 使用前提 自己是个好人position relative
相对于定位之前的位置
left:50 右移50
相对定位不脱离文档流
开启定位的元素 层级更高 压在其他元素身上
同时开启定位的元素,后写的压在先写的身上绝对定位 
什么是包含块?
如果没有脱离文档流的元素:父元素为包含块
脱离文档流:第一个开启定位的祖先元素
子绝父相
绝对定位的元素和浮动不能共存
固定定位 视口的左上角粘性定位  position sticky定位的层级定位可以越过padding网页布局
版心 排版的中心

1.12 javascript

打开浏览器,按住F12,可以打开开发者模式
javascript 操控浏览器的编程语言html插入js代码块
type 可以省略
<script type=”text/javascript”>var num=10;
</script>
如何输出日志
console.log(num) 打印日志到控制台
alert(“对话框”) 弹出对话框
prompt()弹出对话框,输入文本
var a=prompt()
document.write(“输出到页面”)可以将js代码写到标签的onclick 属性中
<button>点我一下</button>
<button onclick="alert('讨厌')">点我一下</button>也可以将js代码写到href超链接属性中
<a href="javascript:alert('哈哈哈')">点我一下</a>html引入外部js文件
< script  type=”text/javascript”   src=”./xxx.js”>
</script>
如何添加注释
js 注释和c++一样  多行注释/*  */     单行注释  //javascript 的数据类型分为基础数据类型和复合数据类型
基本数据类型
数值   number
Infinity 无穷大
-Infinity 无穷小
Number.MAX_VALUE	
Number.MIN_VALUE	如果用js进行小数运算,可能结果不精确
字符串 string
字符串多个引号“”嵌套时 使用\转义
布尔  boolean
var bl=false;
console.log(typeof bl) 返回boolean
null 空值
underfined 未定义
NaN not a number
两个字符串相乘 返回nan强制类型转换
将其他数据类型转化为staring
var a=123
var b=String(a)
var c=a.toString()
null underfined不能使用toString()
String(null) 返回”null”
String(underfined) 返回”underfined”如果将字符串转化为number
var s=”123”
使用Number()函数
var b=Number(s)parseInt()
parseFloat()其他进制 16进制 0x123
0开头是8进制
0b 是2进制
parseInt(a,10) 以10进制返回
js中使用 \u 16进制 表示unicode编码
html中使用&# 十进制数字var a,b,c;
var a=1,b=2,c=3;outer:
for(var i=0;i<13;i++)
{inner:for(var i=0;i<13;i++){break outer;}
}
break可以不跳出最近的循环,使用标签标记循环体
continue 也可以加标签计时器:
console.time(“test”)
console.timeEnd(“test”)复合数据类型
object 引用数据类型 和c++的struct很像 python的字典 dict
对象字面量
var user={age: ,name:,
}创建对象
var obj=new Object();
obj.name=”zhangsan”
obj[“123”]=789
删除对象属性名
delete obj.name属性名 in  obj声明变量
var a=123;
var a=null;
var a=underdefined;js内嵌关键字 保留字
var func break do instanceof typeof case if  else  new catch
finally return void continue for switch while default throw
delete in try function this with false true null debuggertypeof 运算符   检测数据类型
如果是自定义类型,则是object类型算术运算符
赋值运算符
比较运算符  
布尔运算符 == 
=== 严格等于 数据类型也必须相等
!=   
!==    if语句
if else
switch
循环语句 for while字符串
str.chatAt(0)
str.concate(str2,str3)
如果参数不是字符串,则 concate将其转化为字符串
’’. concate 空字符串也可以使用concate子串  substring
substr 从字符串开始位置算起,第二个参数为子串的长度indexof 第一次出现的位置
trim 去掉字符两端的空格 制表符 换行符
split 方法 
数组
var arr=new Array()
var arr=new Array(10)创建长度为10的数组
arr[0]=10
arr[1]=22数组对象方法var arr=[]
var arr=[1,2,3]
数组中可以放置不同类型的数 也可以是对象
数组的遍历 for循环
arr.forEach(func(a,b,c))数组中有几个元素,函数执行几次
arr中的元素 传入到函数中 a为元素 b为索引 c为数组整体
slice(开始位置,结束位置) 切片 [)左闭右开
splice(start,count) 删除count个元素正则表达式
var reg=new RegExp(‘a’); 字符串中是否有a
var str=’a’;
test()为方法
reg.test(str)DOM 通过js操作网页
documemt.getElementByID(“id”)
onload事件会在整个页面加载结束之后触发
window.onload 
getElementsByTagName 获得一组元素
getElementsByName获得一组元素
childNOde 包含空白节点
空白节点也是节点
children不包含空白获取父节点和兄弟节点
parentNode
previousSiblingvar all=dovument.all
所有的元素
嵌套数组
数组的遍历
数组静态方法 isArray()
数组 push   pop
shift删除数组的第一个元素   
unshift 数组的第一个位置添加元素
join.(“|”)  数组转化为字符串
reverse 数组反转
indexof 查找第一次出现的位置函数
function add(x,y){return x+y;
}立即执行函数
(function(){return 1+2;
})();(function(a,b){return a+b;
})(12,34);枚举对象中的属性
for x in obj
for(var n in obj)
{console.log(obj[n])
}全局作用域 界面打开时创建 销毁时关闭
window窗口 为全局作用域
var a=10;
console.log(window.a);
console.log(window.fun());
window.alert(“------”)js可以在函数声明之前调用函数 ,函数可以写在使用之后函数作用域构造函数首字母大写
构造函数需要使用 new 调用
instanceof  xxx是yyyy的实例每创建一个函数,解析器都会向函数中添加一个属性 prototype
原型对象哈希表
key-valuevar user={name:”zhangsan”,age:13,
}
user.namerandom 0<= && <1  floor   ceil
Date对象
Date.now()DOM概述 文档对象模型  js操作网页的接口
DOM的最小组成单位叫做节点BOM 
document 整个文档树
document.getElementByTagName()
读取元素
创建元素

1.13 django 中migration 中的文件,由以下命令生成。数据迁移模型

# 1. 创建迁移文件(检测模型变化)
python manage.py makemigrations
# 生成类似 myapp/migrations/0002_auto_20230101_1234.py 的文件

1.14 requirements.txt 中引入的python 模块以及作用

alibabacloud_dysmsapi20170525==2.0.24  #阿里云提供的 短信服务
alibabacloud_tea_openapi               #是阿里云官方提供的 核心 SDK 工具库,用于简化阿里云 OpenAPI 的调用流程。它是阿里云各类 SDK(如 alibabacloud_dysmsapi)的基础依赖
amqp==5.1.1                            #AMQP(Advanced Message Queuing Protocol,高级消息队列协议)是一种开放标准的消息协议,用于在应用程序或系统之间异步、可靠地传输消息。
appnope==0.1.3                         #专门用于在 macOS 系统上禁用或管理 AppNap 机制,确保某些 Python 程序(如科学计算、实时任务、GUI 应用等)不会被系统自动限制资源。
asgiref==3.7.2                         #主要用于支持 ASGI(Asynchronous Server Gateway Interface) 协议。它是 Django 生态的核心组件之一,但也广泛用于其他异步 Python Web 开发场景
async-timeout==4.0.2                   #用于为异步操作设置超时时间,防止异步任务因长时间未完成而阻塞整个程序
backcall==0.2.0                        #主要用于简化回调函数(callback)的实现,特别是在交互式环境(如 Jupyter Notebook、IPython)中。它的核心功能是提供一种灵活的方式来管理回调函数的签名和调用,使回调机制更直观、易用。
billiard==4.1.0                        #Python 的一个多进程管理库,本质上是 multiprocessing 模块的一个功能增强版分支,最初为 Celery(分布式任务队列)开发,旨在解决原生 multiprocessing 的局限性。
celery==5.3.1                          #分布式框架
certifi==2022.6.15                      #其核心作用是提供 Mozilla 官方维护的根证书集合(CA Certificates),用于在 SSL/TLS 加密通信中验证服务器证书的合法性
charset-normalizer==2.1.0              #用于自动检测文本的字符编码(如 UTF-8、GBK、ISO-8859-1 等),并将其转换为目标编码(默认是 UTF-8)
click==8.1.3                           #命令行工具开发库,用于快速创建功能丰富、易用的命令行界面(CLI)。它由 Flask 的作者 Armin Ronacher 开发,以简洁的 API 和高度可扩展性著称。
click-didyoumean==0.3.0
click-plugins==1.1.1                   #是一个用于 扩展 Click 命令行工具插件系统 的 Python 库。它允许开发者将多个 Click 应用作为 插件 动态加载到主 CLI 程序中,类似于 pip、docker 或 kubectl 的插件机制。
click-repl==0.3.0                      #Click-REPL 是 Click 命令行框架的一个扩展,为 Click 应用添加了交互式 REPL (Read-Eval-Print Loop) 功能。
coreapi==2.3.3                         #用于 构建和交互基于超媒体(Hypermedia)的 Web API,它提供了一种标准化的方式来描述、请求和解析 RESTful API,特别适合动态 API 客户端和自动化工具。
coreschema==0.0.4                      #coreschema 是 Python 中一个用于 API 数据验证和模式描述 的库,通常与 coreapi 配合使用,用于定义和验证 Web API 的输入/输出数据结构。它的核心功能是提供一种 声明式的方式描述数据格式,并支持动态验证。
cron-descriptor==1.4.0                 #用于 将 Cron 表达式(定时任务表达式)转换为人类可读的描述。它可以帮助开发者或用户更容易理解 Cron 表达式的含义
decorator==5.1.1                       #用于 简化装饰器(Decorator)的创建和管理。它的核心功能是提供 @decorator 装饰器工厂,帮助开发者更优雅地编写装饰器,同时保留原函数的元数据(如 __name__、__doc__ 等),并减少样板代码。
Django==3.2.20                           #web开发框架
django-celery-beat==2.5.0                #用于为 Celery(分布式任务队列)提供 动态、可持久化的定时任务(Periodic Tasks)管理
django-celery-results==2.5.1            #用于将 Celery 任务执行结果 存储到 Django 数据库(或其他后端),提供任务状态跟踪、结果查询和历史记录功能。
django-cors-headers==3.13.0             #用于处理跨域资源共享 (CORS) 的响应头,让你的 Django 后端能够安全地接受来自不同域的请求
django-picklefield==3.1                  #允许你存储 Python 对象到数据库中(通过 pickle 序列化)。 
django-redis==5.3.0                     #
django-timezone-field==5.1               #用于存储 pytz 时区对象
djangorestframework==3.13.1             #用于构建 Web API 的强大而灵活的工具包
djangorestframework-simplejwt==5.2.0    #JSON Web Token 认证的 Django REST Framework 插件,是 DRF 的 JWT 认证实现中最流行的选择。
drf-yasg==1.21.3                        #可以自动从你的 DRF 代码生成 API 文档
Flask==2.2.2  #
gevent==21.12.0                         #是一个基于协程的 Python 网络库,使用 greenlet 在 libev 或 libuv 事件循环之上提供高级同步 API。
greenlet==1.1.3                         #一个轻量级协程库,为 Python 提供了轻量级的"微线程"实现,是 gevent 的核心依赖。
gunicorn==20.1.0                        #是一个 Python WSGI HTTP 服务器,用于部署 Python Web 应用(如 Django、Flask)。
idna==3.3                               #用于处理国际化域名(包含非ASCII字符的域名)的标准协议。
importlib-metadata==4.12.0              #
inflection==0.5.1                        #用于处理英文单词单复数转换、大小写转换、下划线/连字符转换等文本变形操作的 Python 库。
ipython==7.34.0                         #
itsdangerous==2.1.2                     #用于在不可信环境中安全传输数据的 Python 库,常用于生成和验证安全令牌、签名 cookies 等场景。
itypes==1.2.0                           #供了一些有用的接口类型定义,主要用于类型注解和接口检查。
jedi==0.18.1                            #Jedi 是一个强大的 Python 代码自动补全和静态分析库,被许多 IDE 和编辑器(如 VS Code、Sublime Text 等)用作 Python 代码智能支持的后端。
Jinja2==3.1.2                           #模仿 Django 模板但添加了更强大的功能
kombu==5.3.1                            #Kombu 是一个 Python 消息队列库,是 Celery 的底层消息传输库。它提供了高级的消息队列抽象,支持多种消息代理(AMQP、Redis、Amazon SQS 等)
MarkupSafe==2.1.1               #专门用于处理 HTML/XML 的字符串安全转义,是 Jinja2、Flask 等模板引擎的底层依赖。
matplotlib-inline==0.1.3        #是一个 Jupyter Notebook/IPython 的扩展,用于在 notebook 单元格中直接显示 matplotlib 图形,而无需调用 plt.show()。
mysqlclient==2.1.1              #
numpy==1.21.6                   #
openapi-codec==1.3.2            #用于处理 OpenAPI/Swagger 规范的工具,提供编码解码和验证功能
opencv-python==4.6.0.66         #
packaging==21.3                 #打包(packaging)是将Python代码和资源组织成可分发格式的过程,以下是现代Python打包的核心知识体系。
parso==0.8.3                    #Python 解析器库,主要用于静态分析 Python 代码,是 Jedi(自动补全工具)的核心依赖。
pexpect==4.8.0                  #用于控制和自动化其他程序的交互式命令行工具,类似于 Unix expect 的 Python 实现。
pickleshare==0.7.5              #小型 Python 数据库,使用 Python 的 pickle 模块实现简单的键值存储,特别适合小型项目和快速原型开发。
Pillow==9.2.0                   #
prompt-toolkit==3.0.39          #用于构建强大交互式命令行应用的 Python 库,被 IPython、pgcli 等知名项目采用。
ptyprocess==0.7.0               #用于启动和控制伪终端(PTY)中的子进程,是终端模拟器和交互式命令行工具开发的基础组件。
Pygments==2.12.0                #语法高亮工具,支持超过 500 种编程语言和标记语言的着色显示。
PyJWT==2.4.0                    #JSON Web Tokens (JWT) 实现库,用于生成和验证符合 RFC 7519 标准的令牌。
pyparsing==3.0.9                #用于创建和执行文本解析器,特别适合处理复杂文本格式和领域特定语言(DSL)。
python-crontab==3.0.0           #用于操作 Unix/Linux crontab 文件的 Python 库,可以方便地创建、修改和删除 cron 作业。
python-dateutil==2.8.2          #日期相关
pytz==2022.1                    #时区 时间相关
redis==4.6.0                    #消息队列中间件
requests==2.28.1                #requests请求
rtsp==1.1.12                    #视频流
ruamel.yaml==0.17.21            #功能最全面的 YAML 1.2 处理器,完美支持 round-trip(往返)加载和保存 YAML 文件,保留所有原始格式细节。
ruamel.yaml.clib==0.2.6         #
Shapely==1.8.5.post1             #处理几何对象的顶级库,提供高效的几何运算和分析功能,基于 GEOS (Geometry Engine - Open Source) 库实现。
simplejson==3.17.6               #
six==1.16.0                      #解决python2与python3兼容性问题
sqlparse==0.4.2                  #
traitlets==5.3.0                 #为 Python 类提供强大的属性系统,是 Jupyter 项目的核心组件之一,特别适合构建可配置的应用程序和库。
typing_extensions==4.3.0         #Python 标准库 typing 的扩展,为旧版 Python 提供新类型提示功能的向后兼容支持,同时引入实验性类型功能。
tzdata==2023.3                   #Time Zone Database (tzdb)
uritemplate==4.1.1               #uri 模板
urllib3==1.26.11                 #
vine==5.0.0                      #Celery's Messaging Library
wcwidth==0.2.5                   #
websockets==11.0.3               #web 应用开发
Werkzeug==2.2.2                  #用于 Python 的 WSGI(Web Server Gateway Interface)工具库,为 Web 应用开发提供底层支持。它是 Flask 框架的核心依赖,但也可以独立使用,用于构建自定义 Web 服务器、中间件或框架。
zipp==3.8.1                      #主要用于 高效地处理 ZIP 文件,特别是与 Python 的 zipfile 标准库结合使用时,提供更便捷的路径操作和兼容性支持。
zope.event==4.5.0                #轻量级的事件系统,属于 Zope 生态系统的一部分,用于实现 观察者模式(Observer Pattern),允许对象之间通过事件进行松耦合通信。
zope.interface==5.4.0            #

1.15 web应用服务基本原理

tomcat、socket, IO流

思路:
启动socket服务,循环接收浏览器请求
接收到请求之后,将流中的数据取出
判断目标资源是否存在,若不存在,返回404
存在,则输出给客户端需要实线类:
server 开启socket服务
reuqest 封装请求
response 应答
test 测试类Tomcat默认端口8080

1.16 rtsp 与rtmp

RTMP用途:主要用于低延迟的实时视频流传输,如直播、视频聊天等。特点:基于TCP,强调稳定的连接和流畅的播放,但延迟通常较高(2-5秒)。场景:常见于Adobe Flash时代的直播(如Twitch早期),现仍用于部分直播推流(如OBS推流到CDN)。
RTSP用途:专注于控制实时媒体流的播放(如暂停、快进),常用于监控摄像头、视频会议等。特点:本身不传输数据,而是通过RTP(Real-Time Transport Protocol)传输音视频流,支持UDP以降低延迟(可低于1秒)。场景:IP摄像头、安防系统、视频监控(如海康威视设备)。

1.17 工程中python代码

import gevent.monkey
gevent.monkey.patch_all()
猴子补丁 遇到IO流快速切换 遇到time.sleep起作用django  中的manage用于项目管理:
用于启动开发服务器、创建数据库表、执行数据库迁移等。drf_yasg:生成API 2.0 文档的工具import asyncio
asyncio 是 Python 的异步 I/O 框架,用于编写单线程并发代码,特别适合处理高 I/O 密集型任务(如网络请求、文件读写、数据库查询等)import pytz
处理时区的流行库,它提供了 IANA 时区数据库(Olson 数据库) 的接口,用于精确处理全球各地的时区转换问题。cvid摄像头id
mid 地图id
pid 人员
tid ?Python 中的 sqlite3.connect() 函数详解
from sqlite3 import connect 
是 Python 标准库中用于连接 SQLite 数据库的核心函数,它创建或打开一个 SQLite 数据库连接,返回一个 Connection 对象用于后续数据库操作。# 创建/连接数据库(如果不存在会自动创建)
conn = connect('example.db')  # 返回Connection对象
# 执行SQL操作
cursor = conn.cursor()
cursor.execute("CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT)")
conn.commit()  # 提交事务
# 关闭连接
conn.close()

未完待续...

相关文章:

  • 连续变量与离散变量的互信息法
  • pcf8563时钟驱动编写记录
  • C++/SDL 进阶游戏开发 —— 双人塔防(代号:村庄保卫战 20)
  • Java响应式编程
  • 【C++篇】类和对象(上)
  • 第6章 Python 基本数据类型详解(int, float, bool, str)细节补充
  • 探索Grok-3的高级用法:功能与应用详解
  • SeataAT模式
  • 【傻呱呱】BIOS里的某个启动引导项丢失如何找回?
  • AtCoder AT_abc404_g [ABC404G] Specified Range Sums
  • Windows下编译WebRTC源码
  • 第1章 Python 解释器安装(Anaconda/Pyenv 推荐)
  • STM32基础教程——软件I2C
  • 域名与官网的迷思:数字身份认证的全球困境与实践解方-优雅草卓伊凡
  • RT-Thread studio的驱动5.1.0报错修改
  • Mybatisplus:一些常用功能
  • 【Linux】Linux应用开发小经验
  • vmware diffy配置ollama 本机ip无法访问
  • SMT贴片检验标准核心要点与实施规范
  • Learning vtkjs之WindowedSincPolyDataFilter
  • 习近平将对俄罗斯进行国事访问并出席纪念苏联伟大卫国战争胜利80周年庆典
  • 9米长林肯车开进“皖南川藏线”致拥堵数小时,车主回应称将配合调查
  • 贵州赤水丹霞大瀑布附近山体塌方车辆被埋,景区:无伤亡,道路已恢复
  • “五一”假期首日迎出游高峰:火车站人流“堪比春运”,热门景区门票预订量同比增三成
  • 人民日报评论员:焕发风雨无阻、奋勇前行的精气神
  • “80后”商洛市委副书记、市政府党组副书记赵孝任商洛市副市长