如何WsgiServer。py搭建服务器
目的:搭建最简单的服务器框架(访问本地静态和动态资源)
一、大致思路:
1、创建监听套件
2、绑定本地信息(IP和port)
3、使用listen改变监听状态
4、等待客户端(浏览器)的链接,并创建为客户端服务的服务套接字(使用多进程调用服务方法为客户端服务)
5、服务方法:获取客户端发送的数据使用正则表达式匹配客户端发送的信息,获得服务端需要的信息
访问静态网页,直接本地匹配资源地址,读取并发送给客户端(浏览器)
访问动态资源,调用框架的application方法,获取框架返回的数据,组装成相应数据,发送给客户端(浏览器)
上代码:
WsgiServer。pyfromsocketimportimportre,multiprocessing,timeimportminiframeclassWSGIServer(object):definit(self):1、创建监听套件self。serversocketsocket(AFINET,SOCKSTREAM)self。serversocket。setsockopt(SOLSOCKET,SOREUSEADDR,1)self。serversocket。setblocking(False)2、绑定本地IP和port信息,本地信息使用元组格式self。serversocket。bind((,8080))3、使用listen改变监听状态,设置监听容量self。serversocket。listen(128)defclientsever(self,newsocket):5、获取客户端发送的信息,并设置接收数据字节大小requestnewsocket。recv(1024)。decode(utf8)6、使用正则表达式匹配客户端发送的信息,获得服务端需要的信息,本地匹配资源地址gre。match(r〔〕(〔〕)s,request)ifg:filenameg。group(1)7、根据匹配结果,在本地进行操作打开本地资源,读取本地数据作为响应体ifnotfilename。endswith(。py):try:执行代码withopen(filename,rb)asf:responsebodyf。read()except:发生异常时执行responsebodyh1helloworld!notfoundh1。encode(utf8)finally:不管有没有异常时,都会执行代码responseheaderHTTP1。1rresponseheaderrprint(filename)组装本地数据responseresponseheader。encode(utf8)responsebody8、发送匹配后的本地资源给客户端newsocket。send(response)9、关闭客户端链接字,结束服务,等待下一个客户端链接。newsocket。close()else:调用框架的application方法,传递字典和类方法,支持wsgi协议envdict()env〔pathinfo〕filenameresponsebodyminiframe。application(env,self。startresponse)组装响应头,注意,每行数据后面必须加rresponseheaderHTTP1。1{}r。format(self。status)foriinself。hearders:responseheader{}:{}r。format(i〔0〕,i〔1〕)responseheaderrresponseresponseheaderresponsebodynewsocket。send(response。encode(utf8))9、关闭客户端链接字,结束服务,等待下一个客户端链接。newsocket。close()defstartresponse(self,status,hearders):保存框架返回的状态码和响应头,为类属性,方便后续调用self。statusstatusself。heardersheardersdefrunforever(self):whileTrue:4、接收服务端链接,创建为客户端服务的客户端套接字newsocket,clientaddrself。serversocket。accept()创建进程为客户端服务pmultiprocessing。Process(targetself。clientsever,args(newsocket,))p。start()关闭客户套接字newsocket。close()defmain():控制整体,创建一个web服务器对象,然后调用一个方法来执行wWSGIServer()w。runforever()ifnamemain:main()miniframe。pyimporttimedeflogin():return这是登录页,当前时间:{}。format(time。ctime())defindex():return这是主页,当前时间:{}。format(time。ctime())defapplication(env,startresponse):调用传递过来的方法,返回响应状态码和头部信息startresponse(200OK,〔(ContentType,texthtml;charsetUTF8)〕)ifenv〔pathinfo〕login。py:returnlogin()elifenv〔pathinfo〕index。py:returnindex()else:returnhelloworld!冬天来了的body
如果本文对你有帮助的话,可以点赞收藏关注一波哦,感谢你的支持
原文链接:https:blog。csdn。netm055415810articledetails121978705
农田里的数学除数是两位数的除法四年级数学上册教学反思今天我讲了:除数是两位数的除法,感觉教学效果不太好,反思教学过程,感悟颇多。早就听有经验的老师说过,这堂课不太好上,学生们接受的要慢一些,今天看来确实有一定的难度,本来教……
小班体育活动教案教案小猴分桃子【活动目标】1、用重叠法比较两组物体的多少。2、找出一组物体多出的部分。3、从左至右摆放物体。4、锻炼幼儿快速跑的能力。【活动准备】1、每位……
友爱思想品德教学反思范文从学生日常中反映出的倾向、问题去构思和组织教学活动是新基础教育思想品德教学的一种重要表现形式,因为这样的教学能产生直接、有影响的效果而在学生脑海中留下深刻印象,有力地促进他们积……
小学二年级数学教案设计【教学目标】1、结合分一分的具体情境与经验,抽象出除法算式,体会除法运算的意义。2、掌握除法算式的读法、写法,并记住除法算式各部分的名称。3、会用除法算式表示……
游戏公平教学反思范文本课内容属于《概率与统计》范畴,在此之前学生学习了可能性的大小,平时生活中也经常玩一些游戏,对游戏公平有一定的感性认识。为此,教材在编写上注重了活动性和可操作性。通过游戏公平的……
Unitampnbsp14ampnbspFreedomampunit14freedomfighters单元练习小练。单项填空1。youcanusinthediscussionifyou。a。join;wishto……
炮兽教案【教学重点和难点】结合雨果名句探究雨果场景创作的方法及场景设置的功能。【课时安排】一课时【教学过程】课前准备1,请学生上网查询雨果及39;浪……
音乐走进京剧教案走近京剧一、教学目标:通过欣赏使学生初步了解国粹京剧的基础知识,并通过对唱念做打的模仿充分体验京剧艺术的魅力,激发学生对京剧传统戏曲艺术的自豪之感和热爱之情,宏扬中……
孔子拜师教案一篇课文,不同的老师会写出不同的教案,一起来看看孔子拜师的教案吧,接下来小编为大家推荐的是孔子拜师教案相关内容,欢迎阅读。孔子拜师教案一学习目标1、正确、流利、有感……
小学语文从现在开始教师教学设计【教学目标】1、认读9个生字,读准字音。2、会写:学写生字,重点写好现和轮。初步学会欣赏,感受汉字的形体美。培养良好的写字习惯。3、会读:……
为中华之崛起而读书教案设计教学目标:1认识8个生字,会写12个生字。正确读写帝国主义、伯父、模范、风和日丽、灯红酒绿、热闹非凡、耀武扬威、巡警、吵嚷、得意扬扬、惩处、抱负、胸怀、喝彩、振兴中华等词……
抛砖引玉的典故抛砖引玉是比喻用自己不成熟的意见或作品引出别人更好的意见或好作品。你们知道抛砖引玉有什么典故吗?下面是品学网小编为大家整理了抛砖引玉的典故,希望大家喜欢。抛砖引玉的典故唐……