Heim >Backend-Entwicklung >Python-Tutorial >Wissenspunkte zum Python-Webserver
Python Web Server Gateway Interface (oder kurz WSGI, ausgesprochen „wizgy“) " ).
WSGI ermöglicht Entwicklern, das Web-Framework ihrer Wahl vom Webserver zu trennen. Sie können Webserver und Web-Frameworks kombinieren und kombinieren, um eine geeignete Paarung auszuwählen. Sie können beispielsweise Django, Flask oder Pyramid auf Gunicorn, Nginx/uWSGI oder Waitress ausführen. Eine echte Mischung, da WSGI sowohl Server als auch Architektur unterstützt.
Der Webserver muss über eine WSGI-Schnittstelle verfügen, die es Ihnen ermöglicht, diese zu verwenden, ohne sie zu ändern Der Server arbeitet mit dem vorgestellten Webframework zusammen.
WSGI wird vom Webserver unterstützt, und das Web-Framework ermöglicht es Ihnen, die für Sie passende Paarung zu wählen, bietet aber auch Server- und Framework-Entwicklern Komfort, sodass sie sich auf ihre bevorzugten Bereiche und Fachkenntnisse konzentrieren können sich gegenseitig behindern. Andere Sprachen verfügen über ähnliche Schnittstellen: Java verfügt über die Servlet-API und Ruby über Rack.
Die WSGI-Schnittstellendefinition ist sehr einfach. Webentwickler müssen lediglich eine Funktion implementieren, um auf HTTP-Anfragen zu reagieren. Werfen wir einen Blick auf die einfachste Webversion von „Hello World!“:
def application(environ, start_response): start_response('200 OK', [('Content-Type', 'text/html')])return 'Hello World!'
Die obige application()-Funktion ist eine HTTP-Verarbeitungsfunktion, die dem WSGI-Standard entspricht. Sie empfängt zwei Parameter:
environ: ein Diktatobjekt, das alle HTTP-Anfrageinformationen enthält;
start_response: eine Funktion, die eine HTTP-Antwort sendet.
Die gesamte application()-Funktion selbst beinhaltet keinen HTTP-Parsing-Teil. Mit anderen Worten, der zugrunde liegende Webserver-Parsing-Teil und der Anwendungslogik-Teil sind getrennt, sodass Entwickler sie nutzen können kann sich auf einen Bereich konzentrieren. Die Funktion
application() muss vom WSGI-Server aufgerufen werden. Es gibt viele Server, die der WSGI-Spezifikation entsprechen. Der Zweck unseres Webserverprojekts besteht derzeit darin, einen Server zu erstellen, der mit hoher Wahrscheinlichkeit statische Webseiten und auch dynamische Webseiten analysieren kann
Implementierungscode:
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-Dateien die auf dem Server vorhanden sind:
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>
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
''' 自定义的符合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)
Wenn Sie während des Lernprozesses auf Probleme stoßen oder Lernressourcen erhalten möchten, können Sie gerne der Lernaustauschgruppe beitreten
626062078, lass uns Python lernen zusammen!
Das obige ist der detaillierte Inhalt vonWissenspunkte zum Python-Webserver. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!