CS
,Client/Server 客户端升级麻烦;BS
,Browser/Server;除了重量级软件如Office
、PS
等,大部分软件都以Web
形式提供,如新浪新闻、博客、微博等;
Web
开发的几个阶段
Model-View-Controller
的模式,简化 Web 开发;HTTP/1.1 版本允许多个 HTTP 请求复用一个TCP
连接;
请求-响应模式,一个请求只处理一个响应;
- 必须先有客户端向服务端发出请求,请求包括;
- 服务端想客户端返回 HTTP 响应,响应包括;
- 如果返回的内容还包含其他 HTTP 请求,重复 1. 2;
Header
一行,多个Header
用换行符’\r\n’分割;Header
与Body
用两个’\r\n’分割;Body
的数据类型由Content-Type
头确定;Content-Encoding
指定压缩方式;HTML 定义了一套语法规则,来告诉浏览器如何把网页显示出来;
HTML 文档是有一系列 Tag 组成,最外层的 Tag 是,规范的要包括
...
和...
;
HTML 是富文档模型,因此还有一系列 Tag 用来表示链接、图片、表格、表单等;
Cascading Style Sheets
层叠样式表,用来控制 HTML 里所有元素的展现方式;
为了让 HTML 具交互性而添加的,可以内嵌在 HTML,也可以外部链接到 HTML;
对于优秀的 Web 开发人员,精通 HTML、CSS、JavaScript 是必须的
Web Server Gateway Interface
用于接收 HTTP 请求,解析 HTTP 请求,发送 HTTP 响应的 Python 标准接口,是 Web 服务端或网关端与 Web 业务端或框架端的桥梁;
无论多复杂的 Web 应用,入口都是一个 WSGI 处理函数,HTTP 请求的所有输入信息通过environ
获取,HTTP 响应通过start_response()
输出Header
,通过函数返回值输出Body
;
def application(environ, start_response):
start_response('200 oK', [('Content-Type', 'text/html')])
body = f"Hello,
{environ['PATH_INFO'][1:] or 'web'}!"
return [body.encode('utf-8')]
environ
一个包含所有 HTTP 请求信息的 dict 对象;start_response
一个发送 HTTP 响应的函数,只能发送一次,格式见上例;return
HTTP 响应的 Body,bytes;Python 内置了一个 WSGI 服务器模块wsgiref
,纯 Python 编写的参考实例,完全符合 WSGI 标准,单不考虑运行效果,仅供开发和测试使用;
from wsgiref.simple_server import make_server
# 创建一个服务器,IP地址为空,端口是 8000,处理函数是 application
httpd = make_server('', 8000, application)
print('Serving HTTP on port 8000...')
# 开始监听HTTP 请求
httpd.serve_forever()
面对客服端的不同请求,若使用 WSGI,需对environ
的不同信息作出不同处理逻辑,这样的代码很难维护;
Web 框架负责URL
到函数的映射,解析 HTTP 请求的参数,让我们可以专注于一个函数处理一个URL
;
Python 最流行的 Web 框架;
安装
pip install flask
示例
from flask import Flask
from flask import request
app = Flask(__name__)
@app.route('/', methods=['GET', 'POST'])
def home():
return 'Home
'
@app.route('/signin', methods=['GET'])
def signin_form():
return ''''''
@app.route('/signin', methods=['POST'])
def signin():
# 需要从request对象读取表单内容:
if request.form['username'] == 'admin' and request.form[
'password'] == 'password':
return 'Hello, admin!
'
return 'Bad username or password.
'
if __name__ == "__main__":
app.run()
Flask 通过装饰器关联URL
和函数,通过request.form['name']
获取表单内容;
Flask 自带的服务器(调试使用)端口为 5000;
Django
全能型web.py
小巧Bottle
类似 FlaskTornado
异步分离出 Python 代码与 HTML 代码,HTML 代码全部放在模板里;
Model-View-Controller
Controller
处理 URL 的函数,负责业务逻辑;
View
.html 模板页,负责显示逻辑,通过简单的变量替换,最终输出用户看到的 HTML;
Model
用来传给 View 替换的变量;
安装
$ pip install janja2
示例
from flask import Flask, request, render_template
app = Flask(__name__)
@app.route('/', methods=['GET', 'POST'])
def home():
# 使用模板: ./templates/home.html
return render_template('home.html')
@app.route('/signin', methods=['GET'])
def signin_form():
return render_template('form.html')
@app.route('/signin', methods=['POST'])
def signin():
# 需要从request对象读取表单内容:
username = request.form['username']
password = request.form['password']
if username == 'admin' and password == 'password':
return render_template('signin-ok.html', username=username)
return render_template('form.html',
message='Bad username or password',
username=username)
Flask
通过render_templates()
函数实现模板的渲染;
{{ name }}
表示一个需要替换的变量;
{% ... %}
表示循环、条件判断等指令;
Mako
,<% … %> 和 ${xxx}Cheetah
,<% … %> 和 ${xxx}Django
,{% … %} 和 {{ xxx }}PS:欢迎各路道友阅读
与评论
,感谢道友点赞
、关注
、收藏
!