<Django>socket简单实现django简化版

服务端(自己实现django)

'''
	django简化版:socket服务端
		a.收发浏览器信息----wsgiref.py
		b.根据用户访问的不同路径执行不同函数
		c.从html读取出内容,并完成字符串的替换(动态网页)
	按照功能划分web框架
		1.框架自带a,b,c------tornado框架
		2.框架自带b,c,使用第三方的a-------django框架
		3.框架自带b,使用第三方a和c--------flask
	按照维度划分
		1.django----大而全,网站能用的都有
		2.其他------fLask轻量级
'''

import socket

# 生成socket实例对象
sk = socket.socket()
# 绑定ip和端口
sk.bind(("127.0.0.1", 8000))
# 监听
sk.listen()

# 处理xiaohei的函数
def xiaohei(url):
	with open("xiaohei.html",'r',encoding='utf-8') as f:
		ret = f.read()
		import time
		# 动态网页本质都是字符串的替换--发生在服务端
		ret = ret.replace("@@&&@@",str(time.ctime()))
	return bytes(ret,encoding='utf-8')
	# ret = "<h1>hello {} xiaohei<h1>".format(url)
	# return bytes(ret,encoding='utf-8')

def xiaobai(url):
	with open("xiaobai.html",'rb') as f:
		ret = f.read()
	return ret
	# ret = "<h2>hello {} xiaobai<h2>".format(url)
	# return bytes(ret,encoding='utf-8')

def f404(url):
	ret = "找不到{}这个url".format(url)
	return bytes(ret,encoding='utf-8')


# urls.py
url_func = [
	("/xiaohei/",xiaohei),
	("/xiaobai/",xiaobai),
]

# 一直等待链接
while 1:
	# 获取客户端的链接和地址
	conn, addr = sk.accept()
	# 没有用的变量通常用下划线表示
	# conn,_ = sk.accept()
	# 接收消息
	data = conn.recv(8989)
	# 把收到的数据转成字符串类型
	data_str = str(data, encoding="utf-8")  # bytes("str", enconding="utf-8")
	print(data_str)
	# 用\r\n去切割上面的字符串-----切割出路径
	l1 = data_str.split("\r\n")
	# 按照空格切割上面的字符串-----切割出url
	l2 = l1[0].split()
	url = l2[1]
	print(url)
	# 回复消息消息必须包含四部分:即响应格式(协议版本,状态码,状态描述,回车符)
	conn.send(b'http/1.1 200 OK\r\ncontent-type:text/html;charset=utf-8\r\n\r\n')

	#  空行后面接响应正文,想让浏览器在页面上显示出来的内容都是响应正文

	# 根据不同url返回不同内容
	# if url == '/xiaohei/':
	# 	response = xiaohei(url)
	# else:
	# 	response=b"404 not found"
	# conn.send(b'<h1>hello world<h1>')
	# conn.send(response)
	for i in url_func:
		if i[0] == url:
			func = i[1]
			break
	else:
		func = f404
	response = func(url)
	conn.send(response)
	# 关闭
	conn.close()
sk.close()

  

Django的wsgiref模块

"""
根据URL中不同的路径返回不同的内容--函数进阶版
返回HTML页面
让网页动态起来
wsgiref模块版
"""

import time
from wsgiref.simple_server import make_server


# 将返回不同的内容部分封装成函数
def xiaohei(url):
    with open("xiaohei.html", "r", encoding="utf8") as f:
        s = f.read()
        now = str(time.time())
        s = s.replace("@@&&@@", now)
    return bytes(s, encoding="utf8")


def xiaobai(url):
    with open("xiaobai.html", "r", encoding="utf8") as f:
        s = f.read()
    return bytes(s, encoding="utf8")


# 定义一个url和实际要执行的函数的对应关系
list1 = [
    ("/xiaohei/", xiaohei),
    ("/xiaobai/", xiaobai),
]


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', 8080, run_server)
    print("我在8080等你哦...")
    httpd.serve_forever()

xiaohei.html

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>xiaohei</title>
</head>
<body>
<h1>返回html文件</h1>
<p>随便写几句</p>
<p>随便写几句</p>
<p>随便写几句</p>
<a href="https://www.douyu.com/directory/all"><h1>斗鱼</h1></a>
<p>@@&&@@</p>
</body>
</html>

xiaohei.html

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>xiaobai</title>
</head>
<body>
<h1>用来测试的第二个页面</h1>
<h1>用来测试的第二个页面</h1>
<h1>用来测试的第二个页面</h1>
<h1>用来测试的第二个页面</h1>
</body>
</html>

  

posted @ 2019-04-14 10:53  水墨黑  阅读(829)  评论(0编辑  收藏  举报