关于建设网站的合作合同范本网站怎么推广运营

news/2025/9/27 2:12:20/文章来源:
关于建设网站的合作合同范本,网站怎么推广运营,响应式品牌网站设计,优化大师下载电脑版目录 一、什么是WSGI1.1 WSGI接口的组成部分1.2 关于environ 二、简易的web框架实现2.1 文件结构2.2 在web/my_web.py定义动态响应内容2.3 在html/index.html中定义静态页面内容2.4 在web_server.py中实现web服务器框架2.5 测试 三、让简易的web框架动态请求支持多页面3.1 修改… 目录 一、什么是WSGI1.1 WSGI接口的组成部分1.2 关于environ 二、简易的web框架实现2.1 文件结构2.2 在web/my_web.py定义动态响应内容2.3 在html/index.html中定义静态页面内容2.4 在web_server.py中实现web服务器框架2.5 测试 三、让简易的web框架动态请求支持多页面3.1 修改web_server.py3.2 修改web/my_web.py3.3 在根路径下添加页面3.4 测试 四、让简易的web框架支持路由功能五、静态、伪静态和动态页面的区别5.1 静态URL5.2 动态URL5.3 伪静态URL 六、完善简易的web框架6.1 添加数据库6.2 让响应改成伪静态响应6.3 让响应查询数据库6.3 修改index.html和center.html页面6.4 让路由支持正则6.5 新增添加关注操作6.7 添加修改关注操作 七、日志模块7.1 将日志输出到控制台7.2 将日志输出到文件7.3 将日子输出到控制台和文件 一、什么是WSGI WSGIWeb Server Gateway Interface并不是一个具体的框架而是一个用于连接Web服务器和Web应用程序的标准接口规范。WSGI的设计目的是使Web服务器和Web应用程序之间的通信更加简单和通用化。它是为各种Python web框架提供统一的接口标准。 一些基于WSGI标准的框架包括 Flask一个轻量级的Web框架使用WSGI作为其底层服务器接口。Django一个完整的Web框架也是使用WSGI标准与Web服务器进行通信。Pyramid一个灵活的Web框架也是基于WSGI标准构建的。Bottle一个微小而简单的Web框架同样使用WSGI作为其服务器接口。CherryPy一个功能强大的Web框架通过WSGI与服务器进行交互。 这些框架中的每一个都提供了一个WSGI应用程序对象可以通过WSGI服务器来运行和提供给外部的请求。通过使用WSGI接口这些框架可以与任何符合WSGI标准的Web服务器进行交互并实现跨服务器平台的灵活性和兼容性。 1.1 WSGI接口的组成部分 使用WSGI接口可以实现Web应用程序与各种Web服务器之间的解耦使得同一个应用程序可以在不同的Web服务器上运行而不需要改变应用程序的代码。下面是WSGI接口的主要组成部分 Application对象WSGI应用程序是一个可调用的对象通常是一个函数也可以是一个带有 call 方法的类实例。当Web服务器接收到请求时它会调用应用程序对象来处理请求并生成响应。Environ字典Web服务器将请求的相关信息封装在Environ字典中并作为参数传递给应用程序对象。Environ字典包含了关于请求的各种元数据如请求方法、URL路径、请求头等。Start_response函数在应用程序内部通过调用start_response函数来发送响应头信息。start_response函数接收响应状态码和响应头字段作为参数并返回一个用于发送响应体的可调用对象类似于迭代器。返回值应用程序对象需要返回一个响应体body的可迭代对象。可迭代对象的每个元素都表示响应体的一部分内容。 例如定义一个最简单web请求响应 def application(environ, start_response):start_response(200 OK, [(Content-Type, text/html)])return Hello World!上面的application()函数就是符合WSGI标准的一个HTTP处理函数它接收两个参数 environ一个包含所有HTTP请求信息的dict对象start_response一个发送HTTP响应的函数。 整个application()函数本身没有涉及到任何解析HTTP的部分也就是说把底层web服务器解析部分和应用程序逻辑部分进行了分离这样开发者就可以专心做一个领域了 不过等等这个application()函数怎么调用如果我们自己调用两个参数environ和start_response我们没法提供返回的str也没法发给浏览器。 所以application()函数必须由WSGI服务器来调用。有很多符合WSGI规范的服务器。而我们此时的web服务器项目的目的就是做一个既能解析静态网页还可以解析动态网页的服务器 1.2 关于environ 在WSGI协议中Web服务器和Web框架之间的通信是通过传递一个名为environ的字典实现的。这个environ字典包含了关于HTTP请求的各种元数据以及其他相关信息。 下面是一些常见的environ字典的键值对 REQUEST_METHOD: HTTP请求方法如GET、POST等。SCRIPT_NAME: 应用程序根路径的脚本名称。PATH_INFO: 一个字符串表示请求的路径。QUERY_STRING: URL中的查询字符串部分。CONTENT_TYPE: 请求的内容类型。CONTENT_LENGTH: 请求的内容长度。SERVER_NAME: Web服务器的主机名或IP地址。SERVER_PORT: Web服务器的端口号。REMOTE_ADDR: 客户端的IP地址。HTTP_*: 根据请求头的名称其它的HTTP请求头信息都作为HTTP_前缀的键值对存在。例如HTTP_USER_AGENT表示客户端的User-Agent信息。 二、简易的web框架实现 2.1 文件结构 ├── web_server.py ├── web │ └── my_web.py └── html└── index.html.....2.2 在web/my_web.py定义动态响应内容 import time# 这个函数会在web_server.py的main方法中调用 def application(environ, start_response):status 200 OKresponse_headers [(Content-Type, text/html)]# 设置响应的状态码和响应头start_response(status, response_headers)# 返回值就是响应体return str(environ) Hello world from a simple WSGI application!---%s\n % time.ctime()2.3 在html/index.html中定义静态页面内容 !DOCTYPE html html langen headmeta charsetUTF-8titleTitle/title /head bodyh1这是一个静态的页面/h1 /body /html2.4 在web_server.py中实现web服务器框架 import time import socket import sys import re import multiprocessingclass WSGIServer(object):定义一个WSGI服务器的类def __init__(self, port, documents_root, app):# 1. 创建套接字self.server_socket socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 2. 绑定本地信息# 允许在关闭端口后立即重用该端口 ,参数1表示启用self.server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)self.server_socket.bind((, port))# 3. 变为监听套接字# 指定等待的最大连接数为128self.server_socket.listen(128)# 设定资源文件的路径self.documents_root documents_root# 设定web框架可以调用的 函数(对象)self.app appdef run_forever(self):运行服务器# 等待对方链接while True:# 等待客户端的接入new_socket, new_addr self.server_socket.accept()# 如果在3秒内没有收到客户端的数据或完成操作将会抛出socket.timeout异常。new_socket.settimeout(3) # 3s# 创建一个新的进程来完成这个客户端的请求任务new_process multiprocessing.Process(targetself.deal_with_request, args(new_socket,))new_process.start()# 关闭主进程的new_socketnew_socket.close()def deal_with_request(self, client_socket):以长链接的方式为这个浏览器服务器while True:try:# 获取客户端的请求数据request client_socket.recv(1024).decode(utf-8)except Exception as ret:print(, ret)client_socket.close()return# 判断浏览器是否关闭if not request:client_socket.close()return# 按行进行切分得到的一个列表request_lines request.splitlines()# enumerate函数可以在迭代中同时获取元素的索引和值。for i, line in enumerate(request_lines):print(i, line)# 提取请求的文件(index.html)# GET /a/b/c/d/e/index.html HTTP/1.1ret re.match(r([^/]*)([^ ]), request_lines[0])if ret:print(正则提取数据:, ret.group(1)) # GETprint(正则提取数据:, ret.group(2)) # /a/b/c/d/e/index.htmlfile_name ret.group(2)if file_name /:file_name /index.html# 如果不是以py结尾的文件认为是普通的文件if not file_name.endswith(.py):# 读取文件数据try:f open(self.documents_root file_name, rb)except:response_body file not found, 请输入正确的urlresponse_header HTTP/1.1 404 not found\r\nresponse_header Content-Type: text/html; charsetutf-8\r\nresponse_header Content-Length: %d\r\n % (len(response_body.encode(utf-8)))response_header \r\nresponse response_header response_body# 将header返回给浏览器client_socket.send(response.encode(utf-8))else:content f.read()f.close()response_body contentresponse_header HTTP/1.1 200 OK\r\nresponse_header Content-Length: %d\r\n % (len(response_body.encode(utf-8)))response_header \r\n# 将header返回给浏览器client_socket.send(response_header.encode(utf-8) response_body)# 以.py结尾的文件就认为是浏览需要动态的页面else:# 准备一个字典里面存放需要传递给web框架的数据env {测试数据: 来自动态请求}# 调用my_web.py中的application函数对象,传入env字典,和set_response_headers函数对象, 存储web返回的数据response_body self.app(env, self.set_response_headers)# 合并header和bodyresponse_header HTTP/1.1 {status}\r\n.format(statusself.headers[0])response_header Content-Type: text/html; charsetutf-8\r\nresponse_header Content-Length: %d\r\n % len(response_body.encode(utf-8))for temp_head in self.headers[1]:# 遍历headers列表中的元组,并将其解包添加到响应头中response_header {0}:{1}\r\n.format(*temp_head)# 拼接响应体的内容response response_header \r\nresponse response_bodyclient_socket.send(response.encode(utf-8))这个方法最终会被my_web.py中的application函数内调用def set_response_headers(self, status, headers):这个方法会在 web框架中被默认调用response_header_default [(Data, time.ctime()),(Server, Lizhi-python mini web server)]# 将状态码/相应头信息存储起来# [字符串, [xxxxx, xxx2]]self.headers [status, response_header_default headers]# 设置静态资源访问的路径 g_static_document_root ./html # 设置动态资源访问的路径 g_dynamic_document_root ./webdef main():控制web服务器整体# 例如: python3 web_server.py 7890 my_web:application中 sys.argv[0] web_server.py, 以此类推if len(sys.argv) 3:# 获取web服务器的portport sys.argv[1]if port.isdigit(): # 判断是否端口只包含了数字字符port int(port)# 获取web服务器需要动态资源时访问的web框架名字web_frame_module_app_name sys.argv[2]else:print(运行方式如: python3 xxx.py 7890 my_web_frame_name:application)returnprint(http服务器使用的port:%s % port)# 将动态路径即存放py文件的路径添加到path中这样python就能够找到这个路径了# sys.path 是一个 Python 模块搜索路径的列表它包含了用于导入模块的搜索路径。# 当你导入一个模块时Python 解释器会按照 sys.path 列表中的顺序去搜索相应的模块。sys.path.append(g_dynamic_document_root)ret re.match(r([^:]*):(.*), web_frame_module_app_name)if ret:# 获取模块名, 例如 my_web:application 中的 my_webweb_frame_module_name ret.group(1)# 获取可以调用web框架的应用名称, my_web:application 中的 applicationapp_name ret.group(2)# 动态导入web框架的主模块, 即my_webweb_frame_module __import__(web_frame_module_name)# 获取那个可以直接调用的函数(对象) ,即在my_web.py中定义的application函数# getattr() 可用于动态地获取给定对象的属性或方法app getattr(web_frame_module, app_name)# print(app) # for test# 启动http服务器, 并将端口号,静态资源名字和my_web.py中的application函数对象(app)传入WSGIServerhttp_server WSGIServer(port, g_static_document_root, app)# 运行http服务器http_server.run_forever()if __name__ __main__:main()2.5 测试 打开终端 ,输入python3 web_server.py 7890 my_web:application打开浏览器, 输入http://localhost:7890/index.html ,访问的将是静态资源 在浏览器, 输入http://localhost:7890/web.py访问的将是动态资源 三、让简易的web框架动态请求支持多页面 还记得WSGI接口的environ这个字典吗, 它是Web服务器和Web框架之间的通信桥梁, 因此要实现动态请求支持多页面,可以利用PATH_INFO字段。 3.1 修改web_server.py 在deal_with_request方法中的if not file_name.endswith(“.py”)的else分支中添加如下代码: # 准备一个字典里面存放需要传递给web框架的数据 env dict() env[PATH_INFO] file_name # 调用my_web.py中的application函数对象,传入env字典,和set_response_headers函数对象, 存储web返回的数据 response_body self.app(env, self.set_response_headers)3.2 修改web/my_web.py import time# 存放各种页面的根路径 template_root ./templatesdef index(file_name):返回index.py需要的页面内容try:file_name file_name.replace(.py, .html)f open(template_root file_name)except Exception as ret:return %s % retelse:content f.read()f.close()return contentdef center(file_name):返回center.py需要的页面内容try:file_name file_name.replace(.py, .html)f open(template_root file_name)except Exception as ret:return %s % retelse:content f.read()f.close()return content# 这个函数会在web_server.py的main方法中调用 def application(environ, start_response):status 200 OKresponse_headers [(Content-Type, text/html)]# 设置响应的状态码和响应头start_response(status, response_headers)# 返回值就是响应体, 这里根据environ[PATH_INFO]获取要访问的页面名字file_name environ[PATH_INFO]if file_name /index.py:return index(file_name)elif file_name /center.py:return center(file_name)else:return str(environ) Hello world from a simple WSGI application!---%s\n % time.ctime()3.3 在根路径下添加页面 在项目根路径下创建templates文件夹, 然后新建index.html和center.index !-- index.html -- !DOCTYPE html html langen headmeta charsetUTF-8title首页/title /head body h1这是一个首页/h1 /body /html!-- center.html -- !DOCTYPE html html langen headmeta charsetUTF-8title居中页面/title /head body h1这是居中页/h1 /body /html3.4 测试 在浏览器, 输入http://localhost:7890/index.py访问的将是index.html的内容 输入http://localhost:7890/center.py访问的将是center.html的内容 四、让简易的web框架支持路由功能 路由功能的实现是基于装饰器来实现的, 因此主要修改的文件是web/my_web.py文件 template_root ./templates# 定义存储url-处理函数的字典(路由表) g_url_route dict()# 定义装饰器 def route(url):def decorator(func):# 存储url和func的关系g_url_route[url] func# 定义函数的参数处理函数def inner_func(file_name):return func(file_name)return inner_funcreturn decoratorroute(/index.py) def index(file_name):返回index.py需要的页面内容try:file_name file_name.replace(.py, .html)f open(template_root file_name)except Exception as ret:return %s % retelse:content f.read()f.close()return contentroute(/center.py) def center(file_name):返回center.py需要的页面内容try:file_name file_name.replace(.py, .html)f open(template_root file_name)except Exception as ret:return %s % retelse:content f.read()f.close()return content# 这个函数会在web_server.py的main方法中调用 def application(environ, start_response):status 200 OKresponse_headers [(Content-Type, text/html)]# 设置响应的状态码和响应头start_response(status, response_headers)# 返回值就是响应体file_name environ[PATH_INFO]# if file_name /index.py:# return index(file_name)# elif file_name /center.py:# return center(file_name)# else:# return str(environ) Hello world from a simple WSGI application!---%s\n % time.ctime()try:# 直接从路由表中查询对应的函数去处理return g_url_route[file_name](file_name)except Exception as ret:return f404 Error page not found {ret}访问方式不变, 正常访问是: http://localhost:7890/index.py http://localhost:7890/center.py 如果访问其他页面就会返回错误 五、静态、伪静态和动态页面的区别 目前开发的网站其实真正意义上都是动态网站只是URL上有些区别一般URL分为静态URL、动态URL、伪静态URL他们的区别是什么? 5.1 静态URL 静态URL类似 域名/news/2023-5-18/110.html 我们一般称为真静态URL每个网页有真实的物理路径也就是真实存在服务器里的。 优点是 网站打开速度快因为它不用进行运算另外网址结构比较友好利于记忆。缺点是 最大的缺点是如果是中大型网站则产生的页面特别多不好管理。至于有的开发者说占用硬盘空间大我觉得这个可有忽略不计占用不了多少空间的况且目前硬盘空间都比较大。还有的开发者说会伤硬盘这点也可以忽略不计。一句话总结: 静态网站对SEO的影响静态URL对SEO肯定有加分的影响因为打开速度快这个是本质。 5.2 动态URL 动态URL类似 域名/NewsMore.asp?id5 或者 域名/DaiKuan.php?id17带有号的URL我们一般称为动态网址每个URL只是一个逻辑地址并不是真实物理存在服务器硬盘里的。 优点是 适合中大型网站修改页面很方便因为是逻辑地址所以占用硬盘空间要比纯静态网站小。缺点是 因为要进行运算所以打开速度稍慢不过这个可有忽略不计目前有服务器缓存技术可以解决速度问题。最大的缺点是URL结构稍稍复杂不利于记忆。一句话总结: 动态URL对SEO的影响目前百度SE已经能够很好的理解动态URL所以对SEO没有什么减分的影响特别复杂的URL结构除外。所以你无论选择动态还是静态其实都无所谓看你选择的程序和需求了。 5.3 伪静态URL 伪静态URL类似 域名/course/74.html 这个URL和真静态URL类似。他是通过伪静态规则把动态URL伪装成静态网址。也是逻辑地址不存在物理地址。 优点是 URL比较友好利于记忆。非常适合大中型网站是个折中方案。缺点是 设置麻烦服务器要支持重写规则小企业网站或者玩不好的就不要折腾了。另外进行了伪静态网站访问速度并没有变快因为实质上它会额外的进行运算解释反正增加了服务器负担速度反而变慢不过现在的服务器都很强大这种影响也可以忽略不计。还有可能会造成动态URL和静态URL都被搜索引擎收录不过可以用robots禁止掉动态地址。一句话总结: 对SEO的影响和动态URL一样对SEO没有什么减分影响。 六、完善简易的web框架 6.1 添加数据库 -- 创建数据库 CREATE DATABASE stock_db charsetutf8;-- 选择数据库 USE stock_db;-- 创建focus表 CREATE TABLE IF NOT EXISTS focus (id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,note_info VARCHAR(200) DEFAULT ,info_id INT UNSIGNED DEFAULT NULL );-- 插入数据 INSERT INTO focus VALUES (2,你确定要买这个,36), (3,利好,37), (9,,88), (10,,89), (13,,1);-- 创建info表 CREATE TABLE IF NOT EXISTS info (id int(10) unsigned NOT NULL AUTO_INCREMENT PRIMARY KEY,code varchar(6) NOT NULL COMMENT 股票代码,short varchar(10) NOT NULL COMMENT 股票简称,chg varchar(10) NOT NULL COMMENT 涨跌幅,turnover varchar(255) NOT NULL COMMENT 换手率,price decimal(10,2) NOT NULL COMMENT 最新价,highs decimal(10,2) NOT NULL COMMENT 前期高点,time date DEFAULT NULL );-- 插入数据 INSERT INTO info VALUES (1,000007,全新好,10.01%,4.40%,16.05,14.60,2017-07-18), (2,000036,华联控股,10.04%,10.80%,11.29,10.26,2017-07-20), (3,000039,中集集团,1.35%,1.78%,18.07,18.06,2017-06-28), (4,000050,深天马A,4.38%,4.65%,22.86,22.02,2017-07-19), (5,000056,皇庭国际,0.39%,0.65%,12.96,12.91,2017-07-20), (6,000059,华锦股份,3.37%,7.16%,12.26,12.24,2017-04-11), (7,000060,中金岭南,1.34%,3.39%,12.08,11.92,2017-07-20), (8,000426,兴业矿业,0.41%,2.17%,9.71,9.67,2017-07-20), (9,000488,晨鸣纸业,6.30%,5.50%,16.37,15.59,2017-07-10), (10,000528,柳工,1.84%,3.03%,9.42,9.33,2017-07-19), (11,000540,中天金融,0.37%,5.46%,8.11,8.08,2017-07-20), (12,000581,威孚高科,3.49%,3.72%,27.00,26.86,2017-06-26), (13,000627,天茂集团,5.81%,12.51%,10.93,10.33,2017-07-20), (14,000683,远兴能源,6.42%,21.27%,3.48,3.29,2017-07-19), (15,000703,恒逸石化,0.24%,1.65%,16.92,16.88,2017-07-20), (16,000822,山东海化,6.60%,8.54%,9.05,8.75,2017-07-06), (17,000830,鲁西化工,1.38%,4.80%,7.36,7.26,2017-07-20), (18,000878,云南铜业,1.26%,3.23%,14.50,14.47,2017-07-19), (19,000905,厦门港务,5.44%,10.85%,15.90,15.60,2017-04-20), (20,000990,诚志股份,0.53%,1.00%,16.99,16.90,2017-07-20), (21,002019,亿帆医药,1.19%,2.81%,17.05,16.85,2017-07-20), (22,002078,太阳纸业,2.05%,1.90%,8.45,8.29,2017-07-19), (23,002092,中泰化学,7.25%,6.20%,15.53,14.48,2017-07-20), (24,002145,中核钛白,2.43%,7.68%,6.75,6.61,2017-07-19), (25,002285,世联行,8.59%,5.66%,9.23,8.50,2017-07-20), (26,002311,海大集团,1.13%,0.24%,18.81,18.63,2017-07-19), (27,002460,赣锋锂业,9.41%,9.00%,63.70,58.22,2017-07-20), (28,002466,天齐锂业,3.62%,3.66%,68.44,66.05,2017-07-20), (29,002470,金正大,2.30%,0.99%,8.00,7.82,2017-07-20), (30,002496,辉丰股份,3.15%,4.29%,5.24,5.08,2017-04-10), (31,002497,雅化集团,0.38%,12.36%,13.10,13.05,2017-07-20), (32,002500,山西证券,0.44%,3.70%,11.49,11.44,2017-07-20), (33,002636,金安国纪,2.70%,11.59%,19.80,19.42,2017-07-19), (34,300032,金龙机电,0.66%,0.72%,15.28,15.18,2017-07-20), (35,300115,长盈精密,0.60%,0.59%,33.50,33.41,2017-07-19), (36,300268,万福生科,-10.00%,0.27%,31.77,13.57,2017-04-10), (37,300280,南通锻压,3.31%,0.66%,32.20,32.00,2017-04-11), (38,300320,海达股份,0.28%,0.82%,18.26,18.21,2017-07-20), (39,300408,三环集团,1.69%,0.81%,23.42,23.17,2017-07-19), (40,300477,合纵科技,2.84%,5.12%,22.10,22.00,2017-07-12), (41,600020,中原高速,5.46%,4.48%,5.60,5.31,2017-07-20), (42,600033,福建高速,1.01%,1.77%,4.00,3.99,2017-06-26), (43,600066,宇通客车,4.15%,1.49%,23.08,23.05,2017-06-13), (44,600067,冠城大通,0.40%,2.97%,7.56,7.53,2017-07-20), (45,600110,诺德股份,2.08%,4.26%,16.16,15.83,2017-07-20), (46,600133,东湖高新,9.65%,21.74%,13.64,12.44,2017-07-20), (47,600153,建发股份,3.65%,2.03%,13.35,13.21,2017-07-10), (48,600180,瑞茂通,2.20%,1.07%,14.86,14.54,2017-07-20), (49,600183,生益科技,6.94%,4.06%,14.94,14.12,2017-07-19), (50,600188,兖州煤业,1.53%,0.99%,14.56,14.43,2017-07-19);6.2 让响应改成伪静态响应 修改web_server.py的WSGIServer的deal_with_request方法,让它支持html后缀的页面请求修改web_server.py的WSGIServer的__init__支持静态路径的设置添加web_server.conf配置文件,用于指定静态资源和动态资源的根路径 import socket import sys import re import multiprocessingclass WSGIServer(object):定义一个WSGI服务器的类def __init__(self, port, app, static_path):# 创建套接字self.server_socket socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 绑定本地信息# 允许在关闭端口后立即重用该端口 ,参数1表示启用self.server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)self.server_socket.bind((, port))# 变为监听套接字# 指定等待的最大连接数为128self.server_socket.listen(128)# 设定资源文件的路径self.static_path static_path# 设定web框架可以调用的 函数(对象)self.app appdef run_forever(self):运行服务器# 等待对方链接while True:# 等待客户端的接入new_socket, new_addr self.server_socket.accept()# 如果在3秒内没有收到客户端的数据或完成操作将会抛出socket.timeout异常。new_socket.settimeout(3) # 3s# 创建一个新的进程来完成这个客户端的请求任务new_process multiprocessing.Process(targetself.deal_with_request, args(new_socket,))new_process.start()# 关闭主进程的new_socketnew_socket.close()def deal_with_request(self, client_socket):# 获取客户端的请求数据request client_socket.recv(10 * 1024).decode(utf-8)# 按行进行切分得到的一个列表request_lines request.splitlines()# 提取请求的文件(index.html)# GET /a/b/c/d/e/index.html HTTP/1.1ret re.match(r([^/]*)([^ ]), request_lines[0])file_name /if ret:print(请求方式:, ret.group(1)) # GETprint(请求路径:, ret.group(2)) # /a/b/c/d/e/index.htmlfile_name ret.group(2)if file_name /:file_name /index.html# 返回http格式的数据给浏览器# 如果请求的资源不是以.html结尾那么就认为是静态资源css/js/pngjpg等if not file_name.endswith(.html):try:f open(self.static_path file_name, rb)except:response HTTP/1.1 404 NOT FOUND\r\nresponse \r\nresponse ------file not found-----client_socket.send(response.encode(utf-8))else:response_header HTTP/1.1 200 OK\r\nresponse_header \r\n# 将response_header发送给浏览器client_socket.send(response_header.encode(utf-8))# 将内容发送给浏览器chunk_size 1024 # Adjust this value as neededwhile True:html_content f.read(chunk_size)if not html_content:break # End of fileclient_socket.send(html_content)f.close()else:# 如果是以.html结尾那么就认为是动态资源的请求env dict() # 这个字典中存放的是web服务器要传递给 web框架的数据信息env[PATH_INFO] file_name# 执行web框架的application方法body self.app(env, self.set_response_header)# 拼接响应头response_header HTTP/1.1 %s\r\n % self.statusfor temp in self.headers:response_header %s:%s\r\n % (temp[0], temp[1])response_header \r\nresponse response_header body# 发送response给浏览器client_socket.send(response.encode(utf-8))# 关闭套接client_socket.close()这个方法最终会被my_web.py中的application函数内调用def set_response_header(self, status, headers):self.status statusself.headers [(server, mini_web v8.8)]self.headers headersdef main():控制web服务器整体# 例如: python3 web_server.py 7890 my_web:application中 sys.argv[0] web_server.py, 以此类推if len(sys.argv) 3:# 获取web服务器的portport sys.argv[1]if port.isdigit(): # 判断是否端口只包含了数字字符port int(port)# 获取web服务器需要动态资源时访问的web框架名字web_frame_module_app_name sys.argv[2]else:print(运行方式如: python3 xxx.py 7890 my_web_frame_name:application)returnprint(http服务器使用的port:%s % port)# 读取服务器路径的配置文件with open(./web_server.conf) as f:conf_info eval(f.read())# 此时 conf_info是一个字典里面的数据为# {# static_path:./html,# dynamic_path:./web# }# 将动态路径即存放py文件的路径添加到path中这样python就能够找到这个路径了# sys.path 是一个 Python 模块搜索路径的列表它包含了用于导入模块的搜索路径。# 当你导入一个模块时Python 解释器会按照 sys.path 列表中的顺序去搜索相应的模块。sys.path.append(conf_info[dynamic_path])ret re.match(r([^:]*):(.*), web_frame_module_app_name)if ret:# 获取模块名, 例如 my_web:application 中的 my_webweb_frame_module_name ret.group(1)# 获取可以调用web框架的应用名称, my_web:application 中的 applicationapp_name ret.group(2)# 动态导入web框架的主模块, 即my_webweb_frame_module __import__(web_frame_module_name)# 获取那个可以直接调用的函数(对象) ,即在my_web.py中定义的application函数# getattr() 可用于动态地获取给定对象的属性或方法app getattr(web_frame_module, app_name)# 启动http服务器, 并将端口号,静态资源名字和my_web.py中的application函数对象(app)传入WSGIServerhttp_server WSGIServer(port, app, conf_info[static_path])# 运行http服务器http_server.run_forever()if __name__ __main__:main()在项目根路径添加web_server.conf配置文件 {static_path:./html,dynamic_path:./web }修改web/my_web.py的路由参数 route(/index.html) def index(file_name):省略...route(/center.html) def center(file_name):省略... 6.3 让响应查询数据库 修改web/my_web.py文件, 让index和center页面支持数据库访问数据 import reimport pymysqltemplate_root ./templates# 定义存储url-处理函数的字典(路由表) g_url_route dict()# 定义装饰器 def route(url):def decorator(func):# 存储url和func的关系g_url_route[url] func# 定义函数的参数处理函数def inner_func(file_name):return func(file_name)return inner_funcreturn decoratorroute(/index.html) def index(file_name):try:f open(template_root file_name)except Exception as ret:return %s % retelse:# 读取index.html中的内容content f.read()f.close()# 查询info表db pymysql.connect(hostlocalhost, port3306, userroot, password00000000, databasestock_db,charsetutf8)cursor db.cursor()sql select * from info;cursor.execute(sql)data_from_mysql cursor.fetchall()cursor.close()db.close()# 定义要返回的html模板html_template trtd%d/tdtd%s/tdtd%s/tdtd%s/tdtd%s/tdtd%s/tdtd%s/tdtd%s/tdtdinput typebutton value添加 idtoAdd nametoAdd systemidvaule%s/td/tr# 拼接查询到的结果html for info in data_from_mysql:# info是一个元组类型,例如(1, 000007, 全新好, 10.01%, 4.40%, Decimal(16.05), 通过[]可以取出里面的值html html_template % (info[0], info[1], info[2], info[3], info[4], info[5], info[6], info[7], info[1])# 通过html字符串替换index.html中的{%content%}字符串content re.sub(r\{%content%\}, html, content)return contentroute(/center.html) def center(file_name):返回center.html需要的页面内容try:f open(template_root file_name)except Exception as ret:return %s % retelse:content f.read()f.close()db pymysql.connect(hostlocalhost, port3306, userroot, password00000000, databasestock_db,charsetutf8)cursor db.cursor()sql select i.code,i.short,i.chg,i.turnover,i.price,i.highs,j.note_info from info as i inner join focus as j on i.idj.info_id;cursor.execute(sql)data_from_mysql cursor.fetchall()cursor.close()db.close()# 定义要返回的html模板html_template trtd%s/tdtd%s/tdtd%s/tdtd%s/tdtd%s/tdtd%s/tdtd%s/tdtda typebutton href/update/%s.html 修改 /a/tdtdinput typebutton value删除 idtoDel nametoDel systemidvaule%s/td/tr# 拼接查询到的结果html for info in data_from_mysql:html html_template % (info[0], info[1], info[2], info[3], info[4], info[5], info[6], info[0], info[0])content re.sub(r\{%content%\}, html, content)return content# 这个函数会在web_server.py的main方法中调用 def application(environ, start_response):status 200 OKresponse_headers [(Content-Type, text/html)]# 设置响应的状态码和响应头start_response(status, response_headers)# 返回值就是响应体file_name environ[PATH_INFO]try:# 直接从路由表中查询对应的函数去处理return g_url_route[file_name](file_name)except Exception as ret:return f404 Error page not found {ret}6.3 修改index.html和center.html页面 (1) index.html !DOCTYPE html html langen headmeta charsetUTF-8title首页/title /head body divtabletrth序号/thth股票代码/thth股票简称/thth涨跌幅/thth换手率/thth最新价(元)/thth前期高点/thth前期高点日期/thth添加自选/th/tr{%content%}/table /div /body /html(2) 修改center.html页面 !DOCTYPE html html langen head!-- --meta charsetUTF-8title居中页面/title /head body divtabletrth股票代码/thth股票简称/thth涨跌幅/thth换手率/thth最新价(元)/thth前期高点/thth stylecolor:red备注信息/thth修改备注/ththdel/th/tr{%content%}/table /div /body /html此时, 在浏览器中输入http://localhost:7890/index.html 看到的内容如下: 输入http://localhost:7890/center.html看到的内容如下: 6.4 让路由支持正则 继续修改web/my_web.py文件, 修改route的参数和application方法匹配正则 import reimport pymysql# 定义存储url-处理函数的字典(路由表) g_url_route dict()# 定义装饰器 def route(url):def decorator(func):# 存储url和func的关系g_url_route[url] func# 定义函数的参数处理函数def inner_func(*args, **kwargs):return func(*args, **kwargs)return inner_funcreturn decoratorroute(r/index.html) def index(ret):with open(./templates/index.html) as f:# 读取index.html中的内容content f.read()# 查询info表db pymysql.connect(hostlocalhost, port3306, userroot, password00000000, databasestock_db,charsetutf8)cursor db.cursor()sql select * from info;cursor.execute(sql)data_from_mysql cursor.fetchall()cursor.close()db.close()# 定义要返回的html模板html_template trtd%d/tdtd%s/tdtd%s/tdtd%s/tdtd%s/tdtd%s/tdtd%s/tdtd%s/tdtdinput typebutton value添加 idtoAdd nametoAdd systemidvaule%s/td/tr# 拼接查询到的结果html for info in data_from_mysql:# info是一个元组类型,例如(1, 000007, 全新好, 10.01%, 4.40%, Decimal(16.05), 通过[]可以取出里面的值html html_template % (info[0], info[1], info[2], info[3], info[4], info[5], info[6], info[7], info[1])# 通过html字符串替换index.html中的{%content%}字符串content re.sub(r\{%content%\}, html, content)return contentroute(r/center.html) def center(ret):返回center.html需要的页面内容with open(./templates/center.html) as f:# 读取index.html中的内容content f.read()db pymysql.connect(hostlocalhost, port3306, userroot, password00000000, databasestock_db,charsetutf8)cursor db.cursor()sql select i.code,i.short,i.chg,i.turnover,i.price,i.highs,j.note_info from info as i inner join focus as j on i.idj.info_id;cursor.execute(sql)data_from_mysql cursor.fetchall()cursor.close()db.close()# 定义要返回的html模板html_template trtd%s/tdtd%s/tdtd%s/tdtd%s/tdtd%s/tdtd%s/tdtd%s/tdtda typebutton href/update/%s.html 修改 /a/tdtdinput typebutton value删除 idtoDel nametoDel systemidvaule%s/td/tr# 拼接查询到的结果html for info in data_from_mysql:html html_template % (info[0], info[1], info[2], info[3], info[4], info[5], info[6], info[0], info[0])content re.sub(r\{%content%\}, html, content)return content# 这个函数会在web_server.py的main方法中调用 def application(environ, start_response):# 设置响应的状态码和响应头start_response(200 OK, [(Content-Type, text/html)])# 返回值就是响应体file_name environ[PATH_INFO]try:# 从路由表中获取key和value# {# r/index.html:index,# r/center.html:center,# }for url, call_func in g_url_route.items():# 获取的url就是route注解的参数ret re.match(url, file_name)if ret:return call_func(ret)else:return 请求的url(%s)没有对应的函数.... % file_nameexcept Exception as ret:return 产生了异常%s % str(ret)6.5 新增添加关注操作 (1) 修改web/my_web.py文件,增加添加关注的路由处理 route(r/add/(\d)\.html) def add_focus(ret):# 1. 获取股票代码stock_code ret.group(1)# 2. 判断试下是否有这个股票代码conn pymysql.connect(hostlocalhost, port3306, userroot, password00000000, databasestock_db,charsetutf8)cs conn.cursor()sql select * from info where code%s;cs.execute(sql, (stock_code,))# 如果要是没有这个股票代码那么就认为是非法的请求if not cs.fetchone():cs.close()conn.close()return 没有这支股票大哥 我们是创业公司请手下留情...# 3. 判断以下是否已经关注过sql select * from info as i inner join focus as f on i.idf.info_id where i.code%s;cs.execute(sql, (stock_code,))# 如果查出来了那么表示已经关注过if cs.fetchone():cs.close()conn.close()return 已经关注过了请勿重复关注...# 4. 添加关注sql insert into focus (info_id) select id from info where code%s;cs.execute(sql, (stock_code,))conn.commit()cs.close()conn.close()return 关注成功....(2) 修改index.html文件,添加js代码处理添加按钮的点击事件 headmeta charsetUTF-8title首页/titlescript src/js/jquery-1.12.4.min.js/scriptscript$(document).ready(function(){$(input[nametoAdd]).each(function(){var currentAdd $(this);currentAdd.click(function(){code $(this).attr(systemIdVaule);// 发起get请求,请求路径是 /add/xx.html$.get(/add/ code .html, function(data, status){alert(数据: data \n状态: status);});});});});/script /head当访问index.html后, 点击一个已关注的股票, 提示如下: 如果未关注过的,提示如下: 此时访问center.html页面可以看到刚刚添加关注的股票 6.6 添加删除关注操作 (1) 修改web/my_web.py文件,增加删除关注的路由处理 route(r/del/(\d)\.html) def del_focus(ret):# 1. 获取股票代码stock_code ret.group(1)# 2. 判断试下是否有这个股票代码conn pymysql.connect(hostlocalhost, port3306, userroot, password00000000, databasestock_db,charsetutf8)cs conn.cursor()sql select * from info where code%s;cs.execute(sql, (stock_code,))# 如果要是没有这个股票代码那么就认为是非法的请求if not cs.fetchone():cs.close()conn.close()return 没有这支股票大哥 我们是创业公司请手下留情...# 3. 判断以下是否已经关注过sql select * from info as i inner join focus as f on i.idf.info_id where i.code%s;cs.execute(sql, (stock_code,))# 如果没有关注过那么表示非法的请求if not cs.fetchone():cs.close()conn.close()return %s 之前未关注请勿取消关注... % stock_code# 4. 取消关注# sql insert into focus (info_id) select id from info where code%s;sql delete from focus where info_id (select id from info where code%s);cs.execute(sql, (stock_code,))conn.commit()cs.close()conn.close()return 取消关注成功....(2) 修改center.html文件,添加js代码处理删除按钮的点击事件 headmeta charsetUTF-8title关注页面/titlescript src/js/jquery-1.12.4.min.js/scriptscript$(document).ready(function(){$(input[nametoDel]).each(function(){var currentAdd $(this);currentAdd.click(function(){code $(this).attr(systemIdVaule);// 发起get请求,请求路径是 /del/xx.html$.get(/del/ code .html, function(data, status){alert(数据: data \n状态: status);// 重新加载页面window.location.reload()});});});});/script /head此时访问center.html, 点击删除按钮,提示如下: 6.7 添加修改关注操作 (1) 添加templates/update.html页面,用于展示修改页面 !DOCTYPE html html langen headmeta charsetUTF-8title修改备注页面/titlescript src/js/jquery-1.12.4.min.js/scriptscript$(document).ready(function(){$(#update).click(function(){// 获取note_info标签的value值,这个值是一个文本,即股票的备注信息var item $(#note_info).val();// 发起get请求,请求路径是 /update/{股票id}/{备注信息}.html$.get(/update/{%code%}/ item .html, function(data, status){alert(数据: data \n状态: status);// 修改后跳去center.html页面self.location/center.html;});});});/script /head body div classinput-groupspan正在修改/spanspan{%code%}/spaninput idnote_info typetext value{%note_info%}input idupdate typebutton value确认修改/ /div /body /html(2) 修改web/my_web.py文件,增加查看修改页面路由 route(r/update/(\d)\.html) def show_update_page(ret):显示修改的那个页面# 1. 获取股票代码stock_code ret.group(1)# 2. 打开模板with open(./templates/update.html) as f:# 读取update.html页面内容content f.read()# 3. 根据股票代码查询相关的备注信息conn pymysql.connect(hostlocalhost, port3306, userroot, password00000000, databasestock_db,charsetutf8)cs conn.cursor()sql select f.note_info from focus as f inner join info as i on i.idf.info_id where i.code%s;cs.execute(sql, (stock_code,))stock_infos cs.fetchone()# 获取这个股票对应的备注信息note_info stock_infos[0]cs.close()conn.close()# 替换update.html页面的{%note_info%}字符串content re.sub(r\{%note_info%\}, note_info, content)# 替换update.html页面的{%code%}字符串content re.sub(r\{%code%\}, stock_code, content)return content(3) 修改web/my_web.py文件,增加查看确认修改页面路由 from urllib.parse import unquoteroute(r/update/(\d)/(.*)\.html) def save_update_page(ret):保存修改的信息stock_code ret.group(1)# 这里使用unquote可以处理中文变成%的解码comment unquote(ret.group(2), encodingutf-8)conn pymysql.connect(hostlocalhost, port3306, userroot, password00000000, databasestock_db,charsetutf8)cs conn.cursor()sql update focus set note_info%s where info_id (select id from info where code%s);cs.execute(sql, (comment, stock_code))conn.commit()cs.close()conn.close()return 修改成功...此时刷新center.html页面,然后点击一条没有添加备注的股票记录旁边的修改按钮 会跳去update.html页面 在输入框中随便输入一些备注信息 点击确认修改, 出现下面弹窗 确定后,会返回center.html页面 七、日志模块 Python中有个logging模块可以完成相关信息的记录在debug时用它往往事半功倍, 设置日志级别和格式是使用Python内置的logging模块进行日志记录的一种常用方法。使用basicConfig函数设置日志级别并可指定日志的格式。 日志级别用于控制日志记录的详细程度可选的日志级别由低到高包括 DEBUG用于调试和开发过程中的详细信息。INFO提供程序的运行信息用于跟踪程序的主要流程。WARNING指示潜在的错误或异常情况。ERROR指示运行时错误但不会导致程序终止。CRITICAL指示严重错误可能导致程序中断。 日志格式定义了记录在日志中的每个日志消息的布局, 常用格式有 %(asctime)s记录的时间日期和时间。%(filename)s记录消息的文件名。%(lineno)d记录消息的行号。%(levelname)s日志记录级别。%(message)s日志消息的主体内容。 日志输出有两种方式一种输出控制台另一种是记录到文件中如日志文件。 7.1 将日志输出到控制台 import logging# 设置日志级别和格式 logging.basicConfig(levellogging.WARNING,format%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s)# 开始使用log功能 logging.info(这是 loggging info message) logging.debug(这是 loggging debug message) logging.warning(这是 loggging a warning message) logging.error(这是 an loggging error message) logging.critical(这是 loggging critical message)运行结果 2023-07-04 09:36:08,741 - main.py[line:9] - WARNING: 这是 loggging a warning message 2023-07-04 09:36:08,741 - main.py[line:10] - ERROR: 这是 an loggging error message 2023-07-04 09:36:08,741 - main.py[line:11] - CRITICAL: 这是 loggging critical message由此可见,上面代码设置日志的输出等级是WARNING级别那就只有WARNING级别以上的日志才会输出。 7.2 将日志输出到文件 只需要在logging.basicConfig函数中设置好输出文件的文件名和写文件的模式。例如: import logginglogging.basicConfig(levellogging.WARNING,filename./log.txt,filemodew,format%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s) # use logging logging.info(这是 loggging info message) logging.debug(这是 loggging debug message) logging.warning(这是 loggging a warning message) logging.error(这是 an loggging error message) logging.critical(这是 loggging critical message)运行后, 会在当前代码根目录下生成一个log.txt文件, 内容如下: 7.3 将日子输出到控制台和文件 这就需要一个叫作Logger 的对象来帮忙,logging.Logger是Python中日志记录的核心类之一它提供了记录日志消息的方法和属性。可以通过实例化logging.Logger类来创建一个日志记录器对象。通过logging.FileHandler类可以创建文件记录器, 通过logging.StreamHandler可以创建控制台记录器。 import logging# 创建日志记录器对象 logfile ./log.txt logger logging.getLogger(my_logger)# 设置日志级别和格式 logger.setLevel(logging.WARNING) formatter logging.Formatter(%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s)# 创建文件处理器并设置日志级别和格式,默认的文件写入模式是a(可以追加) file_handler logging.FileHandler(logfile, modea) file_handler.setLevel(logging.WARNING) file_handler.setFormatter(formatter)# 将文件处理器添加到日志记录器 logger.addHandler(file_handler)# 创建控制台log处理器 control_handler logging.StreamHandler() control_handler.setLevel(logging.WARNING) control_handler.setFormatter(formatter)# 将控制台log处理器添加到日志记录器 logger.addHandler(control_handler)# 记录日志消息 logger.debug(这是 logger debug message) logger.info(这是 logger info message) logger.warning(这是 logger warning message) logger.error(这是 logger error message) logger.critical(这是 logger critical message)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

可以充值的网站怎么建设微信如何开发自己的小程序

阿里云2核4G服务器多少钱一年?2核4G服务器1个月费用多少?2核4G服务器30元3个月、85元一年,轻量应用服务器2核4G4M带宽165元一年,企业用户2核4G5M带宽199元一年。本文阿里云服务器网整理的2核4G参加活动的主机是ECS经济型e实例和u1…

如何用h5做网站企业app开发制作

背景 拍摄APP项目上线有一阵了,每天的拍摄数据呈现波动上升状态、业务方需要对数据进行加工,如果能有对未来的数据量的预测就好了 。 目标 在端侧展示拍摄数据可视化趋势图等、并能推断数据(选择预测日期) 简单实现个demo gif背…

小说网站开发背景中铁建设集团招聘700人

从 Java Agent 报错开始,到 JVM 原理,到 glibc 线程安全,再到 pthread tls,逐步探究 Java Agent 诡异报错。 背景 由于阿里云多个产品都提供了 Java Agent 给用户使用,在多个 Java Agent 一起使用的场景下&#xff0…

网站建设linuxwordpress免费插件分享

一、概述 SortedList 类代表了一系列按照键来排序的键/值对,这些键值对可以通过键和索引来访问。排序列表是数组和哈希表的组合。它包含一个可使用键或索引访问各项的列表。 如果您使用索引访问各项,则它是一个动态数组(ArrayList&#xff0…

深圳东莞网站建设wordpress外网跳转

在网页抓取方面,可以使用 Python、Java 等编程语言编写程序,通过模拟 HTTP 请求,获取淘宝多网站上的商品页面。在数据提取方面,可以使用正则表达式、XPath 等方式从 HTML 代码中提取出有用的信息。值得注意的是,淘宝网…

php网站模板制作软件河北建设厅安监站官方网站

一、条件语句 条件语句基于不同的条件来执行不同的动作 1.if语句:只有当指定条件为true时,使用该语句来执行代码 2.if...else语句:当条件为true时执行代码,当条件为else时执行其他代码 3.if...else if...else语句:…

网站公司做文员网站建设需要学的

4种kill某个用户所有进程的方法 在linux系统管理中,我们有时候需要kill掉某个用户的所有进程,初学者一般先查询出用户的所有pid,然后一条条kill掉,或者写好一个脚本,实际上方法都有现成的,这边有4种方法&am…

新网站多久收录网站有些什么内容

文章目录 仲裁队列1、创建交换机2、创建仲裁队列3、验证主节点宕机不影响消息发送和接收 流式队列(不推荐,Kafka主场)概念 异地容灾一、Federation插件概述 二、Federation交换机1、总体说明2、准备工作3、启用联邦插件4、添加上游连接端点5、…

爱站网使用体验wordpress页脚二维码

💢欢迎来到张胤尘的开源技术站 💥开源如江河,汇聚众志成。代码似星辰,照亮行征程。开源精神长,传承永不忘。携手共前行,未来更辉煌💥 文章目录 通道通道声明初始化缓冲机制无缓冲通道代码示例 带…

做个网站app吗南昌网站建设基本流程

2020/11/3操作记录搭建好Python的数据环境之后,接下来就是在Python代码中访问数据库我先在Navicat图形化界面创建一个数据库命名为pythontest,再在数据库中创建了一个表studentinfo有nid,nname,ngrade,nage四个字段,nid为主键递增。通过查询编…

wordpress国外主题网站wordpress的数据库名

作者主页:源码空间codegym 简介:Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 管理员:首页、个人中心、公告信息管理、班级管理、学生管理、教师管理、课程类型管理、课程信息管理、学生选课管理、作业布置管理…

合肥网站关键词张槎手机网站建设

今天天气很好,早上看了肺炎的病情如下图这个是丁香医生的统计数据,腾讯也出了一份统计数据,截止到写这篇文章的时候,已经确诊人数为 7766 人,但是我觉得丁香医生里面的截图内容比较多,也没有一些诱导二维码…

集团门户网站建设公司无锡seo关键词排名

文章目录 前言1.安装erlang 语言2.安装rabbitMQ3. 内网穿透3.1 安装cpolar内网穿透(支持一键自动安装脚本)3.2 创建HTTP隧道 4. 公网远程连接5.固定公网TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网TCP端口地址 前言 RabbitMQ是一个在 AMQP(高级消息队列协议)基…

网站备案现场浏览器官网入口

目录 一、前言:误差与拟合 (一)经验误差 (二)过拟合、欠拟合 二、评估方法 (一)评估总体的思路 (二)如何划分训练集和测试集 1.留出法 2.k折交叉验证 3.自助法 …

个人网站变现如何查网站是哪家公司做的

任务:将asterisk1.8.24.0移植到rt5350上面 交叉工具链:mipsel-linux(3.4.2) 1. 配置asterisk,执行./configure --hostmipsel-linux 找不到termcap和libxml2,分别对他们交叉编译,然后将生成的库拷贝到交叉工具链的lib…

成都 网站建设 公司汉中做网站

开源项目推荐 Reloader Reloader 是一个 Kubernetes 控制器,用于监控 ConfigMap 和 Secrets 中的变化,并对 Pod 及其相关部署、StatefulSet、DaemonSet 和 DeploymentConfig 进行滚动升级! Spegel Spegel 在瑞典语中意为镜像,…

Unity渲染时的排序规则

按照我们的常规理解,渲染顺序应该是: 1.不透明物体按照相机空间进行Z轴排序,从前往后排,先渲染前面再渲染后面,避免造成过多的OverDraw 2.绘制天空盒,天空盒在要不透明物体之后渲染,避免造成OverDraw 3.绘制透明…

商业网站开发的实训小结怎么写策划公司属于什么行业

微信搜一搜舒适11今天这篇文章,小壹就向大家科普一下空调和新风系统,告诉大家为什么装了空调还要装新风机。1、空调是什么? 对此大家都能够脱口而出:空调就是用来制冷或制热的机器,能够改变室内温度,让我们…

单位门户网站wordpress本地utc

官方文档地址:Index lifecycle actions | Elasticsearch Guide [7.12] | Elastic 索引生命周期操作(index lifecycle actions) Allocate 将分片移动到具有不同性能特征的节点并减少副本数量 Delete 永久删除索引。 Force merge 减少索…

建平县网站建设wordpress访问量统计

Python优化算法篇 scipy.optimize Scipy是一个用于数学、科学和工程的开源库,它建立在NumPy的基础上,提供了一系列强大的科学计算工具。在Scipy中,优化模块(scipy.optimize)提供了多种优化算法,用于求解最小…