最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

Python的web服务器相关知识点

来源:动视网 责编:小采 时间:2020-11-27 14:14:05
文档

Python的web服务器相关知识点

Python的web服务器相关知识点:1.浏览器请求动态页面过程2.WSGIPython Web Server Gateway Interface (或简称 WSGI,读作wizgy)。WSGI允许开发者将选择web框架和web服务器分开。可以混合匹配web服务器和web框架,选择一个适合的配对。比如,可以在Gunicorn 或者 Nginx/
推荐度:
导读Python的web服务器相关知识点:1.浏览器请求动态页面过程2.WSGIPython Web Server Gateway Interface (或简称 WSGI,读作wizgy)。WSGI允许开发者将选择web框架和web服务器分开。可以混合匹配web服务器和web框架,选择一个适合的配对。比如,可以在Gunicorn 或者 Nginx/


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

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 = '<h1>很抱歉,服务器中找不到你想要的内容<h1>'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

  • <html><head><title>首页-毕业季</title><meta http-equiv=Content-Type content="text/html;charset=gbk"></head><body>我们仍需共生命的慷慨与繁华相爱,即使岁月以刻薄和荒芜相欺。</body></html>
  • biye.html

  • <!DOCTYPE html><html lang="en"><head><meta charset="gbk"><title>毕业季</title></head><body>![](http://localhost:51017/day18/html/biyeji.png)<br>当年以为六月不过也很平常<br>当自己真正经历了毕业<br>才知道偶尔看到六月毕业季等字里所流露的种种想要重温却不敢提及的回忆<br>毕业了<br>那个夏天,我的毕业季,我的青春年少<br>六月<br>有人笑着说解脱,有人哭着说不舍<br>那年,<br>你对我说的你好<br>在不知不觉中<br>变成了<br>再见。</body></html>

    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

    访问结果:


    首页
    biye.html
    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 = '<h1>找不到<h1>'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 = '<h1>找不到<h1>'
     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!

    文档

    Python的web服务器相关知识点

    Python的web服务器相关知识点:1.浏览器请求动态页面过程2.WSGIPython Web Server Gateway Interface (或简称 WSGI,读作wizgy)。WSGI允许开发者将选择web框架和web服务器分开。可以混合匹配web服务器和web框架,选择一个适合的配对。比如,可以在Gunicorn 或者 Nginx/
    推荐度:
    • 热门焦点

    最新推荐

    猜你喜欢

    热门推荐

    专题
    Top