第一篇:Django简介
第一篇:Django简介
文章目录
- 第一篇:Django简介
- 一、纯手写一个简易版的web框架
- 1、软件开发架构
- 2、HTTP协议
- 3、简易的socket服务端
- 4、wsgiref模块
- 5、动静态网页
- 6、后端获取当前时间展示到html页面上
- 7、字典数据传给html文件
- 8、数据从数据库中获取的展示到html页面上
- 9、jinja2模块之模块语法
- 10、自定义模块总结
- 二、Django框架介绍
- 1、python三大主流web框架
- 2、Django安装
- 3、django基本操作
- 4、应用
- 5、总结
一、纯手写一个简易版的web框架
为了便于理解Django及web服务内部的原理,我们可以自己动手写一个简易版的web框架,便于理解思路。
Django框架为后端框架,为了连接前端与数据库。
1、软件开发架构
cs架构 客户端 服务端
bs架构 浏览器 服务端
# 本质bs也是cs
2、HTTP协议
- HTTP协议是应用层协议,属于网络协议
网络协议
HTTP协议 数据传输是明文
HTTPS协议 数据传输是密文
websocket协议 数据传输是密文
- 四大特性
1.基于请求响应
2.基于TCP、IP作用于应用层之上的协议
3.无状态
4.短/无链接
- 数据格式
请求首行
请求头
\r\n
请求体
- 相应状态码
1XX
2XX 200
3XX
4XX 403 404
5XX 500
3、简易的socket服务端
如何实现网址后缀名不同,而返回不同的内容?
我们先建一个简单的服务端,代码如下
# 你可已经web框架比作为服务端
import socketserver = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 不写默认是TCP链接
server.bind(('127.0.0.1', 8080))
server.listen(5)while True:conn, addr = server.accept()data = conn.recv(1024) # 接收到客户端发来的数据print(data) # 我们这里先打印以下数据conn.close()
我们使用浏览器进行访问,访问地址为127.0.0.1:8080
,为本地环回测试。
我们使用三次url进行测试,第一次为 127.0.0.1:8080; 第二次为127.0.0.1:8080/index; 第三次为127.0.0.1/login;便可以在服务端得到以下数据
通过观察数据,我们发现使用 utf-8进行解码之后,数据是已字符串的形式进行显示的,所以我们可以操作字符串,来拿到我们想要的链接的后缀,代码如下
# 你可已经web框架比作为服务端
import socketserver = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 不写默认是TCP链接
server.bind(('127.0.0.1', 8080))
server.listen(5)while True:conn, addr = server.accept()data = conn.recv(1024) # 接收到客户端发来的数据# print(data) # 我们这里先打印以下数据data = data.decode('utf-8')conn.send(b'HTTP/1.1 200 OK\r\n\r\n') # 根据http协议,此为请求头,请求体,和\r\ncurrent_path = data.split(' ')[1] # 我们可以操作字符串,拿到后缀# 对后缀进行简单的判断if current_path == '/index':conn.send('data from index'.encode('utf-8'))elif current_path == '/login':conn.send('data from login'.encode('utf-8'))else:conn.send(b'hello world') # 只有英文和数字,可以方便转为bytesconn.close()
于是我们可以看到,如果访问 127.0.0.1/index,我们可以看到
如果访问 127.0.0.1/login,我们可以看到
如果访问 127.0.0.1,我们可以看到
同时我们可以在服务端直接发送html界面,来实现以下效果,代码修改如下:
if current_path == '/index':# 打开html文件with open('02 html界面.html', mode='rb') as f:conn.send(f.read())
到了这里,我们虽然可以实现简单的交互,但是我们发现,该代码还是有很多不足之处。
1.代码重复(服务端代码所有人都要重复写)
2.手动处理http格式的数据,并且只能拿到url后缀,而且其他数据获取繁琐(数据格式一样处理的代码其实也大致一样 重复写)
3、不能实现并发【同一服务端只能由一个客户端进行访问】
4、wsgiref模块
wsgiref模块对socket server部分做了一定的优化,减少了造轮子,同时变得更加精简,我们利用wsgiref模块来替换我们自己写的web框架的socket server部分。
"""
wsgiref模块1.请求来的时候解析http格式的数据 封装成大字典2.响应走的时候给数据打包成符合http格式 再返回给浏览器
"""
我们使用 127.0.0.1/index 进行访问,虽然在print(env)
这里会报错,但是我们会发现
from wsgiref.simple_server import make_serverdef run(env, response): # 监听到客户端,make_server会给run传递两个参数""":param env: 请求相关的所有数据:param response: 响应相关的所有数据:return: 返回给浏览器的数据"""print(env) # passif __name__ == '__main__':server = make_server('127.0.0.1', 8080, run)"""会实时监听127.0.0.1:8080地址 只要有客户端来了都会交给run函数处理(加括号触发run函数的运行)flask启动源码make_server('127.0.0.1',8080,obj)__call__"""server.serve_forever() # 启动服务端
所以,env为一个大字典,里面包含了各种各样的信息
我们接着对wsgiref的后续代码进行补充,可以实现和上面自己的web服务一样的服务,同时,比自己写的精简不少。
后续补充代码如下
from wsgiref.simple_server import make_serverdef run(env, response): # 监听到客户端,make_server会给run传递两个参数""":param env: 请求相关的所有数据:param response: 响应相关的所有数据:return: 返回给浏览器的数据"""print(env) # 大字典 wsgiref模块帮你处理好http格式的数据 封装成了字典让你更加方便的操作response('200 OK', []) # 响应首行 响应头current_path = env.get('PATH_INFO')if current_path == '/index':return [b'data from index']elif current_path == '/login':return [b'data from login']return [b'404 error']if __name__ == '__main__':server = make_server('127.0.0.1', 8080, run)"""会实时监听127.0.0.1:8080地址 只要有客户端来了都会交给run函数处理(加括号触发run函数的运行)flask启动源码make_server('127.0.0.1',8080,obj)__call__"""server.serve_forever() # 启动服务端
但是,到了这里,又会出现新的问题,如果你的后缀页面太多,难道要一直使用elif
进行添加吗?【参考函数字典】
代码如下:
from wsgiref.simple_server import make_serverdef index(env): # 这里传env是为了让函数内部更好的处理数据return 'data from index'def login(env):return 'data from login'def error(env):return 'data not found'# url与函数的对应关系
urls = [('/index', index),('/login', login)
]def run(env, response): # 监听到客户端,make_server会给run传递两个参数""":param env: 请求相关的所有数据:param response: 响应相关的所有数据:return: 返回给浏览器的数据"""print(env) # 大字典 wsgiref模块帮你处理好http格式的数据 封装成了字典让你更加方便的操作response('200 OK', []) # 响应首行 响应头current_path = env.get('PATH_INFO')# 定义一个变量 存储匹配到的函数名func = Nonefor url in urls:if current_path == url[0]:# 将url对应的函数名赋值给funcfunc = url[1]break # 匹配到一个之后 应该立刻结束for循环,减少无用匹配# 判断func是否有值if func:res = func(env)else:res = error(env)# 统一将返回的函数返回的转码成二进制,并返回给浏览器return [res.encode('utf-8')]if __name__ == '__main__':server = make_server('127.0.0.1', 8080, run)"""会实时监听127.0.0.1:8080地址 只要有客户端来了都会交给run函数处理(加括号触发run函数的运行)flask启动源码make_server('127.0.0.1',8080,obj)__call__"""server.serve_forever() # 启动服务端
好了,已经到了这里,你以为结束了吗?还远远没有,我们发现代码全部写在了一个文件中,看起来很冗余,不方便进行拓展。【参考软件开发目录规范】
我们将代码分文件进行存储。分为三个py文件和一个文件夹(用来存放html文件)。
- start.py
from wsgiref.simple_server import make_server
from urls import urls
from views import *def run(env, response): # 监听到客户端,make_server会给run传递两个参数""":param env: 请求相关的所有数据:param response: 响应相关的所有数据:return: 返回给浏览器的数据"""print(env) # 大字典 wsgiref模块帮你处理好http格式的数据 封装成了字典让你更加方便的操作response('200 OK', []) # 响应首行 响应头current_path = env.get('PATH_INFO')# 定义一个变量 存储匹配到的函数名func = Nonefor url in urls:if current_path == url[0]:# 将url对应的函数名赋值给funcfunc = url[1]break # 匹配到一个之后 应该立刻结束for循环,减少无用匹配# 判断func是否有值if func:res = func(env)else:res = error(env)# 统一将返回的函数返回的转码成二进制,并返回给浏览器return [res.encode('utf-8')]if __name__ == '__main__':server = make_server('127.0.0.1', 8080, run)"""会实时监听127.0.0.1:8080地址 只要有客户端来了都会交给run函数处理(加括号触发run函数的运行)flask启动源码make_server('127.0.0.1',8080,obj)__call__"""server.serve_forever() # 启动服务端
-
urls.py
存放路由与视图函数对应关系
from views import *# url与函数的对应关系
urls = [('/index', index),('/login', login)
]
-
views.py
用来存放视图函数(后端业务逻辑),也就是放访问到特定的后缀时访问该函数。
def index(env): # 这里传env是为了让函数内部更好的处理数据return 'data from index'def login(env):return 'data from login'def error(env):return 'data not found'
-
temlates文件夹
用来存放html页面文件
总结:
如此一来,按照功能的不同拆分之后,后续添加功能只需要在urls.py书写对应关系然后去views.py书写业务逻辑即可。
5、动静态网页
-
静态网页
简单来说,就是页面上的数据是直接写死的,不会改变。
-
动态网页
网页上的数据是实时获取的。
eg:1.后端获取当前时间展示到html页面上2.数据是从数据库中获取的数据展示到html页面上
6、后端获取当前时间展示到html页面上
此时,我们直接从 views.py 和 urls.py 文件中添加即可。效果如下。
代码如下:
"""urls.py中"""
urls = [('/index', index),('/login', login),('/get_time', get_time)
]"""views.py"""
def get_time(env):import datetimecurrent_time = datetime.datetime.now().strftime('%Y-%m-%d %X')# 如何将后端获取到的数据"传递"给html文件?with open('templates/01 myhtml.html', mode='rt', encoding='utf-8') as f:# 在后端将html页面处理好之后再返回给前端data = f.read().replace('message', current_time)return data # data就是一堆字符串"""01 myhtml.html"""
<div><h1>这是从后端传来的数据</h1><h1>message</h1>
</div>
7、字典数据传给html文件
将一个字典传递给html文件 并且可以在文件上方便快捷的操作字典数据,访问效果如下
这里我们需要导入一个jinja2
模块,来进行操作,代码如下
"""templates/02 get_dict.html"""
<h1>我是一个页面</h1>
{{ user }}
{{ user.get('username')}} # 类似python取字典
{{ user.age }} # 类似js取字典
{{ user['hobby'] }} # 类似python取字典"""urls.py"""
urls = [('/index', index),('/login', login),('/get_time', get_time),('/get_dict', get_dict) # 添加路由对象关系
]"""views.py"""
def get_dict(env):from jinja2 import Template# 创建一个字典user_dic = {'username': 'yangyi','age': 18,'hobby': 'study'}with open('templates/02 get_dict.html', mode='rt', encoding='utf-8') as f:data = f.read()tmp = Template(data) # 给get_dict.html传递了一个值 页面上通过变量名user就能够拿到user_dictres = tmp.render(user=user_dic)# 返回给浏览器数据return res
8、数据从数据库中获取的展示到html页面上
我们先使用navicat快速创建一个数据库,数据库效果如下。
浏览器展示效果如下:
具体代码如下:
"""get_data.html"""
<div class="container"> # 使用bootstrap进行渲染<div class="row"><div class="col-md-8 col-md-offset-2"><h1 class="text-center">用户数据</h1><table class="table table-hover table-striped"><thead><tr><th>ID</th><th>username</th><th>password</th><th>hobby</th></tr></thead><tbody>
<!-- [{},{},{},{},{}]--> # jinja2模块可以实现数据for循环{% for user_dict in user_list %}<tr><td>{{ user_dict.id}}</td><td>{{ user_dict.username}}</td><td>{{ user_dict.password}}</td><td>{{ user_dict.hobby}}</td></tr>{% endfor%}</tbody></table></div></div>
</div>"""usls.py"""
urls = [('/index', index),('/login', login),('/get_time', get_time),('/get_dict', get_dict),('/get_data', get_data)
]"""views.py"""
def get_data(env):# 导入pymysql模块,用来操作数据库import pymysql# 去数据库中获取数据 传递给html页面 借助于模版语法 发送给浏览器from jinja2 import Templateconn = pymysql.connect(host='127.0.0.1',port=3306,user='root',password='123',db='day59',charset='utf8',autocommit=True)cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)# 写sql语句sql = 'select * from user_info'# 受影响的行数affect_rows = cursor.execute(sql)data_list = cursor.fetchall() # [{},{},{}]# 将获取到的数据传递给html文件with open('templates/03 get_data.html', mode='rt', encoding='utf-8') as f:data = f.read()tmp = Template(data)res = tmp.render(user_list=data_list)return res
9、jinja2模块之模块语法
pip3 install jinja2
"""模版语法是在后端起作用的"""# 模版语法(非常贴近python语法)
{{ user }}
{{ user.get('username')}}
{{ user.age }}
{{ user['hobby'] }}# 实现for循环
{% for user_dict in user_list %}
<tr><td>{{ user_dict.id}}</td><td>{{ user_dict.username}}</td><td>{{ user_dict.password}}</td><td>{{ user_dict.hobby}}</td>
</tr>
{% endfor%}
10、自定义模块总结
简易版本web框架流程图如下
二、Django框架介绍
1、python三大主流web框架
-
Django
特点:大而全 自带的功能特别特别特别的多 类似于航空母舰 不足之处:有时候过于笨重
-
flask
特点:小而精 自带的功能特别特别特别的少 类似于游骑兵第三方的模块特别特别特别的多,如果将flask第三方的模块加起来完全可以盖过django并且也越来越像django 不足之处:比较依赖于第三方的开发者
-
tornado
特点:异步非阻塞 支持高并发
-
总结:
"""web模块分为三部分"""A:socket部分B:路由与视图函数对应关系(路由匹配)C:模版语法"""django"""A用的是别人的 wsgiref模块B用的是自己的C用的是自己的(没有jinja2好用 但是也很方便)"""flask"""A用的是别人的 werkzeug(内部还是wsgiref模块)B自己写的C用的别人的(jinja2)"""tornado"""A,B,C都是自己写的
2、Django安装
- 正常启动要求
# 如何让你的计算机能够正常的启动django项目
1.计算机的名称不能有中文
2.一个pycharm窗口只开一个项目
3.项目里面所有的文件也尽量不要出现中文
4.python解释器尽量使用3.4~3.6之间的版本(如果你的项目报错,你点击最后一个报错信息,去源码中把逗号删掉)
- 版本
# django版本问题1.X 2.X 3.X(直接忽略) 这里使用django 1.11.11版本
- 安装
# django安装pip3 install django==1.11.11# 或者使用pycharm进行安装
3、django基本操作
- 命令行执行
# 1.创建django项目
"""先切换到要创建的文件路径,然后进行创建"""django-admin startproject mysite # 创建一个名为mysite的django项目mysite文件夹manage.pymysite文件夹__init__.pysettings.pyurls.pywsgi.py
# 2.启动django项目
"""一定要先切换到项目目录下 cd /mysite
"""
python3 manage.py runserver # 启动django服务器
# http://127.0.0.1:8000/
# 3.创建应用
"""
Next, start your first app by running python manage.py startapp [app_label].
"""python3 manage.py startapp app01
应用名应该做到见名知意
- pycharm操作
# 1 new project 选择左侧第二个django即可# 2 启动1.还是用命令行启动2.点击绿色小箭头即可# 3 创建应用1.pycharm提供的终端直接输入完整命令2.pycharm tools run manage.py task提示# 4 修改端口号以及创建server【可选】edit confi....
刚创建的django项目都出错【我裂开了】,仔细观察,我们发现是路径拼接方式不对,稍作修改即可。
创建app01,文件夹中文件如下。
4、应用
django是一款专门用来开发app的web框架。一个app就是一个独立的功能模块.
"""
django框架就类似于是一所大学(空壳子)
app就类似于大学里面各个学院(具体功能的app)比如开发淘宝订单相关用户相关投诉相关创建不同的app对应不同的功能选课系统学生功能老师功能
"""
重点:创建的应用一定要去配置文件中注册
将settings.py中的参数进行修改,方式如下
INSTALLED_APPS = ['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','app01.apps.App01Config', # 全写'app01', # 简写
]# ps:你在用pycharm创建项目的时候 pycharm可以帮你创建一个app并且自动注册
主要文件介绍
-mysite项目文件夹--mysite文件夹---settings.py 配置文件---urls.py 路由与视图函数对应关系(路由层)---wsgi.py wsgiref模块(不考虑)--manage.py django的入口文件--db.sqlite3 django自带的sqlite3数据库(小型数据库 功能不是很多还有bug)--app01文件夹---admin.py django后台管理---apps.py 注册使用---migrations文件夹 数据库迁移记录---models.py 数据库相关的 模型类(orm)---tests.py 测试文件---views.py 视图函数(视图层)
命令行与pycharm的区别
命令行创建不会自动有templates文件夹 需要你自己手动创建而pycharm会自动帮你创建并且还会自动在配置文件中配置对应的路径。
# pycharm创建
TEMPLATES = [{'BACKEND': 'django.template.backends.django.DjangoTemplates','DIRS': [os.path.join(BASE_DIR, 'templates')]
]# 命令行创建
TEMPLATES = [{'BACKEND': 'django.template.backends.django.DjangoTemplates','DIRS': [],
]"""
也就意味着你在用命令创建django项目的时候不单单需要创建templates文件夹还需要去配置文件中配置路径
'DIRS': [os.path.join(BASE_DIR, 'templates')]
"""
django小白必会三板斧
-
HttpResponse
返回字符串类型的数据
from django.shortcuts import render, HttpResponse, redirect# Create your views here.def index(request):return HttpResponse('曾经沧海难为水,除却巫山不是云。')
-
render
返回html文件的
def get_html(request):# 自动去tempaltes文件夹下帮你查找文件return render(request, 'myhtml.html')
如何实现向html文件中如何传参?
第一种:
# 第一种
"""show_arg.html"""
<div>{{ data }}</div>
<div>{{ date }}</div>"""views.py"""
def show_arg(request):user_dict = {'name': 'yangyi','age': 18,'gender': 'male'}# 第一种传值方式:更加的精确 节省资源(需要将数据赋值给一个接受的变量中,如 data date)return render(request, 'show_arg.html', {'data': user_dict, 'date': 123})
效果如下所示
第二种:
# 第二种
"""show_arg.html"""
<div>{{ user_dict }}</div>"""views.py"""
def show_arg(request):user_dict = {'name': 'yangyi','age': 18,'gender': 'male'}# 第二种传值方式:当你要传的数据特别多的时候"""locals会将所在的名称空间中所有的名字全部传递给html页面"""return render(request, 'show_arg.html', locals())
-
redirect
重定向
# 1、重定向去其它地址 def new_addr(request):return redirect('https://www.youku.com')# 2、重定向去自定义地址 def new_addr(request):return redirect('/home/')def home(request): # 被重定向的函数也得注册return HttpResponse('from home')
5、总结
"""我们在使用django框架的时候的步骤"""
1、使用pycharm创建一个django项目
2、将配置文件中templates的注册路径进行修改
3、创建应用
4、注册应用
5、书写views.py文件
6、配置urls.py文件【注意:要导入views模块】 # from app01 import views
相关文章:
第一篇:Django简介
第一篇:Django简介 文章目录 第一篇:Django简介一、纯手写一个简易版的web框架1、软件开发架构2、HTTP协议3、简易的socket服务端4、wsgiref模块5、动静态网页6、后端获取当前时间展示到html页面上7、字典数据传给html文件8、数据从数据库中获取的展示到…...
2025年渗透测试面试题总结-拷打题库13(题目+回答)
网络安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 2025年渗透测试面试题总结-拷打题库13 一、GitHub等三方敏感信息泄漏防御 二、业务逻辑漏洞技术规避 …...
(09)Vue脚手架的使用(Vite、vue-cli、create-vue)
本系列教程目录:Vue3Element Plus全套学习笔记-目录大纲 文章目录 第3章 Vue脚手架3.1 vite3.3.1 Vite使用1)创建Vite项目2)Vite项目打包 3.1.2 组件化开发3.1.4 Vite工程运行原理1)分析main.js2)自定义根组件 3.2 vue…...
Unity 将Excel表格中的数据导入到Mysql数据表中
1.Mysql数据表users如下: 2.即将导入的Excel表格如下: 3.代码如下: using System; using System.Data; using System.IO; using Excel; using MySql.Data.MySqlClient; using UnityEngine; using UnityEditor;public class ImportExcel {// …...
【QT】信号与槽中多个按钮(pushbutton)共用一个槽函数的两种实现方式
两种方法的对比 方法1:sender() 优点:代码简洁,无需额外参数 缺点:依赖运行时类型转换,安全性较低 适用场景:简单场景,少量按钮 方法2:Lambda (推荐) 优点:安全直观&…...
Python----深度学习(神经网络的过拟合解决方案)
一、正则化 1.1、正则化 正则化是一种用于控制模型复杂度的技术。它通过在损失函数中添加额外的项(正则 化项)来降低模型的复杂度,以防止过拟合。 在机器学习中,模型的目标是在训练数据上获得较好的拟合效果。然而,过…...
【金仓数据库征文】从 HTAP 到 AI 加速,KingbaseES 的未来之路
国产数据库早已实现 “可替代”,但要真正与国际头部厂商掰手腕,必须在 HTAP(Hybrid‑Transaction/Analytical Processing)与 AI 加速 两条技术赛道上实现跨越。KingbaseES 自 V8R3 调整为多进程架构后,历经 V8R6、KSOn…...
创建第一个Spring Boot项目
什么是Spring Boot 随着Spring的快速发展,项目中的XML文件越来越多,繁琐的配置以及,整合第三方框架的配置问题,导致大大增加了开发和部署的效率,使开发者无法专心于业务的开发。Spring Boot就相当于使Spring框架的脚手…...
Java—— 正则表达式 练习
需求: 请编写正则表达式验证用户输入的手机号码是否满足要求。 请编写正则表达式验证用户输入的邮箱号是否满足要求。 请编写正则表达式验证用户输入的电话号码是否满足要求。 验证手机号码 13112345678 13712345667 13945679027 139456790271 验证座机电话号码 02…...
Linux[指令与权限]
Linux指令与权限 Linux环境中,打包文件有多种 tar (打包/解包) 指令 tar -czvf 文件要打包到的位置 文件(打包并压缩到) tar -xzvf 文件(在当前目录下解压) tar选项 -c创建压缩文件 -z使用gzip属性压缩 -v展现压缩过程 -f后面使用新建文档名 -x不要新建,解压 -C 文件…...
MySQL数据库精研之旅第十期:打造高效联合查询的实战宝典
专栏:MySQL数据库成长记 个人主页:手握风云 目录 一、简介 1.1. 为什么要使用联合查询 1.2. 多表联合查询时的计算 1.3. 示例 二、内连接 2.1. 语法 2.2. 示例 三、外连接 4.1. 语法 4.2. 示例 一、简介 1.1. 为什么要使用联合查询 一次查询需…...
【Redis】集合类型Set 常用命令详解
1. sadd - 添加 语法:sadd key value > sadd testset A 1 > sadd testset B 1 > sadd testset C 1 > sadd testset C # set的值不能重复 0 > smembers set1 # 查询指定set的所有值,乱序 1) "B" 2) "A" 3) "C&qu…...
React 5 种组件提取思路与实践
在开发时,经常遇到一些高度重复但略有差异的 UI 模式,此时我们当然会把组件提取出去,但是组件提取的方式有很多,怎么根据不同场景选取合适的方式呢?尤其时在复杂的业务场景中,组件提取的思路影响着着代码的可维护性、可读性以及扩展性。本文将以一个[详情]组件为例,探讨…...
第十五届蓝桥杯 2024 C/C++组 合法密码
目录 题目: 题目描述: 题目链接: 思路: substr函数: 思路详解: 代码: 代码详解; 题目: 题目描述: 题目链接: P10906 [蓝桥杯 2024 国 B] 合法密码 -…...
云原生时代的双轮驱动
在当今数字化浪潮汹涌澎湃的时代,企业 IT 主管、CIO、CTO 们肩负着引领企业乘风破浪、实现数字化转型的重任。而主数据平台与数据中台,宛如企业数字化征程中的双引擎,为企业发展注入强劲动力。 一、主数据与数据中台:企业数据世界…...
GD32F407单片机开发入门(六)定时器TIMER详解及实战含源码
文章目录 一.概要二.通用定时器内部结构1.时基单元2.时钟源3.输入捕获4.输出比较 三.通用定时器内部特色四.TIME定时器1ms中断例程五.工程源代码下载六.小结 一.概要 定时器就是计数器,应用在我们生活的方方面面,比如有闹钟、计时器等。在GD32F407VET6定…...
时序数据库 TDengine 助力石油石化业务, 平滑接替 Oracle 数据库
小T导读:胜软科技在石油石化行业中选择使用 TDengine 处理时序数据,不仅显著降低了运维数据库的成本,也大幅减少了存储空间的占用,实现了从原有的 40 多套 Oracle 数据库向仅 9 套 TDengine集群的精简替换。在迁移过程中ÿ…...
【问题解决】本机navicat连接云服务器mysql
一般情况下,当你使用navicat等工具连接云服务器会因为mysql的安全机制,导致无法连接root用户,但是在测试环境中,不考虑安全性的前提条件下,可以通过修改MySQL的配置文件来连接云服务器mysql的root用户。 选择数据库&am…...
STM32F407 的通用定时器与串口配置深度解析
在 STM32F407 芯片的开发过程中,通用定时器和串口的配置与使用是极为关键的技能点。本文将结合提供的代码示例,深入剖析这两个模块的配置流程、工作原理以及实际应用,助力开发者更好地掌握相关技术。 一、通用定时器 (一&#x…...
深入探究Linux项目自动化构建工具:make与Makefile
目录 引言 一、make与Makefile概述 1.1 背景 1.2 理解 二、make工作原理 2.1 查找Makefile 2.2 确定目标文件 2.3 处理文件依赖 三、Makefile实例分析 3.1 简单C程序示例 3.2 项目清理机制 四、结合行缓冲区概念的有趣现象 五、结语 引言 在Linux软件开发的世界里…...
【Hive入门】Hive基础操作与SQL语法:DDL操作全面指南
目录 1 Hive DDL操作概述 2 数据库操作全流程 2.1 创建数据库 2.2 查看数据库 2.3 使用数据库 2.4 修改数据库 2.5 删除数据库 3 表操作全流程 3.1 创建表 3.2 查看表信息 3.3 修改表 3.4 删除表 4 分区与分桶操作 4.1 分区操作流程 4.2 分桶操作 5 最佳实践与…...
STM32F103 “BluePill” 上的 DMA 原理与实践
摘要:本文深入浅出地介绍什么是 DMA(直接存储器访问),它的核心原理、硬件架构,以及在 STM32F103(BluePill)上常见的几种使用场景(ADC、UART、内存拷贝等)。通过对比 CPU 轮询、中断、DMA 三种方式的数据搬运效率,结合寄存器级和 HAL 库示例代码,并附带性能测试与优化…...
软考软件设计师30天备考指南
文章目录 一、考情分析(一)综合知识(二)案例分析 二、30天学习规划(一)第1 - 5天:基础夯实(二)第6 - 10天:核心知识突破(三)第11 - 15…...
比较:AWS VPC peering与 AWS Transit Gateway
简述: VPC 对等连接和 Transit Gateway 用于连接多个 VPC。VPC 对等连接提供全网状架构,而 Transit Gateway 提供中心辐射型架构。Transit Gateway 提供大规模 VPC 连接,并简化了 VPC 间通信管理,相比 VPC 对等连接,支持大量 VPC 的 VPC 间通信管理。 VPC 对等连接 AWS V…...
【AI大模型】MCP:AI应用的“超级扩展坞”
一、什么是MCP MCP(Model Context Protocol,模型上下文协议)是一种新兴的开放协议,于2024年11月由Anthropic公司(Claude的开发者)开源。它的核心目标是建立一个类似USB-C的标准化协议,统一AI模…...
线程封装
目录 makefile Thread.hpp main.cc 以面向对象的方式造轮子 #ifndef _THREAD_HPP__ // 如果没有定义过 _THREAD_HPP__ #define _THREAD_HPP__ // 则定义 _THREAD_HPP__// 这里是头文件的实际内容(类、函数声明等)#endif // 结束条件…...
【Java后端】MyBatis 与 MyBatis-Plus 如何防止 SQL 注入?从原理到实战
在日常开发中,SQL 注入是一种常见但危害巨大的安全漏洞。如果你正在使用 MyBatis 或 MyBatis-Plus 进行数据库操作,这篇文章将带你系统了解:这两个框架是如何防止 SQL 注入的,我们又该如何写出安全的代码。 什么是 SQL 注入&#…...
智能穿戴的终极形态会是AR眼镜吗?
清晨的地铁里,戴着普通眼镜的小张正通过镜片查看实时导航路线,眼前的虚拟箭头精准指引换乘方向;手术室里,主刀医生透过镜片看到患者血管的3D投影,如同获得透视眼般精准避开危险区域;装修现场,设…...
ubantu18.04(Hadoop3.1.3)Hive3.1.2安装指南
说明:本文图片较多,耐心等待加载。(建议用电脑) 注意所有打开的文件都要记得保存。本文的操作均在Master主机下进行 第一步:准备工作 本文是在之前Hadoop搭建完集群环境后继续进行的,因此需要读者完成我之…...
Hive 多表查询案例
文章目录 前提条件Hive 多表查询案例JOIN案例JOIN查询数据准备1. 内连接(INNER JOIN)2. 左外连接(LEFT OUTER JOIN)3. 右外连接(RIGHT OUTER JOIN)4. 全外连接(FULL OUTER JOIN)5. 多…...
4.23刷题记录(栈与队列专题)
第一部分:基础知识 栈先进后出,队列先进先出栈用stack实现,主要函数有pop,push,top队列由queue或者deque实现,主要函数有front,back,push,pop,emplace&#…...
Python常用的第三方模块之【jieba库】支持三种分词模式:精确模式、全模式和搜索引擎模式(提高召回率)
Jieba 是一个流行的中文分词Python库,它提供了三种分词模式:精确模式、全模式和搜索引擎模式。精确模式尝试将句子最精确地切分,适合文本分析;全模式则扫描文本中所有可能的词语,速度快但存在冗余;搜索引擎…...
Redisson实战:分布式系统中的五大典型应用场景
引言 在分布式系统架构中,数据一致性、高并发控制和资源协调是开发者面临的核心挑战。Redisson作为基于Redis的Java客户端,不仅提供了丰富的分布式对象和服务,还简化了分布式场景下的编程模型。本文将通过实际代码示例,解析Redis…...
webrtc建立连接的过程
WebRTC 连接全过程:从零到视频通话的每一步 WebRTC 是个神奇的技术,让浏览器直接进行点对点(P2P)音视频通话或数据传输,不用每次都靠服务器中转。想知道 Alice 和 Bob 是怎么通过 WebRTC 建立视频通话的吗?…...
system verilog 语句 耗时规则
在 SystemVerilog 中,确实有一类语句是**不消耗仿真时间(zero simulation time)**的,我们一般叫它们: ✅ 零延迟语句(Zero-Time Statements) 🔹1. 什么是“不费时间”的语句? 这些语句在仿真时…...
【Docker】在Ubuntu平台上的安装部署
写在前面 docker作为一种部署项目的辅助工具,真是太好用了需要魔法,不然无法正常运行笔者环境:ubuntu22.04 具体步骤 更新系统包索引 sudo apt update安装必要依赖包 sudo apt install -y apt-transport-https ca-certificates curl softwa…...
2025年阅读论文的常用工具推荐
在快速发展的学术界,阅读和整理论文的能力对于研究者和学生来说至关重要。随着科技的进步,各种工具应运而生,帮助我们更高效地处理文献。本文将为您推荐一些2025年最常用的阅读论文工具,让您的学术之路更加顺畅。 1. SumiNote S…...
pod内部共享命名空间与k8s命名空间是一个东西吗?
文章目录 小知识-命名空间**下面着重介绍一下刚刚提到的内部命名空间**IPC NamespaceNetwork Namespace 本文摘自于我的免费专栏《Kubernetes从0到1(持续更新)》请多关注 小知识-命名空间 注意,首先我要强调一点,Kubernetes命名空…...
Linux笔记---进程间通信:匿名管道
1. 管道通信 1.1 管道的概念与分类 管道(Pipe) 是进程间通信(IPC)的一种基础机制,主要用于在具有亲缘关系的进程(如父子进程、兄弟进程)之间传递数据,其核心特性是通过内核缓冲区实…...
JAVA设计模式——(三)桥接模式
JAVA设计模式——(三)桥接模式(Bridge Pattern) 介绍理解实现武器抽象类武器实现类涂装颜色的行为接口具体颜色的行为实现让行为影响武器修改武器抽象类修改实现类 测试 适用性 介绍 将抽象和实现解耦,使两者可以独立…...
设计模式--工厂模式详解
工厂模式 作用: 实现了创建者与调用者的分离 详细分类 简单工厂模式 工厂方法模式 抽象工厂模式 OOP七大原则: 开闭原则:一个软件的实体应该对拓展开发,对修改关闭 依赖反转原则:要针对接口编程,不…...
每天五分钟深度学习PyTorch:图像的处理的上采样和下采样
本文重点 在pytorch中封装了上采样和下采样的方法,我们可以使用封装好的方法可以很方便的完成采样任务,采样分为上采样和下采样。 上采样和下采样 下采样(缩小图像)的主要目的有两个:1、使得图像符合显示区域的大小;2、生成对应图像的缩略图。 下采样( 放大图像)的…...
前端面试场景题
目录 1.项目第一次加载太慢优化 / vue 首屏加载过慢如何优化 2.说说了解的es6-es10的东西有哪些 ES6(ES2015)之后,JavaScript 新增了许多实用的数组和对象方法,下面为你详细介绍: 3.常见前端安全性问题 XSS&#…...
国际化不生效
经过我的重重检查 最终发现是 版本问题。 原本下载默认next版本cnpm install vue-i18nnext 下载 国际化插件 cnpm install vue-i18n^9.14.3 删除掉node_models,再重新加载包:cnpm install 这时候就可以正常显示了 国际化操作: en.js zh…...
新一代人工智能驱动医疗数智化:范式变革、实践方向及路径选择
人工智能(AI)正以前所未有的速度重构医疗健康行业的底层逻辑,从数据获取、知识建模到临床决策支持,AI不仅是“辅助工具”,更日益成为医疗生产力体系的核心引擎。随着大模型、计算平台和数智基础设施的迅猛发展,医疗数智化正进入从“点状创新”走向“系统重构”的深水区。…...
OpenCV 图形API(55)颜色空间转换-----将图像从 RGB 色彩空间转换为 I420 格式函数RGB2I420()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 将图像从 RGB 色彩空间转换为 I420 色彩空间。 该函数将输入图像从 RGB 色彩空间转换为 I420。R、G 和 B 通道值的常规范围是 0 到 255。 输出图…...
大模型安全吗?数据泄露与AI伦理的黑暗面!
大模型安全吗?数据泄露与AI伦理的黑暗面! 随着人工智能技术的飞速发展,尤其是大型语言模型(如GPT-3、BERT等)的出现,AI的应用场景越来越广泛,从智能客服到内容生成,从医疗诊断到金融…...
穿越链路的旅程:深入理解计算机网络中的数据链路层
一、引言 在计算机网络的七层模型中,数据链路层(Data Link Layer) 是连接物理世界与逻辑网络世界的关键一环。它位于物理层之上,网络层之下,负责将物理层的“比特流”转换成具有结构的数据帧,并确保数据在…...
《AI大模型应知应会100篇》第35篇:Prompt链式调用:解决复杂问题的策略
第35篇:Prompt链式调用:解决复杂问题的策略 摘要 在大模型应用中,单次提示的能力往往受限于上下文长度和任务复杂度。为了解决这些问题,Prompt链式调用应运而生。本文将深入探讨如何通过分解任务、设计逻辑链路、传递中间结果&am…...
管理100个小程序-很难吗
20公里的徒步-真难 群里的伙伴发起了一场天目山20公里徒步的活动,想着14公里都轻松拿捏了,思考了30秒后,就借着春风带着老婆孩子就出发了。一开始溪流清澈见底,小桥流水没有人家;青山郁郁葱葱,枯藤老树没有…...