python代码搭建web服务器
⑴ 基于python2怎么自行搭建简单的web服务器
利用Python自带包建立简单web服务器DOScd准备做服务器根目录路径输入命令:
python -m Web服务器模块 [端口号默认8000]
例:
python -m SimpleHTTPServer 8080
浏览器输入
h ttp://loca lhost:端口号/路径
访问服务器资源
例:
h ttp://local host:808 0/index.h tm(index.htm文件自创建)
其机器通服务器IP址访问
Web服务器模块三种:
BaseHTTPServer: 提供基本Web服务处理器类别
SimpleHTTPServer: 包含执行GETHEAD请求SimpleHTTPRequestHandler类
CGIHTTPServer: 包含处理POST请求执行CGIHTTPRequestHandler类
⑵ 纯 Python 写一个 Web 框架,就是这么简单
造轮子是最好的一种学习方式,本文尝试从0开始造个Python Web框架的轮子,我称它为 ToyWebF 。
本文操作环境为:MacOS,文中涉及的命令,请根据自己的系统进行替换。
ToyWebF的简单特性:
下面我们来实现这些特性。
首先,我们需要安装gunicorn,回忆一下Flask框架,该框架有内置的Web服务器,但不稳定,所以上线时通常会替换成uWSGI或gunicorn,这里不搞这个内置Web服务,直接使用gunicorn。
我们创建新的目录与Python虚拟环境,在该虚拟环境中安装gunicorn
在啥都没有的情况下,构建最简单的Web服务,在ToyWebF目录下,创建app.py与api.py文件,写入下面代码。
运行 gunicorn app:app 访问 http://127.0.0.1:8000 ,可以看见 Hello, World! ,但现在请求体中的参数在environ变量中,难以解析,我们返回的response也是bytes形式。
我们可以使用webob库,将environ中的数据转为Request对象,将需要返回的数据转为Response对象,处理起来更加直观方便,直接通过pip安装一下。
然后修改一下API类的 __call__方法 ,代码如下。
上述代码中,通过webob库的Request类将environ对象(请求的环境信息)转为容易处理的request,随后调用handle_request方法对request进行处理,处理的结果,通过response对象返回。
handle_request方法在ToyWebF中非常重要,它会匹配出某个路由对应的处理方法,然后调用该方法处理请求并将处理的结果返回,在解析handle_request前,需要先讨论路由注册实现,代码如下。
其实就是将路由和方法存到self.routes字典中,可以通过route装饰器的形式将路由和方法关联,也可以通过add_route方法关联,在app.py中使用一下。
因为url中可以存在变量,如 @app.route("/hello/{name}") ,所以在匹配时,需要进行解析,可以使用正则匹配的方式进行匹配,parse这个第三方库已经帮我们实现了相应的正则匹配逻辑,pip安装使用一下则可。
这里定义find_handler方法来实现对self.routes的遍历。
了解了路由与方法关联的原理后,就可以实现handle_request方法,该方法主要的路径就是根据路由调度对应的方法,代码如下。
在该方法中,首先实例化webob库的Response对象,然后通过self.find_handler方法获取此次请求路由对应的方法和对应的参数,比如。
它将返回hello方法对象和name参数,如果是 /hello/二两 ,那么name就是二两。
因为route装饰器可能装饰器的类对象,比如。
此时self.find_handler方法返回的hanler就是个类,但我们希望调用的是类中的get、post、delete等方法,所以需要一个简单的判断逻辑,通过inspect.isclass方法判断handler如果是类对象,那么就通过getattr方法获取类对象实例的中对应的请求方法。
如果类对象中没有该方法属性,则抛出该请求类型不被允许的错误,如果不是类对象或类对象中存在该方法属性,则直接调用则可。
此外,如果方法的路由并没有注册到self.routes中,即404的情况,定义了defalut_response方法返回其中内容,代码如下。
如果handle_request方法中调度的过程出现问题,则直接raise将错误抛出。
至此,一个最简单的web服务就编写完成了。
回顾Flask,Flask可以支持HTML、CSS、JavaScript等静态文件,利用模板语言,可以构建出简单但美观的Web应用,我们让TopWebF也支持这一功能,最终实现图中的网站,完美兼容静态文件。
Flask使用了jinja2作为其html模板引擎,ToyWebF同样使用jinja2,jinja2其实实现一种简单的DSL(领域内语言),让我们可以在HTML中通过特殊的语法改变HTML的结构,该项目非常值得研究学习。
首先 pip install jinja2 ,然后就可以使用它了,在ToyWebF项目目录中创建templates目录,以该目录作为默认的HTML文件根目录,代码如下。
首先利用jinja2的FileSystemLoader类将file system中的某个文件夹作为loader,然后初始化Environment。
在使用的过程中(即调用template方法),通过get_template方法获得具体的某个模板并通过render方法将对应的内容传递给模板中的变量。
这里我们不写前端代码,直接去互联网中下载模板,这里下载了Bootstrap提供的免费模板,可以自行去 https://startbootstrap.com/themes/freelancer/ 下载,下载完后,你会获得index.html以及对应的css、jss、img等文件,将index.html移动到ToyWebF/templates中并简单修改了一下,添加一些变量。
然后在app.py文件中为index.html定义路由以及需要的参数。
至此html文件的支持就完成了,但此时的html无法正常载入css和js,导致页面布局非常丑陋且交互无法使用。
接着就让ToyWebF支持css、js,首先在ToyWebF目录下创建static文件夹用于存放css、js或img等静态文件,随后直接将前面下载的模板,其中的静态文件复制到static中则可。
通过whitenoise第三方库,可以通过简单的几行代码让web框架支持css和js,不需要依赖nginx等服务,首先 pip install whitenoise ,随后修改API类的 __init__ 方法,代码如下。
其实就是通过WhiteNoise将self.wsgi_app方法包裹起来,在调用API的 __call__ 方法时,直接调用self.whitenoise。
此时,如果请求web服务获取css、js等静态资源,WhiteNoise会获取其内容并返回给client,它在背后会匹配静态资源在系统中对应的文件并将其读取返回。
至此,一开始的网页效果就实现好了。
web服务如果出现500时,默认会返回 internal server error ,这显得比较丑,为了让框架使用者可以自定义500时返回的错误,需要添加一些代码。
首先API初始化时,初始self.exception_handler对象并定义对应的方法添加自定义的错误
在handler_request方法进行请求调度时,调度的方法执行逻辑时报500,此时不再默认将错误抛出,而是先判断是否有自定义错误处理。
在app.py中,自定义错误返回方法,如下。
custom_exception_handler方法只返回自定义的一段话,你完全可以替换成美观的template。
我们可以实验性定义一个路由来看效果。
Web服务的中间件也可以理解成钩子,即在请求前可以对请求做一些处理或者返回Response前对Response做一下处理。
为了支持中间件,在TopWebF目录下创建middleware.py文件,在编写代码前,思考一下如何实现?
回顾一下现在请求的调度逻辑。
1.通过routes装饰器关联路由和方法 2.通过API.whitenoise处理 3.如果是请求API接口,那么会将参数传递给API.wsgi_app 4.API.wsgi_app最终会调用API.handle_request方法获取路由对应的方法并调用该方法执行相应的逻辑
如果希望在request前以及response后做相应的操作,那么其实就需要让逻辑在API.handle_request前后执行,看一下代码。
其中add方法会实例化Middleware对象,该对象会将当前的API类实例包裹起来。
Middleware.handle_request方法其实就是在self.app.handle_request前调用self.process_request方法处理request前的数据以及调用self.process_response处理response后的数据,而核心的调度逻辑,依旧交由API.handle_request方法进行处理。
这里的代码可能会让人感到疑惑, __call__ 方法和handle_request方法中都有self.app.handle_request(request),但其调用对象似乎不同?这个问题暂时放一下,先继续完善代码,然后再回来解释。
接着在api.py中为API创建middleware属性以及添加新中间件的方法。
随后,在app.py中,自定义一个简单的中间件,然后调用add_middleware方法将其添加。
定义好中间件后,在请求调度时,就需要使用中间件,为了兼容静态文件的情况,需要对css、js、ing文件的请求路径做一下兼容,在其路径中加上/static前缀
紧接着,修改API的 __call__ ,兼容中间件和静态文件,代码如下。
至此,中间件的逻辑就完成了。
但代码中依旧有疑惑,Middleware类中的 __call__ 方法和handle_request方法其调用的self.app到底是谁?
为了方便理解,这里一步步拆解。
如果没有添加新的中间件,那么请求的调度逻辑如下。
在没有添加中间件的情况下,self.app其实就是API本身,所以 middleware.__call__ 中的self.app.handle_request就是调用API.handle_request。
如果添加了新的中间件,如上述代码中添加了名为SimpleCustomMiddleware的中间件,此时的请求调度逻辑如下。
因为注册中间件时,Middleware.add方法替换了原始Middleware实例中的app对象,将其替换成了SimpleCustomMiddleware,而SimpleCustomMiddleware也有app对象,SimpleCustomMiddleware中的app对象,才是API类实例。
在请求调度的过程中,就会触发Middleware类的handle_request方法,该方法就会执行中间件相应的逻辑去处理request和response中的数据。
当然,你可以通过Middleware.add方法添加多个中间件,这就会构成栈式调用的效果,代码如下。
启动web服务后,其执行效果如下。
⑶ python 怎么搭建简单的web服务器
利用Python自带的包可以建立简单的web服务器。在DOS里cd到准备做服务器根目录的路径下,输入命令:
python -m Web服务器模块 [端口号,默认8000]
例如:
python -m SimpleHTTPServer 8080
然后就可以在浏览器中输入
h ttp://loca lhost:端口号/路径
来访问服务器资源。
例如:
h ttp://local host:808 0/index.h tm(当然index.htm文件得自己创建)
其他机器也可以通过服务器的IP地址来访问。
这里的“Web服务器模块”有如下三种:
BaseHTTPServer: 提供基本的Web服务和处理器类,分别是HTTPServer和BaseHTTPRequestHandler。
SimpleHTTPServer: 包含执行GET和HEAD请求的SimpleHTTPRequestHandler类。
CGIHTTPServer: 包含处理POST请求和执行CGIHTTPRequestHandler类。
⑷ 如何把py文件放在网页中
如何把py文件放在网页中:
可以为发出请求的浏览器提供静态文档的程序。平时我们浏览网络新闻数据的时候,每天的新闻数据都会发生变化,那访问的这个页面就是动态的,而开发的是静态的页面的数据不会发生变化。
2、如何搭建Python自带的静态Web服务器
搭建Python自带的静态Web服务器使用 python3 -m http.server 端口号, -m选项说明:
-m表示运行包里面的模块,执行这个命令的时候,需要进入你自己指定静态文件的目录,然后通过浏览器就能访问对应的 html文件了,这样一个静态的web服务器就搭建好了。
3、访问搭建的静态Web服务器
通过浏览器访问搭建的静态Web服务器,
4、查看浏览器和搭建的静态Web服务器的通信过程
查看http的通信过程,
搭建Python自带静态Web服务器总结:静态Web服务器是为发出请求的浏览器提供静态文档的程序,搭建Python自带的Web服务器使用python3 –m http.server 端口号 这个命令即可,端口号不指定默认是8000
⑸ windows下python怎么搭建web服务器
python创建一历搜哪个最简漏扒单httpwebserver服务器肢码的方法:stHandlerHandler==BaseHTTPServer.HTTPServerProtocol=HTTP/1.0ifsys.argv[1:]:port=int(sys.argv[1])else:port=8000server_address=(飗.0.0.1',port)Handler.protocol_version=Protocolhttpd=Server(server_address,Handler)print(ServingHTTP)httpd.serve_forever()
⑹ 如何用python做web开发 django环境配置
下载
python-2.7.2.msi
Django-1.3.1.tar.gz
Django暂时只支持python
2.4
~
2.7,
在Django-1.3.1\docs\intro\install.txt中有说明:
Being
a
Python
Web
framework,
Django
requires
Python.
It
works
with
any
Python
version
from
2.4
to
2.7
(e
to
backwards
incompatibilities
in
Python
3.0,
Django
does
not
currently
work
with
Python
3.0;
安装python-2.7.2,并添加环境变量
D:\Python27;D:\Python27\Scripts;
命令行进入Django-1.3.1目录,
安装django
python
setup.py
install
Django提供了tutorial
Django-1.3.1\docs\intro
新建站点
E:\python>django-admin.py
startproject
mysite
启动django自带的web服务器
E:\python>cd
mysite
E:\python\mysite>manage.py
runserver
Validating
models...
0
errors
found
Django
version
1.3.1,
using
settings
'mysite.settings'
Development
server
is
running
at
http://127.0.0.1:8000/
Quit
the
server
with
CTRL-BREAK.
在浏览器中输入
http://127.0.0.1:8000/
浏览页面
ps:
在windows7中按上述步骤配置好后,出现下列情况
D:\work\python>django-admin.py
startproject
mysite
Usage:
django-admin.py
subcommand
[options]
[args]
...
很显然django-admin.py不参识别startproject命令,其它命令也不能识别。不过,另一种方式却可以
D:\Python27\Scripts>python
django-admin.py
startproject
mysite
这说明django-admin.py
后面的参数不能传递进去,可以通过修改注册表实现。
输入regedit,
进入
HKEY_CLASSES_ROOT\py_auto_file\shell\open\command
,
"C:\Python26\python.exe"
"%1"
change
it
to
"C:\Python26\python.exe"
"%1"
%*
成功解决了