python web 服务器 php_Python的web服务器相关知识点

1.浏览器请求动态页面过程

8f4cf7e8175297e05605d6e9f5d8197a.png

2.WSGI

Python Web Server Gateway Interface (或简称 WSGI,读作“wizgy”)。

WSGI允许开发者将选择web框架和web服务器分开。可以混合匹配web服务器和web框架,选择一个适合的配对。比如,可以在Gunicorn 或者 Nginx/uWSGI 或者 Waitress上运行 Django, Flask, 或 Pyramid。真正的混合匹配,得益于WSGI同时支持服务器和架构.

web服务器必须具备WSGI接口,所有的现代Python Web框架都已具备WSGI接口,它让你不对代码作修改就能使服务器和特点的web框架协同工作。

WSGI由web服务器支持,而web框架允许你选择适合自己的配对,但它同样对于服务器和框架开发者提供便利使他们可以专注于自己偏爱的领域和专长而不至于相互牵制。其他语言也有类似接口:java有Servlet API,Ruby 有 Rack。

3.定义WSGI接口

WSGI接口定义非常简单,它只要求Web开发者实现一个函数,就可以响应HTTP请求。我们来看一个最简单的Web版本的“Hello World!”: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( )函数必须由WSGI服务器来调用。有很多符合WSGI规范的服务器。而我们此时的web服务器项目的目的就是做一个极可能解析静态网页还可以解析动态网页的服务器

实现代码:import time,multiprocessing,socket,os,reclass MyHttpServer(object):def __init__(self):

serveSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

self.serveSocket = serveSocket

self.HTMLPATH = './html'def bind(self,port=8000):

self.serveSocket.bind(('',port))def start(self):

self.serveSocket.listen()while True:

clientSocket, clientAddr = self.serveSocket.accept()

print(clientSocket)

multiprocessing.Process(target=self.serveHandler, args=(clientSocket, clientAddr)).start()

clientSocket.close()def serveHandler(self,clientSocket,clientAddr):try:

recvData = clientSocket.recv(1024).decode('gbk')

fileName = re.split(r' +', recvData.splitlines()[0])[1]

filePath = self.HTMLPATHif fileName.endswith('.py'):try:

pyname=fileName[1:-3]# 导入

pyModule = __import__(pyname)

env={}

responseBody = pyModule.application(env,self.startResponse)

responseLine = self.responseLine

responseHeader = self.responseHeaderexcept ImportError:

responseLine = 'HTTP/1.1 404 NOT FOUND'

responseHeader = 'Server: ererbai' + os.linesep

responseHeader += 'Date: %s' % time.ctime()

responseBody = '

很抱歉,服务器中找不到你想要的内容

'else:if '/'== fileName:

filePath += '/index.html'else:

filePath += fileNametry:

file = None

file =open(filePath,'r',encoding='gbk')

responseBody = file.read()

responseLine = 'HTTP/1.1 200 OK'

responseHeader = 'Server: ererbai' + os.linesep

responseHeader += 'Date:%s' % time.ctime()except FileNotFoundError:

responseLine = 'HTTP/1.1 404 NOT FOUND'

responseHeader = 'Server: ererbai' + os.linesep

responseHeader += 'Date:%s' % time.ctime()

responseBody = '很抱歉,服务器中找不到你想要的内容'finally:if (file!=None) and (not file.closed):

file.close()except Exception as ex:

responseLine = 'HTTP/1.1 500 ERROR'

responseHeader = 'Server: ererbai' + os.linesep

responseHeader += 'Date: %s' % time.ctime()

responseBody = '服务器正在维护中,请稍后再试。%s'%exfinally:

senData = responseLine + os.linesep + responseHeader + os.linesep + os.linesep + responseBody

print(senData)

senData = senData.encode('gbk')

clientSocket.send(senData)if (clientSocket!=None) and ( not clientSocket._closed):

clientSocket.close()def startResponse(self,status,responseHeaders):

self.responseLine = status

self.responseHeader = ''for k,v in responseHeaders:

kv = k + ':' + v + os.linesep

self.responseHeader += kvif __name__ == '__main__':

server = MyHttpServer()

server.bind(8000)

server.start()

服务器中存在的html的文件:index.html

首页-毕业季我们仍需共生命的慷慨与繁华相爱,即使岁月以刻薄和荒芜相欺。biye.html毕业季![](http://localhost:51017/day18/html/biyeji.png)
当年以为六月不过也很平常
当自己真正经历了毕业
才知道偶尔看到六月毕业季等字里所流露的种种想要重温却不敢提及的回忆
毕业了
那个夏天,我的毕业季,我的青春年少
六月
有人笑着说解脱,有人哭着说不舍
那年,
你对我说的你好
在不知不觉中
变成了
再见。

fcbc9ae5be050c4ccced8d7295c8adbb.png

biyeji.png

mytime.py文件import timedef application(env,startResponse):

status = 'HTTP/1.1 200 OK'

responseHeaders = [('Server','bfe/1.0.8.18'),('Date','%s'%time.ctime()),('Content-Type','text/plain')]

startResponse(status,responseHeaders)

responseBody = str(time.ctime())return responseBody

访问结果:

75ba2e452ba6377e733300ebaf7c9b6c.png

首页

7b4f2ffed74003be10e9610b1958df4c.png

biye.html

5d6318e4cec60f2c245ca21634558863.png

mytime.py'''

自定义的符合wsgi的框架

'''import timeclass Application(object):def __init__(self, urls):'''框架初始化的时候需要获取路由列表'''

self.urls = urlsdef __call__(self, env, startResponse):'''

判断是静态资源还是动态资源。

设置状态码和响应头和响应体

:param env:

:param startResponse:

:return:

'''# 从请求头中获取文件名

fileName = env.get('PATH_INFO')# 判断静态还是动态if fileName.startwith('/static'):

fileName = fileName[7:]if '/' == fileName:

filePath += '/index.html'else:

filePath += fileNametry:

file = None

file = open(filePath, 'r', encoding='gbk')

responseBody = file.read()

status = 'HTTP/1.1 200 OK'

responseHeaders = [('Server', 'ererbai')]except FileNotFoundError:

status = 'HTTP/1.1 404 Not Found'

responseHeaders = [('Server', 'ererbai')]

responseBody = '

找不到

'finally:

startResponse(status, responseHeaders)if (file != None) and (not file.closed):

file.close()else:

isHas = False # 表示请求的名字是否在urls中,True:存在,False:不存在for url, func in self.urls:if url == fileName:

responseBody = func(env, startResponse)

isHas = Truebreakif isHas == False:

status = 'HTTP/1.1 404 Not Found'

responseHeaders = [('Server', 'ererbai')]

responseBody = '

找不到

'

startResponse(status, responseHeaders)return responseBodydef mytime(env, startResponse):

status = 'HTTP/1.1 200 OK'

responseHeaders = [('Server', 'time')]

startResponse(status, responseHeaders)

responseBody = str(time.ctime())return responseBodydef mynews(env, startResponse):

status = 'HTTP/1.1 200 OK'

responseHeaders = [('Server', 'news')]

startResponse(status, responseHeaders)

responseBody = str('xx新闻')return responseBody'''路由列表'''

urls = [

('/mytime', mytime),

('/mynews', mynews)

]

application = Application(urls)

学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入学习交流群

626062078,我们一起学Python!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值