HTPP服务器
HTTP服务器是建立在TCP协议之上的短连接协议。
它利用了 TCP 协议的可靠性,⽤来传输超⽂本 (HTML),通信⼀次连接⼀次,通信完成后 TCP 连接关闭。
所以如果想创建⼀个 HTTP Server 需要通过 Socket 搭建⼀个服务端程序。
最简单的HTTP Server
import socket
# 定义 socket 对象
addr = ('127.0.0.1', 8000)
server_sock = socket.socket()
server_sock.bind(addr)
server_sock.listen(1024)
response_data = b'''
HTTP/1.1 200 OK
Content-Language: zh-CN
Content-Type: text/html;charset=UTF-8
<html>
<head>
<title>Home Page</title>
</head>
<body>
<h1>Home Page</h1>
<p>
<img src="https://dss1.bdstatic.com/6OF1bjeh1BF3odCf/it/u=768499260,4247864507&fm=74&app=80&f=JPEG&size=f121,121?sec=1880279984&t=811bff3a31ca6ff12199601995d0289d">
<br>
hello %s
</p>
</body>
<html>
'''
while True:
print('正在等待客户端连接。。。')
cli_sock, cli_addr = server_sock.accept()
print('接收客户端的数据。。。')
request_data = cli_sock.recv(1024)
print('客户端发送的请求报文:\n', request_data.decode('utf8'))
# 提取 URL
url = request_data.split(b' ')[1]
name = url.split(b'/')[1]
if not name:
name = b'world'
print('向客户端发送响应报文')
cli_sock.send(response_data % name)
print('关闭与客户端的连接')
cli_sock.close()
虽然这代码只有几十行,但已经包含了⼀个⼩型Web 系统的核心
一个完备的Web系统如下图所示:
常见的Web框架
如果想完成更复杂的功能,还需要深⼊开发很多东西,比如路由机制、模版系统、ORM系统、Session会话……
好在这些基础且通⽤的东西已经被很多前辈开发完成,我们没有必要再造轮子。
他们按照自己的用途和想法,将各种系统开发、组合,最终为我们提供了各种各样的 Web 框架
Web framework | Description |
---|---|
Django | 全能型框架, ⼤⽽全, 插件丰富, ⽂档丰富, 社区活跃, 适合快速开发, 内部耦合⽐较紧 |
Flask | 微型框架, 适合新⼿学习, 极其灵活, 便于⼆次开发和扩展, ⽣态环境好, 插件丰富 |
Tornado | 异步处理, 事件驱动 (epoll), 性能优异 |
Bottle | 单⽂件框架, 结构紧凑,适合初学者阅读源码,了解Web 原理 |
web.py | 代码优美, 适合学习源码 |
Falcon | 性能优异适合写 API 接⼝ |
Quixote | ⼀个爷爷级别的框架,著名的⾖瓣⽹⽤的便是这个 |
Sanic | 后起之秀,性能秒杀以上所有前辈,但没有前辈们稳定。 |
Flask入门
认识flask
Flask 是⼀款纯 Python 开发的轻量级 Web 框架,代码全部开源。框架本身代码量很少,功能也很少,但是却具有非常强的扩展性。
Flask 定义了有⼀套⾮常优秀的接口,使得任何⼈都可以⾮常轻松的为它开发各种功能扩展。也就是这⼀点造就了 Flask 的繁荣,全世界的开发者为 Flask 贡献了⽆数的优质扩展。
使⽤ Flask 你完全可以作出任何你想要的站点,甚⾄可以作为⼿机 App 的服务端程序。
接下来的开发都是在linux操作系统完成的,本人使用的是ubuntu18.04
1.在linux中配置好了python环境后,使用如下命令安装Flask
pip install --user flask
–user 选项能让安装的 Python 包存储在用户自己的目录下,而非系统目录
2.为了以后的调试方便,推荐使用ipython(支持变量自动补全,自动缩进,支持 bash shell 命令)
pip install --user ipython
Hello World
用flask来演示一个hello world
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return 'Hello World!'
if __name__ == '__main__':
app.debug = True
app.run()
将上⾯代码保存到⼀个 hello.py 的文件中,然后在终端运行 python ./hellp.py 即可
打开浏览器,输⼊ http://127.0.0.1:5000 可以查看效果。
运行结果;
如果想要停止终端中的 Flask 程序,可以按 ctrl + c
调试模式
上⾯的例子中,我们打开了设置了 app.debug 选项,他可以使 Flask 出现异常后显示出有好的调试页面。
在代码中增加⼀个 div() 函数来产生⼀个错误:
@app.route('/div') # 路由绑定
def div():
a, b = 123, 0
x = a / b
return 'x = %s' % x
然后在浏览器中输⼊ URL: http://127.0.0.1:5000/div 后可以看到如下页面:
在此页面我们可以看到报错的详情,也可以点击右侧的控制台按钮,进行调试:
备注:点击调试按钮后,会提示输⼊ PIN 码,这个 PIN 可以在 Flask 启动的的后看到。