搜索
首页后端开发Python教程Python的web服务器相关知识点
Python的web服务器相关知识点Jun 23, 2017 am 11:46 AM
pythonweb服务器

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 = &#39;<h1>很抱歉,服务器中找不到你想要的内容<h1>&#39;else:if &#39;/&#39;== fileName:
                    filePath += &#39;/index.html&#39;else:
                    filePath += fileNametry:
                    file = None
                    file =open(filePath,&#39;r&#39;,encoding=&#39;gbk&#39;)
                    responseBody = file.read()

                    responseLine = &#39;HTTP/1.1 200 OK&#39;
                    responseHeader = &#39;Server: ererbai&#39; + os.linesep
                    responseHeader += &#39;Date:%s&#39; % time.ctime()except FileNotFoundError:
                    responseLine = &#39;HTTP/1.1 404 NOT FOUND&#39;
                    responseHeader = &#39;Server: ererbai&#39; + os.linesep
                    responseHeader += &#39;Date:%s&#39; % time.ctime()
                    responseBody = &#39;很抱歉,服务器中找不到你想要的内容&#39;finally:if (file!=None) and (not file.closed):
                        file.close()except Exception as ex:
            responseLine = &#39;HTTP/1.1 500 ERROR&#39;
            responseHeader = &#39;Server: ererbai&#39; + os.linesep
            responseHeader += &#39;Date: %s&#39; % time.ctime()
            responseBody = &#39;服务器正在维护中,请稍后再试。%s&#39;%exfinally:
            senData = responseLine + os.linesep + responseHeader + os.linesep + os.linesep + responseBody
            print(senData)
            senData = senData.encode(&#39;gbk&#39;)
            clientSocket.send(senData)if (clientSocket!=None) and ( not clientSocket._closed):
                clientSocket.close()def startResponse(self,status,responseHeaders):
        self.responseLine = status
        self.responseHeader = &#39;&#39;for k,v in responseHeaders:
            kv = k + &#39;:&#39; + v + os.linesep
            self.responseHeader += kvif __name__ == &#39;__main__&#39;:
    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 = &#39;HTTP/1.1 200 OK&#39;
    responseHeaders = [(&#39;Server&#39;,&#39;bfe/1.0.8.18&#39;),(&#39;Date&#39;,&#39;%s&#39;%time.ctime()),(&#39;Content-Type&#39;,&#39;text/plain&#39;)]
    startResponse(status,responseHeaders)

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

访问结果:


首页

biye.html

mytime.py
&#39;&#39;&#39;
自定义的符合wsgi的框架
&#39;&#39;&#39;import timeclass Application(object):def __init__(self, urls):&#39;&#39;&#39;框架初始化的时候需要获取路由列表&#39;&#39;&#39;
        self.urls = urlsdef __call__(self, env, startResponse):&#39;&#39;&#39;
        判断是静态资源还是动态资源。
        设置状态码和响应头和响应体
        :param env:
        :param startResponse:
        :return:
        &#39;&#39;&#39;# 从请求头中获取文件名
        fileName = env.get(&#39;PATH_INFO&#39;)# 判断静态还是动态if fileName.startwith(&#39;/static&#39;):
            fileName = fileName[7:]if &#39;/&#39; == fileName:
                filePath += &#39;/index.html&#39;else:
                filePath += fileNametry:
                file = None
                file = open(filePath, &#39;r&#39;, encoding=&#39;gbk&#39;)
                responseBody = file.read()
                status = &#39;HTTP/1.1 200 OK&#39;
                responseHeaders = [(&#39;Server&#39;, &#39;ererbai&#39;)]except FileNotFoundError:
                status = &#39;HTTP/1.1 404 Not Found&#39;
                responseHeaders = [(&#39;Server&#39;, &#39;ererbai&#39;)]
                responseBody = &#39;<h1>找不到<h1>&#39;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 = &#39;HTTP/1.1 404 Not Found&#39;
                responseHeaders = [(&#39;Server&#39;, &#39;ererbai&#39;)]
                responseBody = &#39;<h1>找不到<h1>&#39;
                startResponse(status, responseHeaders)return responseBodydef mytime(env, startResponse):
    status = &#39;HTTP/1.1 200 OK&#39;
    responseHeaders = [(&#39;Server&#39;, &#39;time&#39;)]
    startResponse(status, responseHeaders)
    responseBody = str(time.ctime())return responseBodydef mynews(env, startResponse):
    status = &#39;HTTP/1.1 200 OK&#39;
    responseHeaders = [(&#39;Server&#39;, &#39;news&#39;)]
    startResponse(status, responseHeaders)
    responseBody = str(&#39;xx新闻&#39;)return responseBody&#39;&#39;&#39;路由列表&#39;&#39;&#39;
urls = [
    (&#39;/mytime&#39;, mytime),
    (&#39;/mynews&#39;, mynews)
]

application = Application(urls)

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

以上是Python的web服务器相关知识点的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
详细讲解Python之Seaborn(数据可视化)详细讲解Python之Seaborn(数据可视化)Apr 21, 2022 pm 06:08 PM

本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于Seaborn的相关问题,包括了数据可视化处理的散点图、折线图、条形图等等内容,下面一起来看一下,希望对大家有帮助。

详细了解Python进程池与进程锁详细了解Python进程池与进程锁May 10, 2022 pm 06:11 PM

本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于进程池与进程锁的相关问题,包括进程池的创建模块,进程池函数等等内容,下面一起来看一下,希望对大家有帮助。

Python自动化实践之筛选简历Python自动化实践之筛选简历Jun 07, 2022 pm 06:59 PM

本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于简历筛选的相关问题,包括了定义 ReadDoc 类用以读取 word 文件以及定义 search_word 函数用以筛选的相关内容,下面一起来看一下,希望对大家有帮助。

归纳总结Python标准库归纳总结Python标准库May 03, 2022 am 09:00 AM

本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于标准库总结的相关问题,下面一起来看一下,希望对大家有帮助。

分享10款高效的VSCode插件,总有一款能够惊艳到你!!分享10款高效的VSCode插件,总有一款能够惊艳到你!!Mar 09, 2021 am 10:15 AM

VS Code的确是一款非常热门、有强大用户基础的一款开发工具。本文给大家介绍一下10款高效、好用的插件,能够让原本单薄的VS Code如虎添翼,开发效率顿时提升到一个新的阶段。

python中文是什么意思python中文是什么意思Jun 24, 2019 pm 02:22 PM

pythn的中文意思是巨蟒、蟒蛇。1989年圣诞节期间,Guido van Rossum在家闲的没事干,为了跟朋友庆祝圣诞节,决定发明一种全新的脚本语言。他很喜欢一个肥皂剧叫Monty Python,所以便把这门语言叫做python。

Python数据类型详解之字符串、数字Python数据类型详解之字符串、数字Apr 27, 2022 pm 07:27 PM

本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于数据类型之字符串、数字的相关问题,下面一起来看一下,希望对大家有帮助。

详细介绍python的numpy模块详细介绍python的numpy模块May 19, 2022 am 11:43 AM

本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于numpy模块的相关问题,Numpy是Numerical Python extensions的缩写,字面意思是Python数值计算扩展,下面一起来看一下,希望对大家有帮助。

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
2 周前By尊渡假赌尊渡假赌尊渡假赌
仓库:如何复兴队友
4 周前By尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
4 周前By尊渡假赌尊渡假赌尊渡假赌

热工具

安全考试浏览器

安全考试浏览器

Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中

SublimeText3 英文版

SublimeText3 英文版

推荐:为Win版本,支持代码提示!

EditPlus 中文破解版

EditPlus 中文破解版

体积小,语法高亮,不支持代码提示功能

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版