zoukankan      html  css  js  c++  java
  • <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)
    	# 用
    去切割上面的字符串-----切割出路径
    	l1 = data_str.split("
    ")
    	# 按照空格切割上面的字符串-----切割出url
    	l2 = l1[0].split()
    	url = l2[1]
    	print(url)
    	# 回复消息消息必须包含四部分:即响应格式(协议版本,状态码,状态描述,回车符)
    	conn.send(b'http/1.1 200 OK
    content-type:text/html;charset=utf-8
    
    ')
    
    	#  空行后面接响应正文,想让浏览器在页面上显示出来的内容都是响应正文
    
    	# 根据不同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>
    

      

  • 相关阅读:
    达梦数据库配置信息
    linux命令收集
    达梦数据库快速学习上手教程
    linux命令收集
    关于deciaml的类型转换问题
    exjs 导出excel
    Win7 系统IIS的配置方法 及相关参数设置
    为MFC添加UAC控制 (UAC Execution Level)
    asp.net 六大内置对象(1)
    .NET Framework 的垃圾回收器管理应用程序的内存分配和释放
  • 原文地址:https://www.cnblogs.com/shuimohei/p/10704202.html
Copyright © 2011-2022 走看看