轻松实现服务器搭建!web.py指南 (web.py搭建服务器)

作为时代的产物和互联网的重要组成部分,服务器承载着越来越多的应用和数据。然而,对于许多初学者和非技术背景的人来说,服务器搭建似乎是门高深的学问,很难上手。不过,本文将为您介绍一个简单易用的框架——web.py,它可以帮助您轻松实现服务器搭建,无需太多的编程知识和繁琐的操作。本文将从以下几个方面来介绍web.py。

一、web.py简介

web.py是一个轻量级的PythonWeb框架,由Aaron Swartz创建,它基于Python语言开发,专注于处理HTTP请求和响应。该框架具有以下特点:

1.轻巧:web.py的核心代码只有几百行,这使得它的学习和使用非常容易。

2.易用:web.py提供了非常简单的API,它可以让开发人员快速实现各种功能。

3.灵活:web.py支持各种HTTP请求和响应,而且可以与其他Python库很好地兼容。

二、web.py的安装

在安装web.py之前,需要确保您的计算机已经安装了Python环境。如果您尚未安装Python,请先从官方网站下载并安装。

安装web.py的方法有多种,其中最简单的是使用Python的包管理器pip。运行以下命令即可安装web.py:

pip install web

如果您不想使用pip,也可以从web.py的官方网站下载源代码并手动安装。

三、web.py的基本使用

在学习web.py之前,需要先了解一些Web开发方面的基础知识,如HTTP协议、URL请求和响应等。在下面的示例中,我们将创建一个简单的Web应用程序,该应用程序处理浏览器的多个请求,并返回相应的响应。

1.创建应用程序

我们需要导入web.py的库。在编写Python代码时,使用import语句即可实现此操作。

import web

然后,我们需要创建一个应用程序。在web.py中,使用application函数创建应用程序。该函数将处理所有的HTTP请求和响应,并调用我们自己编写的代码来响应请求。

urls=(‘/(.*)’,’hello’)

app=web.application(urls,globals())

2.处理HTTP请求

现在,我们需要实现代码来处理HTTP请求。在web.py中,我们可以通过定义一个类来实现这一点。下面是一个简单的示例,该示例提供了不同类型的HTTP请求的处理方法。

class hello:

def GET(self, name):

return ‘Hello ‘ + name

def POST(self, name):

return ‘Hello ‘ + name

def PUT(self, name):

return ‘Hello ‘ + name

def DELETE(self, name):

return ‘Goodbye ‘ + name

在这个类中,我们定义了四个方法来处理不同的HTTP请求。这些方法将分别处理GET、POST、PUT和DELETE请求,并返回相应的响应消息。

3.运行应用程序

现在,我们已经创建了一个应用程序并实现了处理HTTP请求的代码。最后一步是运行应用程序。在web.py中,我们可以使用run函数来启动应用程序。

if __name__ == ‘__mn__’:

app.run()

如果您希望在特定的IP地址和端口上运行应用程序,请在run函数中指定。例如:

app.run(host=’127.0.0.1′, port=5000)

现在,我们已经完成了一个简单的Web应用程序的创建,并启动了应用程序。您可以在浏览器中访问应用程序的URL,例如”http://127.0.0.1:5000″,查看响应结果。

四、web.py的高级使用

虽然web.py非常易用和灵活,但它提供了丰富的高级功能,帮助您创建更复杂和功能强大的Web应用程序。以下是一些最常用的高级特性:

1.模板引擎

web.py内置了模板引擎,可以让您更轻松地创建动态Web页面。这使得您可以将数据传递到模板中,并使用模板来生成HTML响应。

以下是一个使用模板的示例:

import web

render = web.template.render(‘templates/’)

class hello:

def GET(self, name):

return render.hello(name)

在这个示例中,我们在应用程序中使用了一个模板文件。这个模板文件称为”hello.html”,它包含了一些Python代码,用于将数据插入到HTML中。

2.数据库集成

Web应用程序通常需要与数据库交互,以便存储和检索数据。web.py可以与各种关系型数据库和非关系型数据库集成,如MySQL、PostgreSQL和MongoDB等。

以下是一个使用MySQL数据库的示例:

import web

import MySQLdb

db = MySQLdb.connect(user=’root’, db=’test’)

class hello:

def GET(self, id):

c = db.cursor()

c.execute(“SELECT * FROM users WHERE id=%s”,(id,))

result = c.fetchone()

return result[1] if result else ‘User not found’

在这个示例中,我们使用MySQLdb库创建了一个MySQL数据库连接,并查询了一个名为”users”的数据表。我们还通过占位符安全地使用了用户提供的输入。

3.会话管理

应用程序需要保持用户会话以便在多个页面之间共享信息。web.py自带的会话管理器可以让您轻松地管理用户会话。以下是一个使用会话管理的示例:

import web

app = web.application()

if web.config.get(‘_session’) is None:

session = web.session.Session(app, web.session.DiskStore(‘sessions’), {‘count’: 0})

web.config._session = session

else:

session = web.config._session

class hello:

def GET(self):

session.count += 1

return ‘Hello %s’ % session.count

在这个示例中,我们使用DiskStore存储用户会话。当用户访问网站时,我们在会话中的计数器增加并返回响应。

五、

在本文中,我们介绍了web.py框架的基本知识和使用方法。web.py是一个轻量级且易于使用的Web框架,它提供了基本的Web开发功能,如处理HTTP请求和响应。此外,web.py还提供了许多高级功能,如模板引擎、数据库集成和会话管理,使得创建更复杂和功能强大的Web应用程序变得更加容易。

只需几行Python代码,您就可以拥有一个简单但功能强大的Web应用程序。无论您是一个Python新手还是有经验的程序员,web.py都是一款必备的Web框架。希望这篇文章可以帮助您更好地了解web.py,学习它的用法,并在未来的Web开发中取得成功。

相关问题拓展阅读:

web.py的开发

web.py 内置了web服务器。可以按照 tutorial 学习如何写一个Web应用。 写完后,将你的代码放到 code.py 并如下面的方法来启动服务器:

python code.py

打开你拆弯的浏览器输入 查看页面。 若要制定另外的端口,使用 python code.py 1234。 现在所运行 web.py 程序的web服务器是挺不错的, 但绝大多数网站还是需要更加专业一些的web服务器。web.py 实现了 WSGI 并能在任何兼容它的服务器上运行。 WSGI 是一个web服务器与应用程序之间的通用API, 就如Java 的 Servlet 接口。 你需要安装 flup (download here) 使web.py 支持with CGI, FastCGI 或 SCGI, flup提供了这些API的WSGI接口。

对于所有的CGI变量, 添加以下到你的 code.py:

#!/usr/bin/env python

并运行 chmod +x code.py 添加可执行属性。

LightTPD 在产品中通过FastCGI结合lighttpd是web.py使用的一种推荐方法。 reddit.com 通过该方法来处理百万次的点击。

lighttpd config设置参考如下:

server.modules = (mod_fastcgi, mod_rewrite)

server.document-root = /path/to/root/

fastcgi.server = ( /code.py =>

(( socket => /tmp/fastcgi.socket,

bin-path => /path/to/root/code.py,

max-procs => 1

))

)

url.rewrite-once = (

^/favicon.ico$ => /static/favicon.ico,

^/static/(.*)$ => /static/$1,

^/(.*)$ => /code.py/$1

)

在某些版本的lighttpd中, 需旅宽闷要保证fastcgi.server选项下的check-local属性设置为false, 特别是当你的 code.py 不在文档根目录下。

如果你得到错误显示不能够导入flup, 请在命令行下输入 easy_install flup 来安装。

从修订版本 145开始, 如果你的代码使用了重定向,还需要在fastcgi选项下设置bin-environment变量。 如果巧闹你的代码重定向到

而在url栏中你会看到

, 你可以通过设置这个环境变量来阻止。 这样你的fastcgi.server设置将会如下:

fastcgi.server = ( /code.py =>

((

socket => /tmp/fastcgi.socket,

bin-path => /path/to/root/code.py,

max-procs => 1,

bin-environment => (

REAL_SCRIPT_NAME =>

),

check-local => disable

))

)

Apache

使用 CGI

添加以下到 httpd.conf 或 apache2.conf。

Alias /foo/static/ /path/to/static

ScriptAlias /foo/ /path/to/code.py

.. 使用 CGI .htaccess

CGI很容易配置, 但不适合高性能网站。 添加以下到你的 .htaccess:

Options +ExecCGI

AddHandler cgi-script .py

将你的浏览器指向

。 不要忘记最后的斜杠,否则你将会看到 not found 消息 (因为在 urls 列表中你输入的没有被匹配到). 为了让其运行的时候不需要添加 code.py, 启用mod_rewrite 法则 (查看如下)。

注意: web.py 的实现破坏了 cgitb 模块,因为它截取了 stdout。 可以通过以下的方法来解决该问题:

import cgitb; cgitb.enable()

import sys

# … import web etc here…

def cgidebugerror():

_wrappedstdout = sys.stdout

sys.stdout = web._oldstdout

cgitb.handler()

sys.stdout = _wrappedstdout

web.internalerror = cgidebugerror FastCGI很容易配置,运行方式如同mod_python。

添加以下到 .htaccess:

SetHandler fastcgi-script

不幸的是, 不像lighttpd, Apache不能够暗示你的web.py脚本以FastCGI 服务器的形式工作,因此你需要明确的告诉web.py。 添加以下到 code.py的 if __name__ == __main__: 行前:

web.wsgi.runwsgi = lambda func, addr=None: web.wsgi.runfcgi(func, addr)

将你的浏览器指向

。 不要忘记最后的斜杠,否则你将会看到 not found 消息 (因为在 urls 列表中你输入的没有被匹配到). 为了让其运行的时候不需要添加 code.py, 启用mod_rewrite 法则 (查看如下)。

Walter 还有一些额外建议.

下载 mod_scgi 代码 windows apache 用户: 编辑 httpd.conf:

LoadModule scgi_module Modules/mod_scgi.so

SCGIMount / 127.0.0.1:8080

重启apache,并在命令行中如下方式启动code.py:

python code.py 127.0.0.1:8080 scgi

打开你的浏览器,访问127.0.0.1 It’s ok!

.. 使用 mod_python

mod_python 运行方式如同FastCGI, 但不是那么方便配置。

对于 Python 2.5 按照如下:

cd /usr/lib/python2.5/wsgiref

# or in windows: cd /python2.5/lib/wsgiref

wget -O modpython_gateway.py

# or fetch the file from that address using your browser

对于 Python

SetHandler wsgi-script

Options ExecCGI FollowSymLinks

如果在apache的 error.log 文件中出现 ImportError: No module named web, 在导入web之前,你可能需要在code.py中尝试设置绝对路径:

import sys, os

abspath = os.path.dirname(__file__)

sys.path.append(abspath)

os.chdir(abspath)

import web

同时, 你可能需要查看 WSGI应用的常见问题的 Application Working Directory 部分。

最终应该可以访问

mod_rewrite 法则,Apache

如果希望 web.py 能够通过 ‘

访问,代替使用 ‘

, 添加以下法则到 .htaccess 文件:

RewriteEngine on

RewriteBase /

RewriteCond %{REQUEST_URI} !^/icons

RewriteCond %{REQUEST_URI} !^/favicon.ico$

RewriteCond %{REQUEST_URI} !^(/.*)+code.py/

RewriteRule ^(.*)$ code.py/$1

python web 怎么部署

学过PHP的都了解,php的正式环境部署非常简单,改几个文件就OK,用FastCgi方式也是分分钟的事情。相比起来,Python在web应用上的部署就繁杂的多,主要是工具繁多,主流服务器支持不足,在了解Python的生产环境部署方式之前,先明确一些概念!很重要!

CGI:

CGI即通用网关接口(Common Gateway Interface),是外部应用程序(CGI程序)与Web服务器之间的接口标准,是在CGI程序和Web服务器之间传递信息的规程。CGI规范允许Web服务器执行外部程序,并将它们的输出发送给Web浏览器,CGI将Web的一组简单的静态超媒体文档变成一个完整的新的交互式媒体。通俗的讲CGI就像是一座桥,把网页和WEB服务器中的执行程序连接起来,它把HTML接收的指令传递给服务器的执行程序,再把服务器执行程序坦卜悔的结果返还给HTML页。CGI 的跨平台性能极佳,几乎可以在任何操作系统上实现。

CGI方式在遇到连接请求让正(用户请求)先要创建cgi的子进程,激活一个CGI进程,然后处理请求,处理完后结束这个子进程。这就是fork-and-execute模式。所以用cgi方式的服务器有多少连接请求就会有多少cgi子进程,子进程反复加载是cgi性能低下的主要原因。当用户请求数量非常多时,会大量挤占系统的资源如内存,CPU时间等,造成效能低下。

CGI脚本工作流程:

浏览器通过HTML表单或超链接请求指向一个CGI应用程序的URL。

服务器执行务器收发到请求。所指定的CGI应用程序。

CGI应用程序执行所需要的操作,通常是基于浏览者输入的内容。

CGI应用程序把结果格式化为网络服务器和浏览器能够理解的文档(通常是HTML网页)。

网络服务器把结果返回到浏览器中。

python有cgi模块可支持原生cgi程序

FastCGI:

FastCGI是一个可伸缩地、高速地在HTTP server和动态脚本语言间通信的接口。多数流行的HTTP server都支持FastCGI,包括Apache、Nginx和lighttpd等,同时,FastCGI也被许多脚本语言所支持,其中就有Python。FastCGI是从CGI发展改进而来的。传统CGI接口方式的主要缺点是性能很差,因为每次HTTP服务器遇到动态程序时都需要重新启动脚本解析器来执行解析,然后结果被返回给HTTP服务器。这在处理高并发访问时,几乎是不可用的。FastCGI像是一个常驻(long-live)型的CGI,它可以一直执行着,只要激活后,不会每次都要花费时间去fork一次(这是CGI最为人诟病的fork-and-execute 模式)。CGI 就是所谓的短生存期应用程序,FastCGI 就是所谓的长生存期应用程序。由于 FastCGI 程序并不需要不断的产生新进程,可以大大降低服务器的压力并且产生较高的应用效率。它的速度效率最少要比CGI 技术提高 5 倍以上。它还支持分布式的运算, 即 FastCGI 程序可以在网站服务器以外的主机上执行并且接受来自其它网站服务器来的请求。

FastCGI是语言无关的、可伸缩架构的CGI开放扩展,其主要行为是将CGI解释器进程保持在内存中并因此获得较高的性能。众所周知,CGI解释器的反复加载是CGI性能低下的主要原因,如果CGI解释器保持在内存中并接受FastCGI进程管理器调度,则可以提供良好的性能、伸缩性、Fail-Over特性等等。FastCGI接口方弊陪式采用C/S结构,可以将HTTP服务器和脚本解析服务器分开,同时在脚本解析服务器上启动一个或者多个脚本解析守护进程。当HTTP服务器每次遇到动态程序时,可以将其直接交付给FastCGI进程来执行,然后将得到的结果返回给浏览器。这种方式可以让HTTP服务器专一地处理静态请求或者将动态脚本服务器的结果返回给客户端,这在很大程度上提高了整个应用系统的性能。

FastCGI的工作流程:

Web Server启动时载入FastCGI进程管理器(PHP-CGI或者PHP-FPM或者spawn-cgi)

FastCGI进程管理器自身初始化,启动多个CGI解释器进程(可见多个php-cgi)并等待来自Web Server的连接。

当客户端请求到达Web Server时,FastCGI进程管理器选择并连接到一个CGI解释器。Web server将CGI环境变量和标准输入发送到FastCGI子进程php-cgi。

FastCGI子进程完成处理后将标准输出和错误信息从同一连接返回Web Server。当FastCGI子进程关闭连接时,请求便告处理完成。FastCGI子进程接着等待并处理来自FastCGI进程管理器(运行在Web Server中)的下一个连接。 在CGI模式中,php-cgi在此便退出。

FastCGI 的特点:

打破传统页面处理技术。传统的页面处理技术,程序必须与 Web 服务器或 Application 服务器处于同一台服务器中。这种历史已经早N年被FastCGI技术所打破,FastCGI技术的应用程序可以被安装在服务器群中的任何一台服务器,而通过 TCP/IP 协议与 Web 服务器通讯,这样做既适合开发大型分布式 Web 群,也适合高效数据库控制。

明确的请求模式。CGI 技术没有一个明确的角色,在 FastCGI 程序中,程序被赋予明确的角色(响应器角色、认证器角色、过滤器角色)。

WSGI:

Python Web服务器网关接口(Python Web Server Gateway Interface,缩写为WSGI)是为Python语言定义的Web服务器和Web应用程序或框架之间的一种简单而通用的接口。自从WSGI被开发出来以后,许多其它语言中也出现了类似接口。WSGI是作为Web服务器与Web应用程序或应用框架之间的一种低级别的接口,以提升可移植Web应用开发的共同点。WSGI是基于现存的CGI标准而设计的。

WSGI区分为两个部份:一为“服务器”或“网关”,另一为“应用程序”或“应用框架”。在处理一个WSGI请求时,服务器会为应用程序提供环境上下文及一个回调函数(Callback Function)。当应用程序完成处理请求后,透过先前的回调函数,将结果回传给服务器。所谓的 WSGI 中间件同时实现了API的两方,因此可以在WSGI服务和WSGI应用之间起调解作用:从WSGI服务器的角度来说,中间件扮演应用程序,而从应用程序的角度来说,中间件扮演服务器。“中间件”组件可以执行以下功能:

重写环境变量后,根据目标URL,将请求消息路由到不同的应用对象。

允许在一个进程中同时运行多个应用程序或应用框架。

负载均衡和远程处理,通过在网络上转发请求和响应消息。

进行内容后处理,例如应用XSLT样式表。

以前,如何选择合适的Web应用程序框架成为困扰Python初学者的一个问题,这是因为,一般而言,Web应用框架的选择将限制可用的Web服务器的选择,反之亦然。那时的Python应用程序通常是为CGI,FastCGI,mod_python中的一个而设计,甚至是为特定Web服务器的自定义的API接口而设计的。WSGI没有官方的实现, 因为WSGI更像一个协议。只要遵照这些协议,WSGI应用(Application)都可以在任何服务器(Server)上运行, 反之亦然。WSGI就是Python的CGI包装,相对于Fastcgi是PHP的CGI包装。

WSGI将 web 组件分为三类: web服务器,web中间件,web应用程序, wsgi基本处理模式为 : WSGI Server -> (WSGI Middleware)* -> WSGI Application 。

uwsgi:

uwsgi协议是一个uWSGI服务器自有的协议,它用于定义传输信息的类型(type of information),每一个uwsgi packet前4byte为传输信息类型描述,它与WSGI相比是两样东西。据称其效率是fcgi的10倍。具体的协议内容请参考:the uwsgi protocol

以上四者都可以理解为协议!协议!协议!实现了这样的协议,就可以实现Web服务器与Web应用程序相关联的web服务!

uWSGI:

uWSGI项目旨在为部署分布式集群的网络应用开发一套完整的解决方案。uWSGI主要面向web及其标准服务,已经成功的应用于多种不同的语言。由于uWSGI的可扩展架构,它能够被无限制的扩展用来支持更多的平台和语言。目前,你可以使用C,C++和Objective-C来编写插件。项目名称中的“WSGI”是为了向同名的Python Web标准表示感谢,因为WSGI为该项目开发了之一个插件。uWSGI是一个Web服务器,它实现了WSGI协议、uwsgi、http等协议。uWSGI,既不用wsgi协议也不用FastCGI协议,而是自创了上文说将的uwsgi协议。

uWSGI的主要特点如下:

超快的性能。

低内存占用(实测为apache2的mod_wsgi的一半左右)。

多app管理。

详尽的日志功能(可以用来分析app性能和瓶颈)。

高度可定制(内存大小限制,服务一定次数后重启等)。

Gunicorn:

和uWSGi类似的工具,从rails的部署工具(Unicorn)移植过来的。但是它使用的协议是前文所讲的WSGI,这是python2.5时定义的官方标准(PEP 333 ),根红苗正,而且部署比较简单,详细的使用教程请点击这里。Gunicorn采用prefork模式,Gunicorn 服务器与各种 Web 框架兼容,只需非常简单的执行,轻量级的资源消耗,以及相当迅速。它的特点是与 Django 结合紧密,部署特别方便。 缺点也很多,不支持 HTTP 1.1,并发访问性能不高,与 uWSGI,Gevent 等有一定的性能差距。

1. Gunicorn设计

Gunicorn 是一个 master 进程,spawn 出数个工作进程的 web 服务器。master 进程控制工作进程的产生与消亡,工作进程只需要接受请求并且处理。这样分离的方式使得 reload 代码非常方便,也很容易增加或减少工作进程。 工作进程这块作者给了很大的扩展余地,它可以支持不同的IO方式,如 Gevent,Sync 同步进程,Asyc 异步进程,Eventlet 等等。master 跟 worker 进程完全分离,使得 Gunicorn 实质上就是一个控制进程的服务。

2. Gunicorn源码结构

从 Application.run() 开始,首先初始化配置,从文件读取,终端读取等等方式完成 configurate。然后启动 Arbiter,Arbiter 是实质上的 master 进程的核心,它首先从配置类中读取并设置,然后初始化信号处理函数,建立 socket。然后就是开始 spawn 工作进程,根据配置的工作进程数进行 spawn。然后就进入了轮询状态,收到信号,处理信号然后继续。这里唤醒进程的方式是建立一个 PIPE,通过信号处理函数往 pipe 里 write,然后 master 从 select.select() 中唤醒。

工作进程在 spawn 后,开始初始化,然后同样对信号进行处理,并且开始轮询,处理 HTTP 请求,调用 WSGI 的应用端,得到 resopnse 返回。然后继续。

Sync 同步进程的好处在于每个 request 都是分离的,每个 request 失败都不会影响其他 request,但这样导致了性能上的瓶颈。

Tornado:

Tornado即使一款python 的开发框架,也是一个异步非阻塞的http服务器,它本身的数据产出实现没有遵从上文所说的一些通用协议,因为自身就是web服务器,所以动态请求就直接通过内部的机制,输出成用户所请求的动态内容。如果把它作为一个单独服务器,想用它来配合其他的框架如Flask来部署,则需要采用WSGI协议,Tornado内置了该协议,tornado.wsgi.WSGIContainer。

wsgiref:

Python自带的实现了WSGI协议的的wsgi server。wsgi server可以理解为一个符合wsgi规范的web server,接收request请求,封装一系列环境变量,按照wsgi规范调用注册的wsgi app,最后将response返回给客户端。Django的自带服务器就是它了。

以上都可以理解为实现!实现!实现!实现了协议的工具!

注:mod_wsgi(apache的模块)其实也是实现了wsgi协议的一个模块,现在几乎不废弃了,所以也不多说了,感兴趣的自己查一下吧。

所以如果你采用Django框架开发了应用之后,想部署到生产环境,肯定不能用Django自带的,可以用使用uwsgi协议的uWSGI服务器,也可以采用实现了WSGI协议的gunicorn或者Tornado,亦可以用FastCGI、CGI模式的Nginx、lighttpd、apache服务器。其他框架亦如此!明白了这些概念在部署的时候就可以做到心中有数,各种工具之间的搭配也就“知其然,并知其所以然”了。

在我们组的项目中有两种框架Django和Tornado,生产环境也用到了两种部署方式。uWSGI和Gunicorn:

Django项目用Nginx+uWSGI方式部署,Tornado项目用Nginx+Gunicorn方式部署:

Nginx都作为负载均衡以及静态内容转发。Tornado项目用supervisord来管理Gunicorn,用Gunicorn管理Tornado。众所周知,由于Python的GIL存在,所以Python的并发都采用多进程模式,所以我们部署的方式是一个核心两个进程。

web.py搭建服务器的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于web.py搭建服务器,轻松实现服务器搭建!web.py指南,web.py的开发,python web 怎么部署的信息别忘了在本站进行查找喔。


数据运维技术 » 轻松实现服务器搭建!web.py指南 (web.py搭建服务器)