任何网站最重要的部分就是它的URL结构。你的URL并不仅仅只是访问者所能看到并且能发给朋友的。它还规定了你网站运行的心智模型。在一些类似del.icio.us的流行网站 , URL甚至是UI的一部分。 web.py使这类强大的URL成为可能。
在介绍URL处理之前,先来认识什么是URL?
那URL是什么?
基本URL包含模式(或称协议)、服务器名称(或IP地址)、路径和文件名,如“协议://授权/路径?查询”。完整的、带有授权部分的普通统一资源标志符语法看上去如下:
协议://用户名:密码@子域名.域名.顶级域名:端口号/目录/文件名.文件后缀?参数=值#标志。
-
模式/协议(scheme):它告诉浏览器如何处理将要打开的文件。最常用的模式是超文本传输协议(Hypertext Transfer Protocol,缩写为HTTP),这个协议可以用来访问网络。
其他协议:
http——超文本传输协议资源
https——用安全套接字层传送的超文本传输协议
ftp——文件传输协议
mailto——电子邮件地址
ldap——轻型目录访问协议搜索
file——当地电脑或网上分享的文件
news——Usenet新闻组
gopher——Gopher协议
telnet——Telnet协议 -
文件所在的服务器的名称或IP地址,后面是到达这个文件的路径和文件本身的名称。服务器的名称或IP地址后面有时还跟一个冒号和一个端口号。它也可以包含接触服务器必须的用户名称和密码。路径部分包含等级结构的路径定义,一般来说不同部分之间以斜线(/)分隔。询问部分一般用来传送对服务器上的数据库进行动态询问时所需要的参数.
有时候,URL以斜杠“/”结尾,而没有给出文件名,在这种情况下,URL引用路径中最后一个目录中的默认文件(通常对应于主页),这个文件常常被称为index.html
或default.html
。
URL的一般语法格式为(带方括号[]的为可选项):
protocol : // hostname[:port] / path / [;parameters][?query]#fragment
参数 | 含义 |
---|---|
hostname(主机名) | 是指存放资源的服务器的域名系统(DNS) 主机名或 IP 地址。有时,在主机名前也可以包含连接到服务器所需的用户名和密码(格式:username:password@hostname)。 |
port(端口号) | 整数,可选,省略时使用方案的默认端口,各种传输协议都有默认的端口号,如http的默认端口为80。如果输入时省略,则使用默认端口号。有时候出于安全或其他考虑,可以在服务器上对端口进行重定义,即采用非标准端口号,此时,URL中就不能省略端口号这一项。 |
path(路径) | 由零或多个“/”符号隔开的字符串,一般用来表示主机上的一个目录或文件地址。 |
parameters(参数) | 这是用于指定特殊参数的可选项。 |
query(查询) | 可选,用于给动态网页(如使用CGI、ISAPI、PHP/JSP/ASP/ASP、NET等技术制作的网页)传递参数,可有多个参数,用“&”符号隔开,每个参数的名和值用“=”符号隔开。 |
fragment(信息片断) | 字符串,用于指定网络资源中的片断。例如一个网页中有多个名词解释,可使用fragment直接定位到某一名词解释。 |
在开始你的web程序之前,打开一个文本文件(文件名为test .py)输入:
import web #导入web.py模块
现在我们需要把我们的URL结构告诉web。让我从下面这个简单的例子开始:
urls = (
'/', 'index'
) #这行表示我们要URL/(首页)被一个叫index的类处理。只要浏览器里输入对应URL,就会把/内容传送到web应用程序,自然就调用index类来处理。
第一部分是匹配URL的正则表达式,像/、/help/faq、/item/(\d+)等(\d+将匹配数字)。圆括号表示捕捉对应的数据以便后面使用。第二部分是接受请求的类名称,像index、view、welcomes.hello (welcomes模块的hello类), 或者get_\1。\1 会被正则表达式捕捉到的内容替换,剩下来捕捉的的内容将被传递到你的函数中去。
然后我们需要创建一个列举这些url的application:
app = web.application(urls, globals())
这会告诉web.py去创建一个基于我们刚提交的URL列表的application。这个application会在这个文件的全局命名空间中查找对应类来处理。
然后我们需要来写index类。虽然大多数人只会看看,并不会注意你的浏览器在使用用于与万维网通信的HTTP语言。具体的细节并不重要,但是要理解web访问者请求web服务器去根据URL(像/、/foo?f=1)执行一个合适的函数(像GET、POST)的基本思想。
GET是我们都熟悉的。它用于请求网页文本。当你在浏览器输入harvard.edu,它会直接访问Harvard的web服务器,去GET /。
第二个最有名的是POST,它经常被用在提交form,比如请求买什么东西。每当提交一个去做什么事情(像使用信用卡处理一笔交易)的请求时,你可以使用POST。
这是关键,因为GET的URL可以被搜索引擎索引,并通过搜索引擎访问。虽然大部分页面你希望被索引,但是少数类似订单处理的页面你是不希望被索引的 (想象一下Google尝试去购买你网站上的所有东西)。
在我们的web程序的代码中,我们将这两个方法明确区分:
class index:
def GET(self):
return "Hello, world!"
当有人用GET请求时,这个GET函数随时会被web程序调用。
好了,然后我们只需要最后一句就写完了。这行会告诉web程序开始提供web页面:
if __name__ = "__main__":
app.run() #这会告诉web.py为我们启动上面我们写的应用
这就是你需要编写的一个完整的web应用。 为了更方便的使用,完整代码应该像下面这样:
import web
urls = (
'/', 'index'
)
class index:
def GET(self):
return "Hello, world!"
if __name__ == "__main__":
app = web.application(urls, globals())
app.run()
URL映射在web,py中的三种方式:
URL完全匹配:
格式: /index,在浏览器输入http://localhost:8080/index,那么会完全匹配“/index”这样的页面。
URL模糊匹配:
格式:/index\d+,这里意思是以"/index"开头,后面跟着一个数字或者多个数字这样的URL进行匹配,例如,浏览器输入:http://localhost:8080/index123 或者http://localhost:8080/index4,这种模糊匹配,一般是需要用到正则表达式。
URL带组匹配:
格式 /index(\d+)这个带组匹配和上面模糊匹配好像,就因为在正则表达式外部添加一个括号,就表示匹配一组。
启动服务
如果你在命令行下面,请输入:
python test.py http://0.0.0.0:8080/
现在web.py应用正运行在你电脑上的一个真正的web服务器上。 访问那个URL,然后你应该看到”Hello, world!” (你可以通过把IP地址/端口加在”text.py”的后面,来控制web.py在哪里启动服务器。你也可以让它运行在fastcgi或scgi服务器上)。
注意: 如果你不能或者不想使用默认端口,你可以使用这样的命令来指定端口号:
python test.py 1234