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

沈阳网站建设21anshan下载共富工程app软件安装包

沈阳网站建设21anshan,下载共富工程app软件安装包,如何在行业门户网站上做推广,wordpress获取分类id文章目录 正则表达式re模块最基础操作#xff08;匹配开头#xff09;匹配单个字符匹配多个字符匹配开头结尾匹配分组对于group的理解r的作用re 模块高级用法compilesearchfindall易错点 sub直接替换函数替换 split 根据匹配进行切割字符串#xff0c;并返回一个列表 python… 文章目录 正则表达式re模块最基础操作匹配开头匹配单个字符匹配多个字符匹配开头结尾匹配分组对于group的理解r的作用re 模块高级用法compilesearchfindall易错点 sub直接替换函数替换 split 根据匹配进行切割字符串并返回一个列表 python 贪婪和非贪婪 HTTP 协议对于F12的一些组件介绍浏览器解析过程http 协议的结束符B/S模式下的Web静态服务器Web 静态服务器-1-显示固定的页面Web 静态服务器-2-显示需要的页面Web 静态服务器-3-多进程Web 静态服务器-4-多线程Web 静态服务器-5-非堵塞模式Web 静态服务器-6-epollWeb 静态服务器-7-gevent 版 正则表达式 在 Python 中需要通过正则表达式对字符串进行匹配的时候可以使用一个模块名字为 re。 re模块最基础操作匹配开头 # 导入 re 模块 import re # 使用 match 方法进行匹配操作 result re.match(正则表达式,要匹配的字符串) # 如果上一步匹配到数据的话可以使用 group 方法来提取数据 result.group()示例 import reresult re.match(helloworld,helloworld.cn)print(result.group())输出的结果 helloworld说明re.match() 能够匹配出以 xxx 开头的字符串 匹配单个字符 字符功能.匹配任意 1 个字符除了\n[ ]匹配[ ]中列举的字符\d匹配数字即 0-9 dicimal\D匹配非数字即不是数字\s匹配空白即 空格tab 键 space\S匹配非空白\w匹配单词字符即 a-z、A-Z、0-9、_ (汉字) word\W匹配非单词字 示例 import reret re.match(t.o,two) print(ret.group())# 大小写 h 都可以的情况 ret re.match([hH],hello Python) print(ret.group())# 匹配 0 到 9 第二种写法 ret re.match([0-9]Hello Python,7Hello Python) print(ret.group()) ret re.match([0-35-9]Hello Python,7Hello Python) print(ret.group())# 使用\d 进行匹配 ret re.match(嫦娥\d 号,嫦娥 1 号发射成功) print(ret.group())# 等等匹配多个字符 字符功能*匹配前一个字符出现 0 次或者无限次即可有可无匹配前一个字符出现 1 次或者无限次即至少有 1 次?匹配前一个字符出现 1 次或者 0 次即要么有 1 次要么没有{m}匹配前一个字符出现 m 次{m,n}匹配前一个字符出现从 m 到 n 次 示例 import re# *的功能实现 ret re.match([A-Z][a-z]*,Aabcdef) print(ret.group()) # 输出结果Aabcdef# 的功能实现 names [name1, _name, 2_name, __name__] for name in names:ret re.match([a-zA-Z_][\w]*,name) if ret:print(变量名 %s 符合要求 % ret.group()) else:print(变量名 %s 非法 % name) # 输出结果: # 变量名 name1 符合要求 # 变量名 _name 符合要求 # 变量名 2_name 非法 # 变量名 __name__ 符合要求# ?的功能实现 ret re.match([1-9]?\d,09) print(ret.group()) # 输出结果0# {m}的功能实现 ret re.match([a-zA-Z0-9_]{8,20},1ad12f23s34455ff66) print(ret.group()) # 输出结果1ad12f23s34455ff66 匹配开头结尾 字符功能^匹配字符串开头$匹配字符串结尾 示例 email_list [xiaoWang163.com,xiaoWang163.comheihei,.com.xiaowangqq.com] for email in email_list:ret re.match([\w]{4,20}163\.com$, email)if ret:print(%s 是符合规定的邮件地址,匹配后的结果是:%s %(email,ret.group()))else:print(%s 不符合要求 % email)或者说实际上我们仅需要所有情况下在最前面加上^ 最后面加上$也可以解决大多数问题。 匹配分组 字符功能|匹配左右任意一个表达式(ab)将括号中字符作为一个分组\num引用分组 num 匹配到的字符串(?Pname)分组起别名(?Pname)引用别名为 name 分组匹配到的字 [^符号]* 代表没有遇到符号就一直进行匹配一直匹配下去 例子 import re# |的使用 ret re.match([1-9]?\d$|100,100) print(ret.group()) # 输出100# 分组的使用 ret re.match(\w{4,20}(163|126|qq)\.com, test126.com) print(ret.group()) # 输出test126# ([^-]*) 代表没有遇到小横杠-就一直进行匹配一直匹配下去 ret re.match(([^-])-(\d),010-12345678) print(ret.group()) # 输出010-12345678# 使用\num需要注意的是这边需要使用元字符串即类似 r这种格式 ret re.match(r([a-zA-Z]*)\w*/\1, htmlhh/html) print(ret.group())# (?Pname) (?Pname) # 注意P要大写 ret re.match(r(?Pname1\w*)(?Pname2\w*).*/(?Pname2)/(?Pname1),htmlh1www.qq.com/h1/html) print(ret.group()) # 输出htmlh1www.qq.com/h1/html对于group的理解 实际上 re.group(0)和re.group()输出的是符合的正则表达式的东西 re.group(1)输出的的是第一个分组内的东西如果有分组才有这一项没有的话就无这一项 r的作用 Python 中字符串前面加上 r 表示原生字符串 与大多数编程语言相同正则表达式里使用“作为转义字符这就可能造成反斜杠困扰。假如你需要匹配文本中的字符”“那么使用编程语言表示的正则表达式里将需要 4 个反斜杠”\前两个和后两个分别用于在编程语言里转义成反斜杠转换成两个反斜杠后再在正则表达式里转义成一个反斜杠。 Python 里的原生字符串很好地解决了这个问题有了原生字符串你再也不用担心是不是漏写了反斜杠写出来的表达式也更直观。 值得关注的是这个r只解决了//就是只对/生效如果需要匹配.实际上也需要使用转义/. re 模块高级用法 compile compile实际上就是为了避免写这个正则表达式的式子太长每次都要进行书写就先把这个封装成一个对象然后调用这个对象里面的方法进行使用。 com re.compile(r\d{4}/[01]?[0-9]/[1-3]?[0-9]\s(?:0[0-9]|1[0-9]|2[0-4])\:[0-5][0-9]) com.match(2020/7/20 18:20)search 功能使用正则匹配式去字符串中寻找第一个符合该格式的子串 import re ret re.search(r\d, 阅读次数为 9999) print(ret.group())输出 9999findall 功能寻找字符串中所有符合正则表达式的字串 基础样例 import re ret re.findall(r\d, python 9999, c 7890, c 12345) print(ret)输出值得关注的是返回的是一个列表而非一个对象然后使用group方法进行调用 [9999, 7890, 12345]易错点 对于包含分组的正则表达式findall会去匹配分组内的正则表达式。 ret_s hello world, now is 2020/7/20 18:48, 现在是2020/7/20 18:48 # compile避免了每次都去写正则findall 有问题 com re.compile(r\d{4}/[01]?[0-9]/[1-3]?[0-9]\s(0[0-9]|1[0-9]|2[0-4]):[0-5][0-9]) ret com.findall(ret_s) print(ret)# ?:可以避免findall只提取分组内的内容 com1 re.compile(r\d{4}/[01]?[0-9]/[1-3]?[0-9]\s(?:0[0-9]|1[0-9]|2[0-4]):[0-5][0-9]) ret com1.findall(ret_s) print(ret)输出 [18, 18] [2020/7/20 18:48, 2020/7/20 18:48]sub 功能替换字符串 直接替换 import re s hello world, now is 2020/7/20 18:48, 现在是 2020 年 7 月 20 日 18 时 48 分。 ret_s re.sub(r年|月, r/, s) ret_s re.sub(r日|分, r , ret_s) ret_s re.sub(r时, r:, ret_s) print(ret_s)输出 hello world, now is 2020/7/20 18:48, 现在是2020/7/20 18:48 。函数替换 不论使用匿名函数还是使用真实的函数都是可以的唯一值得关注的是传进来的对象是正则表达式匹配后的字符串类型的数据如果需要整形化处理记得加上int()最后也需要返回str()类型的数据 import redef add(temp):strNum temp.group()num int(strNum) 1return str(num)ret re.sub(r\d, add, python 997) print(ret)ret re.sub(r\d, lambda temp: str(int(temp.group()) 1), python 99) print(ret)split 根据匹配进行切割字符串并返回一个列表 import re ret re.split(r:| ,info:xiaoZhang 33 shandong) print(ret)python 贪婪和非贪婪 Python 里数量词默认是贪婪的在少数语言里也可能是默认非贪婪总是尝试匹配尽可能多的字符非贪婪则相反总是尝试匹配尽可能少的字符。 解决方式非贪婪操作符“”这个操作符可以用在*“,”“,”?的后面要求正则匹配的越少越好。 test_str img data-originalhttps://rpic.douyucdn.cn/appCovers/2016/11/13/1213973_201611131917_small.jpg srchttps://rpic.douyucdn.cn/appCovers/2016/11/13/1213973_201611131917_small.jpg styledisplay: inline;# 贪婪的写法最后得到的数据会匹配到最后一个jpg实际上就是*一直吃到最后 print(re.search(rhttps://.*\.jpg,test_str).group()) # 非贪婪的写法最后得到的数据会匹配到最开始的一个jpg print(re.search(rhttps://.*?\.jpg, test_str).group())输出结果 https://rpic.douyucdn.cn/appCovers/2016/11/13/1213973_201611131917_small.jpg srchttps://rpic.douyucdn.cn/appCovers/2016/11/13/1213973_201611131917_small.jpg https://rpic.douyucdn.cn/appCovers/2016/11/13/1213973_201611131917_small.jpgHTTP 协议 对于F12的一些组件介绍 监测一下百度官网这边采用edge浏览器其他的用谷歌的也是差不多的。 Elements 显示网页的结构 Network 显示浏览器和服务器的通信 我们点 Network确保第一个小红灯亮着浏览器就会记录所有浏览器和服务器之间的通信。 点开即可查看对应的是什么然后进行对比以下的格式会有更深的领悟这边列一下我这边接受到百度http协议的包并对于比较重要的概念的介绍。 General常规 Request URL: https://www.baidu.com/ Request Method: GET Status Code: 200 OK Remote Address: 36.152.44.96:443 Referrer Policy: unsafe-urlRequest URL即你请求的网站Request Method请求资源的方法一般请求资源的方法有四种:get(查询),post新增put修改delete删除Status Code状态200代表成功返回响应Remote Address远程连接多少ip的多少port而我们采用http即都是80端口https是443端口Referrer Policy来源页面政策暂时不用了解想要了解可以百度 Response header响应标头这一部分就是服务器返回来的数据header HTTP/1.1 200 OK Bdpagetype: 1 Bdqid: 0x87d5ef110007ca38 Connection: keep-alive Content-Encoding: gzip Content-Security-Policy: frame-ancestors self https://chat.baidu.com http://mirror-chat.baidu.com https://fj-chat.baidu.com https://hba-chat.baidu.com https://hbe-chat.baidu.com https://njjs-chat.baidu.com https://nj-chat.baidu.com https://hna-chat.baidu.com https://hnb-chat.baidu.com http://debug.baidu-int.com; Content-Type: text/html; charsetutf-8 Date: Tue, 15 Aug 2023 06:17:21 GMT Server: BWS/1.1 Set-Cookie: BDSVRTM0; path/ Set-Cookie: BD_HOME1; path/ Set-Cookie: H_PS_PSSID36544_39107_38831_26350_39138_39132_39100; path/; domain.baidu.com Strict-Transport-Security: max-age172800 Traceid: 169208024116233405549787992221453634104 X-Ua-Compatible: IEEdge,chrome1 Transfer-Encoding: chunkedHTTP 响应分为 Header 和 Body 两部分Body 是可选项我们在 Network 中看到的 Header 最重要的几行如下 HTTP/1.1 200 OK 200 表示一个成功的响应后面的 OK 是说明。 如果返回的不是 200那么往往有其他的功能例如 1.1 失败的响应有 404 Not Found网页不存在 1.2 500 Internal Server Error服务器内部出错 1.3 …等等…Content-Type: text/html Content-Type 指示响应的内容这里是 text/html 表示 HTML 网页。请注意浏览器就是依靠 Content-Type 来判断响应的内容是网页还是图片是视频还是音乐。浏览器并不靠 URL 来判断响应的内容所以即使 URL 是http://www.baidu.com/meimei.jpg它也不一定就是图片。HTTP 响应的 Body 就是 HTML 源码我们在菜单栏选择“视图”“开发者”“查看网页源码”就可以在浏览器中直接查看 HTML 源码Connection: keep-alive当中代表连接是长连接也就是说你与服务器会保持连接不会像短链接一样仅仅在使用的时候connect服务器发送完数据之后就结束连接Transfer-Encoding: chunked流式文件后面介绍 Request Header请求头这就是浏览器发给服务器的数据因为这些数据是有格式的所以就称作http协议 GET / HTTP/1.1 Accept: text/html,application/xhtmlxml,application/xml;q0.9,image/webp,image/apng,*/*;q0.8,application/signed-exchange;vb3;q0.7 Accept-Encoding: gzip, deflate, br Accept-Language: zh-CN,zh;q0.9,en;q0.8,en-GB;q0.7,en-US;q0.6 Cache-Control: max-age0 Connection: keep-alive Cookie: 这边有一串数据里面包含了token等等一系列东西 Host: www.baidu.com Referer: https://www.baidu.com/s?tn15007414_9_dgwd%E7%99%BE%E5%BA%A6 Sec-Fetch-Dest: document Sec-Fetch-Mode: navigate Sec-Fetch-Site: same-origin Sec-Fetch-User: ?1 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36 Edg/115.0.1901.200 sec-ch-ua: Not/A)Brand;v99, Microsoft Edge;v115, Chromium;v115 sec-ch-ua-mobile: ?0 sec-ch-ua-platform: Windows最主要的头两行分析如下第一行 GET / HTTP/1.1 GET 表示一个读取请求将从服务器获得网页数据/表示 URL 的路径URL 总是以/开头/就表示首页最后的 HTTP/1.1 指示采用的 HTTP 协议版本是 1.1。目前 HTTP 协议的版本就是 1.1但是大部分服务器也支持 1.0 版本主要区别在于 1.1 版本允许多个 HTTP 请求复用一个 TCP 连接以加快传输速度。从第二行开始每一行都类似于 Xxx: abcdefgHost: www.sina.com 表示请求的域名是 www.baidu.com。如果一台服务器有多个网站服务器就需要通过 Host 来区分浏览器请求的是哪个网站 浏览器解析过程 当浏览器读取到新浪首页的 HTML 源码后它会解析 HTML显示页面然后根据 HTML 里面的各种链接再发送 HTTP 请求给新浪服务器拿到相应的图片、视频、JavaScript 脚本、CSS 等各种资源最终显示出一个完整的页面。所以我们在 Network 下面能看到很多额外的 HTTP 请求 http 协议的结束符 http 的 header 和 body 之间空行分割的又因为每个头部项是以 \r\n 作为结束符所以数据流中是以 \r\n\r\n 来分割解析请求头(响应头)与请求体响应体的。如下图所示 理解一下使用/r/n/r/n进行隔断数据但是现在这一句话也不是很正确这边写者也只是粗浅理解。 补充链接 B/S模式下的Web静态服务器 我们这边写的代码属于的就是web服务器端算作对于前面网络编程epoll进程池线程池协程的综合虽然不如web服务器端常用的框架apache和nginx但写一下还是有利于自己对于http协议以及一系列网络编程的理解 Web 静态服务器-1-显示固定的页面 #! /bin/usr/python3.6 # 编辑人lgt # 时间2023年08月15日import socketdef tcp_server():# 创建socket对象tcp_server socket.socket(socket.AF_INET,socket.SOCK_STREAM)# 复用端口tcp_server.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)# bindtcp_server.bind((,2000))# listentcp_server.listen(128)# 阻塞连接等待连接对象client,client_arr tcp_server.accept()# 接收消息http_head client.recv(10000)print(http_head.decode(utf-8))# 连接之后这边默认直接返回一个前端的页面第一个demo不搞太难# response头的标准写法 每行的结束以\r\n为标志response HTTP/1.1 200 OK\r\n# 多加个\r\n代表协议头结束response \r\n# 此时加上body的内容response htmlh1hello world/h1/html# 传回消息client.send(response.encode(utf-8))client.close()# 这边就不关闭tcp服务器了if __name__ __main__:tcp_server()输出过去给浏览器的 此时打开ipconfig进行查看然后使用浏览器进行访问端口即可看到对应的页面。 此时服务器端口能发现返回了这一个协议属性所以我们可以再次进行相对应的修改 Web 静态服务器-2-显示需要的页面 这里我们思考一个问题如果我们采用单进程有没有可能可以多个网页进行和服务器进行沟通得到页面请求 直觉告诉我们是不太可能的原因就是我们的思想背局限在长连接上了在短连接的情况下是完全可以做到的下面就是使用单进程短连接的方式进行写的。 import socket import redef tcp_server():tcp_server的创建:return: None# 创建socket对象tcp_server socket.socket(socket.AF_INET,socket.SOCK_STREAM)# 复用端口tcp_server.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)# bindtcp_server.bind((,2000))# listentcp_server.listen(128)while True:# 阻塞连接等待连接对象client,client_arr tcp_server.accept()solve_task(client)# 关闭tcp服务器实际上没有关闭原因就是上面的是死循环tcp_server.close()def solve_task(client:socket):实现http协议传输以及接受需求的对应的网页资源的返回:param client:客户端:return:None# 接收消息print(* * 100)http_head client.recv(10000)print(http_head.decode(utf-8))# 定义正则表达式提取print(* * 100)# [^/]*吞掉/之前所有的字符后面重要部分使用()进行括起来后面使用group(1)进行提取re1 re.compile(r[^/]*(/[^ ]*))file1 re1.match(http_head.decode(utf-8)).group(1)print(file1)if file1 /:file1 /index.html# 拿到了想要返回的html的样式这时候就应该返回相关的数据try:f open(./html file1 , rb)except:# 如果文件没有找到response HTTP/1.1 404 NOT FOUND\r\n# 多加个\r\n代表协议头结束response \r\nresponse htmlh1------file not found-----/h1/htmlclient.send(response.encode(utf-8))else:# 如果文件找到了# response头的标准写法 每行的结束以\r\n为标志response HTTP/1.1 200 OK\r\n# 多加个\r\n代表协议头结束response \r\n# 此时加上body的内容body f.read()f.close()# 传回消息client.send(response.encode(utf-8))client.send(body)# 此处是关键判断短连接的重要标志client.close()if __name__ __main__:tcp_server()Web 静态服务器-3-多进程 import socket import re from multiprocessing import Process def tcp_server():tcp_server的创建:return: None# 创建socket对象tcp_server socket.socket(socket.AF_INET,socket.SOCK_STREAM)# 复用端口tcp_server.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)# bindtcp_server.bind((,2000))# listentcp_server.listen(128)while True:# 阻塞连接等待连接对象client,client_arr tcp_server.accept()# 值得关注的是args(client,)需要有一个p Process(targetsolve_task,args(client,))p.start()# 此处为什么要关掉呢这里因为我们使用的是进程对于进程来说资源属于引入计数也就是别的进程到这里是复制主进程的所有的变量再进去的此时主进程就可以关掉了client.close()# 关闭tcp服务器实际上没有关闭原因就是上面的是死循环tcp_server.close()def solve_task(client:socket):实现http协议传输以及接受需求的对应的网页资源的返回:param client:客户端:return:None# 接收消息print(* * 100)http_head client.recv(10000)print(http_head.decode(utf-8))# 定义正则表达式提取print(* * 100)# [^/]*吞掉/之前所有的字符后面重要部分使用()进行括起来后面使用group(1)进行提取re1 re.compile(r[^/]*(/[^ ]*))file1 re1.match(http_head.decode(utf-8)).group(1)print(file1)if file1 /:file1 /index.html# 拿到了想要返回的html的样式这时候就应该返回相关的数据try:f open(./html file1 , rb)except:# 如果文件没有找到response HTTP/1.1 404 NOT FOUND\r\n# 多加个\r\n代表协议头结束response \r\nresponse htmlh1------file not found-----/h1/htmlclient.send(response.encode(utf-8))else:# 如果文件找到了# response头的标准写法 每行的结束以\r\n为标志response HTTP/1.1 200 OK\r\n# 多加个\r\n代表协议头结束response \r\n# 此时加上body的内容body f.read()f.close()# 传回消息client.send(response.encode(utf-8))client.send(body)# 此处是关键判断短连接的重要标志client.close()if __name__ __main__:tcp_server()Web 静态服务器-4-多线程 #! /bin/usr/python3.6 # 编辑人lgt # 时间2023年08月15日import socket import re import threading def tcp_server():tcp_server的创建:return: None# 创建socket对象tcp_server socket.socket(socket.AF_INET,socket.SOCK_STREAM)# 复用端口tcp_server.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)# bindtcp_server.bind((,2000))# listentcp_server.listen(128)while True:# 阻塞连接等待连接对象client,client_arr tcp_server.accept()# 值得关注的是args(client,)需要有一个p threading.Thread(targetsolve_task,args(client,))p.start()# 多线程时client传递给子线程以后主线程不能关闭# client.close()# 关闭tcp服务器实际上没有关闭原因就是上面的是死循环tcp_server.close()def solve_task(client:socket):实现http协议传输以及接受需求的对应的网页资源的返回:param client:客户端:return:None# 接收消息print(* * 100)http_head client.recv(10000)print(http_head.decode(utf-8))# 定义正则表达式提取print(* * 100)# [^/]*吞掉/之前所有的字符后面重要部分使用()进行括起来后面使用group(1)进行提取re1 re.compile(r[^/]*(/[^ ]*))file1 re1.match(http_head.decode(utf-8)).group(1)print(file1)if file1 /:file1 /index.html# 拿到了想要返回的html的样式这时候就应该返回相关的数据try:f open(./html file1 , rb)except:# 如果文件没有找到response HTTP/1.1 404 NOT FOUND\r\n# 多加个\r\n代表协议头结束response \r\nresponse htmlh1------file not found-----/h1/htmlclient.send(response.encode(utf-8))else:# 如果文件找到了# response头的标准写法 每行的结束以\r\n为标志response HTTP/1.1 200 OK\r\n# 多加个\r\n代表协议头结束response \r\n# 此时加上body的内容body f.read()f.close()# 传回消息client.send(response.encode(utf-8))client.send(body)# 此处是关键判断短连接的重要标志client.close()if __name__ __main__:tcp_server()Web 静态服务器-5-非堵塞模式 import time import socket import sys import reclass WSGIServer(object):定义一个WSGI服务器的类def __init__(self, port, documents_root):# 1. 创建套接字self.server_socket socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 2. 绑定本地信息self.server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)self.server_socket.bind((, port))# 3. 变为监听套接字self.server_socket.listen(128)self.server_socket.setblocking(False)self.client_socket_list list()self.documents_root documents_rootdef run_forever(self):运行服务器# 等待对方链接while True:# time.sleep(0.5) # for test#下面try的目的是接收请求并放入列表try:new_socket, new_addr self.server_socket.accept()except Exception as ret:# print(-----1----, ret) # for testpasselse:print(time.time())new_socket.setblocking(False)self.client_socket_list.append(new_socket)#遍历列表中的连接如果有浏览器发过来数据那么就处理for client_socket in self.client_socket_list:try:request client_socket.recv(4096).decode(utf-8)except Exception as ret:# print(------2----, ret) # for testpasselse:if request:#有数据就处理数据self.deal_with_request(request, client_socket)else:#浏览器断开了client_socket.close()self.client_socket_list.remove(client_socket)print(time.time())# print(self.client_socket_list)def deal_with_request(self, request, client_socket):为这个浏览器服务器if not request:returnrequest_lines request.splitlines()#这个for循环是为了打印看数据# 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))# print(正则提取数据:, ret.group(2))file_name ret.group(2)if file_name /:file_name /index.html# 读取文件数据try:f open(self.documents_rootfile_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))response_header \r\n# 将header返回给浏览器client_socket.send(response_header.encode(utf-8))# 将body返回给浏览器client_socket.send(response_body.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))response_header \r\n# 将header返回给浏览器client_socket.send( response_header.encode(utf-8) response_body)# 设置服务器服务静态资源时的路径 DOCUMENTS_ROOT ./htmldef main():控制web服务器整体# python3 xxxx.py 7890if len(sys.argv) 2:port sys.argv[1]if port.isdigit():port int(port)else:print(运行方式如: python3 xxx.py 7890)returnprint(http服务器使用的port:%s % port)http_server WSGIServer(port, DOCUMENTS_ROOT)http_server.run_forever()if __name__ __main__:main()Web 静态服务器-6-epoll import socket import re import selectdef service_client(new_socket, request):为这个客户端返回数据# 1. 接收浏览器发送过来的请求 即http请求 # GET / HTTP/1.1# .....# request new_socket.recv(1024).decode(utf-8)# print(*50)# print(request)if not request:returnrequest_lines request.splitlines()print()print(*20)print(request_lines)if not request_lines:return# GET /index.html HTTP/1.1# get post put delfile_name ret re.match(r[^/](/[^ ]*), request_lines[0])if ret:file_name ret.group(1)# print(**50, file_name)if file_name /:file_name /index.html# 2. 返回http格式的数据给浏览器try:f open(./html file_name, rb)except:response HTTP/1.1 404 NOT FOUND\r\nresponse \r\nresponse ------file not found-----new_socket.send(response.encode(utf-8))else:html_content f.read()f.close()response_body html_contentresponse_header HTTP/1.1 200 OK\r\nresponse_header Content-Length:%d\r\n % len(response_body)response_header \r\nresponse response_header.encode(utf-8) response_bodynew_socket.send(response)def main():用来完成整体的控制# 1. 创建套接字tcp_server_socket socket.socket(socket.AF_INET, socket.SOCK_STREAM)tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)# 2. 绑定tcp_server_socket.bind((, 7890))# 3. 变为监听套接字tcp_server_socket.listen(128)tcp_server_socket.setblocking(False) # 将套接字变为非堵塞# 创建一个epoll对象epl select.epoll()# 将监听套接字对应的fd注册到epoll中epl.register(tcp_server_socket.fileno(), select.EPOLLIN)fd_event_dict dict()while True:fd_event_list epl.poll() # 默认会堵塞直到 os监测到数据到来 通过事件通知方式 告诉这个程序此时才会解堵塞# [(fd, event), (套接字对应的文件描述符, 这个文件描述符到底是什么事件 例如 可以调用recv接收等)]for fd, event in fd_event_list:# 等待新客户端的链接if fd tcp_server_socket.fileno():new_socket, client_addr tcp_server_socket.accept()epl.register(new_socket.fileno(), select.EPOLLIN)fd_event_dict[new_socket.fileno()] new_socket #字典键是filenoelif eventselect.EPOLLIN:# 判断已经链接的客户端是否有数据发送过来#如何通过不遍历来定位socketrecv_data fd_event_dict[fd].recv(4096).decode(utf-8)if recv_data:service_client(fd_event_dict[fd], recv_data)else:fd_event_dict[fd].close()epl.unregister(fd)del fd_event_dict[fd] #从字典中移除# 关闭监听套接字tcp_server_socket.close()if __name__ __main__:main()Web 静态服务器-7-gevent 版 import socket import re import gevent from gevent import monkey# monkey组件 monkey.patch_all()def service_client(new_socket):为客户端返回数据# 接收http请求request new_socket.recv(1024).decode(utf-8)if request:request_lines request.splitlines()print()print( * 20)print(request_lines)file_name ret re.match(r[^/](/[^ ]*), request_lines[0])if ret:file_name ret.group(1)if file_name /:file_name /index.htmlprint(file_name)try:f open(./html file_name, rb)except:response HTTP/1.1 404 NOT FOUND\r\nresponse \r\nresponse -------file not found-------new_socket.send(response)else:html_content f.read()f.close()response HTTP/1.1 200 OK\r\nresponse \r\nnew_socket.send(response.encode(utf-8))new_socket.send(html_content)new_socket.close()def main():创建套接字# 初始化tcp_server_socket socket.socket(socket.AF_INET, socket.SOCK_STREAM)tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)# 绑定tcp_server_socket.bind((, 7890))# 激活tcp_server_socket.listen(128)while True:new_socket, socket_addr tcp_server_socket.accept()gevent.spawn(service_client, new_socket)tcp_server_socket.close()if __name__ __main__:main()
http://www.w-s-a.com/news/60186/

相关文章:

  • 获取网站全站代码申请免费域名的方法
  • 网站制作建设公司哪家好wordpress仪表盘打不开
  • 最佳网站制作模板用手机能创建网站吗
  • 只做黑白摄影的网站网站建设好后给领导作介绍
  • 移动手机网站建设如何做网站地图视频
  • 手工业网站怎么做成都酒吧设计公司
  • .net 网站生成安装文件目录重庆网站建设沛宣网络
  • 怎么做钓鱼网站吗百度免费域名注册网站
  • 如何给网站做外部优化今年国内重大新闻
  • 有没有做生物科技相关的网站弄一个app大概多少钱
  • 五金加工东莞网站建设怎么做网页跳转
  • 淄博网站优化价格wordpress没有小工具
  • 自己搭建服务器做视频网站wordpress发布文章 发布
  • php仿博客园网站阅读分享网站模板
  • 网站宣传的劣势域名注册长沙有限公司
  • 怎样联系自己建设网站企业怎样做好网站建设
  • 网站制作需求分析电商网站建设浩森宇特
  • 淄博网站建设招聘摄影网站建设的论文
  • 怎么把凡科网里做的网站保存成文件网站建设研究的意义
  • 服务器2003怎么做网站网站建设服务器的配置
  • 高校网站建设方案网站推广软件下载安装免费
  • 重庆没建网站的企业网站开发软件 连接SQL数据库
  • 百度申诉网站沉默是金
  • 如何自己建网站wordpress图片延时加载
  • 甘肃省住房和城乡建设厅注册中心网站千博企业网站管理系统2013
  • 西餐厅网站模板seo搜索引擎优化ppt
  • 什么做的网站吗wordpress注册可见插件
  • 献县做网站价格可以提升自己的网站
  • 如何修改网站title建设网站只能是公司
  • 网站推广效果怎么样建设工程公司组织架构图