web开发基础


CS编程:客户端、服务端编程

BS编程:Browser、Server编程

HTTP协议 无状态协议 为了解决无状态,cookie就是解决方案之一(cookie对应B端,session对应S端)

URL组成

http://www.magedu.com/python/index.html?id=5&name=python

scheme协议   http

host:port www.magedu.com 80位默认端口不写

path /python/index.html

query string id=5 name=python

http消息

Request-Response

请求方法:

GET 请求获取URL对应的资源

POST 提交数据至服务器

HEAD 和GET类似 不过不返回正文

无状态-短连接-长连接

无状态 http的每次请求都是无状态的,解决方案是cookie-session

短连接 http1.1之前,一个请求一个连接,但是这样tcp的创建销毁成本太高,所有诞生了http1.1,http1.1默认开启长连接,可设置时长

长连接 http1.1之后支持keep-alive,默认开启,可设置,一个连接tcp连接建立后,会保持一段时间,浏览器再次请求时,会继续只用这个连接

WSGI

WSFI主要规定了服务与应用程序间的接口

environ

environ是包含Http请求信息的dict对象

  REQUEST_METHOD 请求方法,GET、POST等 PATH_INFO URL中的路径部分 QUERY_STRING 查询字符串 SERVER_NAME, SERVER_PORT 服务器名、端口 HTTP_HOST 地址和端口 SERVER_PROTOCOL 协议 HTTP_USER_AGENT UserAgent信息

start_reponse

它是一个可调用对象。有3个参数,定义如下: start_response(status, response_headers, exc_info=None) status 是状态码,例如 200 OK response_headers 是一个元素为二元组的列表,例如[('Content-Type', 'text/plain;charset=utf-8')]  exc_info 在错误处理的时候使用 start_response应该在返回可迭代对象之前调用,因为它返回的是Response Header。返回的可迭代对象是 Response Body。

APP三种实现方法

res_str = b'magedu.com\n'

# 函数实现
def application(environ, start_response):
return [res_str]
# 类实现
class Application:
def __init__(self, environ, start_response):
pass
def __iter__(self): # 实现此方法,对象即可迭代
yield res_str
# 类实现
class Application:
def __call__(self, environ, start_response):
return [res_str]

测试命令

$ curl -I http://192.168.142.1:9999/xxx?id=5
$ curl -X POST http://192.168.142.1:9999/yyy -d '{"x":2}'
-I 使用HEAD方法 -X 指定方法,-d传输数据

简单实现WSGI框架(server端)

demo_app

from wsgiref.simple_server import make_server, demo_app

ip = '127.0.0.1'
port = 9999
server = make_server(ip, port, demo_app)
server.serve_forever()

simple_server

from wsgiref.simple_server import make_server


def application(environ, start_response):
    status = "200 ok"
    headers = [('Content-Type', 'text/html;charset=utf-8')]
    start_response(status, headers)
    html = '

hello magedu

'.encode("utf-8") return [html] ip = '127.0.0.1' port = 9999 server = make_server(ip, port, application) server.serve_forever()
 

WEB服务器

本质上就是一个TCP服务器,监听在特定端口上 支持HTTP协议,能够将HTTP请求报文进行解析,能够把响应数据进行HTTP协议的报文封装并返回浏览器 端。 实现了WSGI协议,该协议约定了和应用程序之间接口(参看PEP333,https://www.python.org/dev/peps/p ep-0333/) APP应用程序 遵从WSGI协议 本身是一个可调用对象 调用start_response,返回响应头部 返回包含正文的可迭代对象