引言:
由第一版一点一点的引入Django,从底层开始讲解。
第一版底层使用socket模块启动服务
"""
先启动服务,监听
while 1:
等待连接...
3. 接收到你的请求
4. 根据你的需求,返回相应的内容
断开
"""
import socket
sk = socket.socket()
sk.bind(("127.0.0.1", 8080)) # 绑定IP和端口
sk.listen() # 监听
while 1:
# 等待链接
conn, add = sk.accept()
data = conn.recv(8096) # 接收客户端发来的消息
conn.send(b'HTTP/1.1 200 OK\r\n\r\n')
conn.send(b'object')
conn.close()
第二版根据URL中不同的路径返回不同的内容
"""
根据URL中不同的路径返回不同的内容
"""
import socket
sk = socket.socket()
sk.bind(('127.0.0.1', 8080))
sk.listen() # 监听
while 1:
# 等待链接
conn, addr = sk.accept()
data = conn.recv(8096) # 接收客户端发来的消息
# 从data中取到路径
data = str(data, encoding='utf8') # 把收到的字节类型的数据转换成字符串
print(data)
# 按\r\n分割
data1 = data.split("\r\n\r\n")[0]
print(data1)
url = data1.split()[1]
print("url:", url)
print('*'*120)
conn.send(b'HTTP/1.1 200 OK\r\n\r\n')
# 根据不同的路径返回不同内容
if url == "/index/":
response = b"index"
elif url == "/main/":
response = b"main"
else:
response = b"404"
conn.send(response)
conn.close()
第二版代码示例
第三版根据URL中不同的路径返回不同的内容(页面封装成函数版)
"""
根据URL中不同的路径返回不同的内容
"""
import socket
sk = socket.socket()
sk.bind(("127.0.0.1", 8080)) # 绑定IP和端口
sk.listen() # 监听
# 将返回不同的内容部分封装成函数
def index(url):
s = "这是{}页面!".format(url)
return bytes(s, encoding="utf8")
def home(url):
s = "这是{}页面!".format(url)
return bytes(s, encoding="utf8")
while 1:
# 等待连接
conn, add = sk.accept()
data = conn.recv(8096) # 接收客户端发来的消息
# 从data中取到路径
data = str(data, encoding="utf8") # 把收到的字节类型的数据转换成字符串
# 按\r\n分割
data1 = data.split("\r\n")[0]
url = data1.split()[1]
print("url:", url)
print("*" * 120)
conn.send(b'HTTP/1.1 200 OK\r\nContent-Type: text/html; charset=utf-8\r\n\r\n') # 因为要遵循HTTP协议
# 根据不同的路径返回不同内容
if url == "/index/":
response = index(url)
elif url == "/home/":
response = home(url)
else:
response = b"404 not found!"
# 具体的响应体
conn.send(response)
conn.close()
第三版代码
第四版根据URL中不同的路径返回不同的内容(页面封装成函数且调用函数使用反射版)
"""
根据URL中不同的路径返回不同的内容
函数进阶版
"""
import socket
sk = socket.socket()
sk.bind(("127.0.0.1", 8080)) # 绑定IP和端口
sk.listen() # 监听
# 将返回不同的内容部分封装成函数
def index(url):
s = "这是{}页面!".format(url)
return bytes(s, encoding="utf8")
def home(url):
s = "这是{}页面!".format(url)
return bytes(s, encoding="utf8")
# 定义一个url和实际要执行的函数的对应关系
lis = [
("/index/", index),
("/main/", home),
]
while 1:
# 等待连接
conn, addr = sk.accept()
date = conn.recv(8096) # 接收客户端发来的消息
# 从data中取到路径
date = str(date, encoding="utf8") # 把收到的字节类型的数据转换成字符串
# 按\r\n分割
date1 = date.split("\r\n")[0]
url = date1.split()[1]
conn.send(b'HTTP/1.1 200 OK\r\nContent-Type: text/html; charset=utf-8\r\n\r\n') # 因为要遵循HTTP协议
# 根据不同的路径返回不同内容
func = None
for i in lis:
if i[0] == url:
func = i[1]
break
if func:
response = func(url)
else:
response = b"404 not found!"
# 具体的响应体
conn.send(response)
conn.close()
第四版代码
第五版根据URL中不同的路径返回不同的内容(页面封装成函数且调用函数使用反射并返归HTML页面版)
"""
根据URL中不同的路径返回不同的内容
函数进阶版
返回HTML页面
"""
import socket
sk = socket.socket()
sk.bind(("127.0.0.1", 8080)) # 绑定IP和端口
sk.listen() # 监听
# 将返回不同的内容部分封装成函数
def index(url):
with open("index.html", "r", encoding="utf8") as f:
s = f.read()
return bytes(s, encoding="utf8")
def home(url):
with open("home.html", "r", encoding="utf8") as f:
s = f.read()
return bytes(s, encoding="utf8")
# 定义一个url和实际要执行的函数的对应关系
list1 = [
("/index/", index),
("/home/", home),
]
while 1:
# 等待连接
conn, add = sk.accept()
data = conn.recv(8096) # 接收客户端发来的消息
# 从data中取到路径
data = str(data, encoding="utf8") # 把收到的字节类型的数据转换成字符串
# 按\r\n分割
data1 = data.split("\r\n")[0]
url = data1.split()[1]
print("url:", url)
print("*" * 120)
conn.send(b'HTTP/1.1 200 OK\r\nContent-Type: text/html; charset=utf-8\r\n\r\n') # 因为要遵循HTTP协议
# 根据不同的路径返回不同内容
func = None
for i in list1:
if i[0] == url:
func = i[1]
break
if func:
response = func(url)
else:
response = b"404 not found!"
# 具体的响应体
conn.send(response)
conn.close()
第五版代码
第六版根据URL中不同的路径返回不同的内容(页面封装成函数且调用函数使用反射并返归动态HTML页面版)
"""
根据URL中不同的路径返回不同的内容
函数进阶版
返回HTML页面
动态起来
"""
import socket
import time
sk = socket.socket()
sk.bind(("127.0.0.1", 8080)) # 绑定IP和端口
sk.listen() # 监听
# 将返回不同的内容部分封装成函数
def home(url):
with open("home.html", "r", encoding="utf8") as f:
s = f.read()
now = str(time.time())
s = s.replace("¥¥¥¥", now)
return bytes(s, encoding="utf8")
def index(url):
with open("home.html", "r", encoding="utf8") as f:
s = f.read()
return bytes(s, encoding="utf8")
# 定义一个url和实际要执行的函数的对应关系
list1 = [
("/index/", index),
("/home/", home),
]
while 1:
# 等待连接
conn, add = sk.accept()
data = conn.recv(8096) # 接收客户端发来的消息
# 从data中取到路径
data = str(data, encoding="utf8") # 把收到的字节类型的数据转换成字符串
# 按\r\n分割
data1 = data.split("\r\n")[0]
url = data1.split()[1]
print("url:", url)
print("*" * 120)
conn.send(b'HTTP/1.1 200 OK\r\nContent-Type: text/html; charset=utf-8\r\n\r\n') # 因为要遵循HTTP协议
# 根据不同的路径返回不同内容
func = None
for i in list1:
if i[0] == url:
func = i[1]
break
if func:
response = func(url)
else:
response = b"404 not found!"
# 具体的响应体
conn.send(response)
conn.close()
第六版代码
第七版根据URL中不同的路径返回不同的内容(页面封装成函数且调用函数使用反射并返归动态HTML页面同时使用wsgiref模块版)
"""
根据URL中不同的路径返回不同的内容
函数进阶版
返回HTML页面
动态起来
wsgiref模块版
"""
import time
from wsgiref.simple_server import make_server
# 将返回不同的内容部分封装成函数
def index(url):
with open("index.html", "r", encoding="utf8") as f:
s = f.read()
now = str(time.time())
s = s.replace("@@oo@@", now)
return bytes(s, encoding="utf8")
def home(url):
with open("home.html", "r", encoding="utf8") as f:
s = f.read()
return bytes(s, encoding="utf8")
# 定义一个url和实际要执行的函数的对应关系
list1 = [
("/index/", index),
("/home/", home),
]
def run_server(environ, start_response):
start_response('200 OK', [('Content-Type', 'text/html;charset=utf8'), ]) # 设置HTTP响应的状态码和头信息
url = environ['PATH_INFO'] # 取到用户输入的url
func = None
for i in list1:
if i[0] == url:
func = i[1]
break
if func:
response = func(url)
else:
response = b"404 not found!"
return [response, ]
if __name__ == '__main__':
httpd = make_server('127.0.0.1', 8090, run_server)
print("Serving HTTP on port 8090...")
httpd.serve_forever()
第七版代码
第八版根据URL中不同的路径返回不同的内容(页面封装成函数且调用函数使用反射并返归动态HTML页面同时使用wsgiref模块和jinja2模块版)
"""
根据URL中不同的路径返回不同的内容
函数进阶版
返回HTML页面
动态起来
wsgiref模块版和jinja2模块
"""
import time
from wsgiref.simple_server import make_server
import jinja2
# 将返回不同的内容部分封装成函数
def index(url):
with open("index.html", "r", encoding="utf8") as f:
s = f.read()
now = str(time.time())
s = s.replace("@@oo@@", now)
return bytes(s, encoding="utf8")
def home(url):
with open("home.html", "r", encoding="utf8") as f:
s = f.read()
return bytes(s, encoding="utf8")
def human(url):
with open("human.html", "r", encoding="utf8") as f:
s = f.read()
template = jinja2.Template(s) # 生成一个jinja2的Template(模板)对象
data = {"name": "zz", "hobby_list": ["足球", "篮球", "平棒球"]}
response = template.render(data) # 本质上是完成了字符串的替换
return bytes(response, encoding="utf8")
# 定义一个url和实际要执行的函数的对应关系
list1 = [
("/index/", index),
("/home/", home),
("/human/", human),
]
def run_server(environ, start_response):
start_response('200 OK', [('Content-Type', 'text/html;charset=utf8'), ]) # 设置HTTP响应的状态码和头信息
url = environ['PATH_INFO'] # 取到用户输入的url
func = None
for i in list1:
if i[0] == url:
func = i[1]
break
if func:
response = func(url)
else:
response = b"404 not found!"
return [response, ]
if __name__ == '__main__':
httpd = make_server('127.0.0.1', 8090, run_server)
print("Serving HTTP on port 8090...")
httpd.serve_forever()
第八版代码
第九版根据URL中不同的路径返回不同的内容(页面封装成函数且调用函数使用反射并返归动态HTML页同时使用wsgiref模块和jinja2模块与数据库版)
"""
根据URL中不同的路径返回不同的内容
函数进阶版
返回HTML页面
动态起来
wsgiref模块版和jinja2模块和pymysql
"""
import time
from wsgiref.simple_server import make_server
import jinja2
import pymysql
# 将返回不同的内容部分封装成函数
def index(url):
with open("index.html", "r", encoding="utf8") as f:
s = f.read()
now = str(time.time())
s = s.replace("@@oo@@", now)
return bytes(s, encoding="utf8")
def home(url):
with open("home.html", "r", encoding="utf8") as f:
s = f.read()
return bytes(s, encoding="utf8")
def human(url):
with open("human.html", "r", encoding="utf8") as f:
s = f.read()
template = jinja2.Template(s) # 生成一个jinja2的Template(模板)对象
# data = {"name": "xx", "hobby_list": ["对子", "篮球", "足球"]}
conn = pymysql.connect(host="127.0.0.1", port=3306, user="root", passwd="123456", db="userinfo", charset="utf8")
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
cursor.execute("SELECT name, hobby FROM user")
user = cursor.fetchone()
cursor.close()
conn.close()
print("user:", user)
print("*" * 120)
hobby_list = user["hobby"].split()
user["hobby_list"] = hobby_list
print(user)
print("-" * 120)
response = template.render(user) # 本质上是完成了字符串的替换
return bytes(response, encoding="utf8")
# 定义一个url和实际要执行的函数的对应关系
list1 = [
("/index/", index),
("/home/", home),
("/human/", human),
]
def run_server(environ, start_response):
start_response('200 OK', [('Content-Type', 'text/html;charset=utf8'), ]) # 设置HTTP响应的状态码和头信息
url = environ['PATH_INFO'] # 取到用户输入的url
func = None
for i in list1:
if i[0] == url:
func = i[1]
break
if func:
response = func(url)
else:
response = b"404 not found!"
return [response, ]
if __name__ == '__main__':
httpd = make_server('127.0.0.1', 8090, run_server)
print("Serving HTTP on port 8090...")
httpd.serve_forever()
第九版代码