web.py体验

当我们谈用http作前后端交互的时候,我们在谈什么?

任何网站最重要的部分就是它的URL结构,在web.py中,我们是怎么建立网站的url结构的?就是要定义一个元组就可以了。

1
2
3
urls = (
'/', 'Index'
)

哦我明白了大概,第一个元素就对应着这个url连接所在的位置,就是url吗,相当于这个网站的目录。第二个就是在Python中映射的类。把http请求发送到这个网站,Python怎么处理,就是需要开发相应后面类的方法去作反映就可以了。

像上面这个urls的对应关系,那么久表示我们要URL/(首页)被一个叫作Index的类处理。

那么web.py到底是怎么把这个网站应用建立起来的呢?

就是要这个

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

这条命令会告诉web.py去创建一个基于我们刚提交的URL列表的application。这个application会在这个文件的全局命名空间中查找对应类。

所以在web.py这个包里,这个所谓的application,其实就是处理外部请求和处理方法交互的一个程序,这个web.application就是这个Web应用的引擎,他要一直运行着,它处理URL请求、调用相应的处理函数,并返回响应。

所以其实我需要开发的关键部分,就是urls中每个类的实现,这些类负责处理特定的HTTP请求,并定义应用程序的行为。

在web.py中,urls变量负责定义路径和处理这些路径的类和函数之间的映射关系,每个路径会对应着一个类,web.py会根据请求的URL来调用对应的处理逻辑。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import web

# 定义处理请求的类
class Hello:
def GET(self):
return "Hello, world!"

class Goodbye:
def GET(self):
return "Goodbye, world!"

# 定义URL映射
urls = (
"/hello", "Hello", # /hello 路径对应 Hello 类
"/goodbye", "Goodbye" # /goodbye 路径对应 Goodbye 类
)

# 创建 web.application 实例,传入 URL 映射
app = web.application(urls, globals())

# 启动应用
if __name__ == "__main__":
app.run()

这里还有两个问题需要理解一下,用户可以访问urls中定义的路径,但这些路径不是直接指向PC上的文件或者目录,这些目录只是逻辑路径,并不是文件系统中的实际目录。这意味着,这些路径并不直接对应于磁盘上的某个文件夹或文件,而是由编写的Python类和方法来处理。例如,/hello路径会由Hello类的GET方法来处理,而这个类是在内存中定义的。

本质上,访问或者http协议这些啊,都是发送请求再返回一类的。

浏览器访问一个网址并访问,实际上就是发出了一个GET请求来请求网页内容。在web.py里,GET方法对应的是处理GET请求的类方法。当用户访问某个URL时,web.py会调用相应的类的GET方法来生成并返回响应。

POST请求用于提交数据。

PUT请求用于更新资源。

DELETE请求用于删除资源。

RESTful API是一种基于REST(Representational State Transfer,表述性状态转移)架构风格的Web及服务接口。

REST是由Roy Fielding在他的博士论文中提出的架构风格。它是一种设计理念,并不是一种协议或技术规范。REST强调利用Web的基本功能(如HTTP方法)来设计简单、灵活的网络应用。

REST的核心原则包括:

  • 无状态性,每次请求都必须包含完成请求所需的所有信息,服务器不储存任何客户端的状态。每次请求都是独立的,
  • 客户端-服务器架构,客户端和服务器的职责分离
  • 统一接口,通过HTTP请求和响应来进行交互
  • 可缓存性,服务器可以通过响应头信息声明是否可以缓存响应
  • 分层系统
  • 按需代码,服务器可以在响应中提供可执行代码,让客户端根据需要动态加载

RESTful API是符合REST架构风格的API,它利用HTTP请求来操作资源。

在RESTful API中,资源是应用中可以被标识的实体,通常是通过URL来标识的。例如,用户、文章、商品等都可以是资源。

资源标识符的这个概念很有趣,就是说每个资源都有唯一的URL,例如

GET /users/123:获取ID为123的用户信息

POST /users:创建一个新用户

PUT /users/123:更新ID为123的用户信息

DELETE /users/123:删除ID为123的用户。

无状态性:每个请求都是独立的,服务器不会保存客户端的任何状态。客户端需要在每个请求中提供所有必要的信息(如认证信息、请求数据等)。

支持不同的响应格式:RESTful API 可以返回多种格式的响应数据,最常见的是 JSONXML 格式。通常,服务器会在响应头中通过 Content-Type 指定响应格式。

RESTful API最重要的设计原则就是,以资源为中心:在RESTful API中,关注的是资源,而不是操作。资源通过URL进行标识。

HTTP方法的操作也要和动词相匹配:

GET:获取资源

POST:创建资源

PUT:更新资源

DELETE:删除资源

统一的 URL 格式:URL 应该是规范化的,避免复杂和不一致的路径设计。通常使用复数形式来表示资源。

  • 示例:
    • 获取所有用户:GET /users
    • 获取单个用户:GET /users/{id}
    • 创建新用户:POST /users
    • 更新用户信息:PUT /users/{id}
    • 删除用户:DELETE /users/{id}

层次化设计:RESTful API 设计应支持层次结构,通过合理的 URL 设计来表示资源之间的关系。

  • 示例:获取某个用户的所有文章:GET /users/{id}/posts

要定义接口,那么就是可以列出一个表格:

操作 请求 URL HTTP 方法 描述
获取所有用户 /users GET 获取所有用户的列表
获取单个用户 /users/{id} GET 获取指定 ID 用户的详细信息
创建新用户 /users POST 创建一个新的用户
更新用户信息 /users/{id} PUT 更新指定 ID 用户的信息
删除用户 /users/{id} DELETE 删除指定 ID 用户
获取用户的文章 /users/{id}/posts GET 获取指定用户的所有文章
创建文章 /users/{id}/posts POST 创建指定用户的新文章