Python做一个简单的web服务器,外接一个支持wsgi协议框架显示动态数据

import socket
import re
import sys
import mini_frame

# 通过外部传端口号给套接字
# tcp_port = sys.argv[1]

class Mini_Wsgi(object):
    def __init__(self):
        self.tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.tcp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        # 绑定端口
        self.tcp_socket.bind(("", 7780))
        # 监听事件
        self.tcp_socket.listen(128)
        # 定义一个字典保存用户的请求
        self.env = dict()

    def index(self, user, new_socket):
        response = "HTTP/1.1 200 ok\r\n" + "content = ‘charset=utf-8‘"
        response += "\r\n"

        try:
            user_file = "./" + "static" + user
            with open(user_file, "rb") as f:
                html_content = f.read()
            f.close()
            response += html_content.decode("utf-8")
            new_socket.send(response.encode("utf-8"))
        except Exception as ret:
            return "页面不存在"

    def center(self, user, new_socket):
        response = "HTTP/1.1 200 ok\r\n" + "content = ‘charset=utf-8‘"
        response += "\r\n"
        try:
            user_file = "./" + "static" + user
            with open(user_file, "rb") as f:
                html_content = f.read()
            f.close()
            response += html_content.decode("utf-8")
            new_socket.send(response.encode("utf-8"))
        except Exception as ret:
            return "页面不存在"

    def start_response(self, s_heard, heards):
        self.s_heard = s_heard
        print(heards)
        h = list()
        for a in heards:
            for b in a:
                h.append(b)
                print(h)
            self.heards_all += "%s:%s" % (h[0], h[1])
            self.heards_all += ";"
        print(self.heards_all)

    def server_run(self):

        while True:
            # 等待新用户的链接,返回一个元组
            new_socket, new_addr = self.tcp_socket.accept()
            browser_date = new_socket.recv(1024)
            # 对浏览器返回的数据进行切片处理
            browser_content = browser_date.decode("utf-8").split("\r\n")
            print(browser_content[0], browser_content)
            # browser_content = [‘GET /你请求的内容 HTTP/1.1‘, ‘Host: 127.0.0.1:7780‘, ‘Connection: keep-alive‘, ‘Cache-Control: max-age=0‘, ‘Upgrade-Insecure-Requests: 1‘, ‘User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0‘, ‘Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8‘, ‘Accept-Encoding: gzip, deflate, sdch, br‘, ‘Accept-Language: zh-CN,zh;q=0.8‘, ‘‘, ‘‘]
            # browser_content[0] = GET /你请求的内容 HTTP/1.1
            page_name = re.match(r"[^/]*([/]+.*)[ ].*", browser_content[0])
            # 得到第一条元素,用空格继续切
            # a = browser_content[0].split(" ")
            # 得到用户请求的数据内容
            user = page_name.group(1)
            print(user)
            self.env["PATH_INFO"] = user
            # 判断用户请求的数据以什么结尾,范围什么页面
            # if user.endswith(".html"):
            #     # 调用相对应页面的函数
            #     if user == "/center.html":
            #         self.center(user, new_socket)
            #     else:
            #         self.index(user, new_socket)

            if user.endswith(".html"):

                # 调用框架,返回动态数据
                html = mini_frame.application(self.env, self.start_response)
                print(html)
                print(str(self.heards_all))
                response = "HTTP/1.1 " + self.s_heard + "\r\n" + self.heards_all + "\r\n"
                response += "\r\n"
                response += html
                new_socket.send(response.encode("utf-8"))
                print("------")

            # 如果用户不是.html结尾,则给他加上.html,返回给用户主页
            else:
                response = "HTTP/1.1 200 ok\r\n" + "content = ‘charset=utf-8‘"
                response += "\r\n"

                # 发送body
                f = open("./static/index.html", "rb")
                html_content = f.read()
                f.close()
                response += html_content.decode("utf-8")
                new_socket.send(response.encode("utf-8"))

            new_socket.close()
            # self.tcp_socket.close()

def main():
    server_web = Mini_Wsgi()
    server_web.server_run()
    server_web.tcp_socket.close()

if __name__ == ‘__main__‘:
    main()

下面是mini_frame的代码:

import pymysql

info_path = dict()

# 定义一个路由函数用来装饰下面函数
def route(file_name):
    def set_func(func):
        info_path[file_name] = func
        def call_func(*args, **kwargs):
            return func(*args, **kwargs)
        return call_func
    return set_func

@route("/center.html")
def center():
    # user_file = "./" + "static" + user
    # with open("./static/center.html", "rb") as f:
    #     html_content = f.read()
    html_content = ""
    # # 建立数据库的链接
    conn = pymysql.connect(host="127.0.0.1", user="root",
                            password="0626",database="python_1",
                                charset="utf8")
    # 建立游标对象
    cursor = conn.cursor()
    # 执行sql语句
    cursor.execute("select * from student;")
    # 获取查询的数据
    vulue = cursor.fetchall()
    # 关闭游标对象
    cursor.close()
    # 关闭数据库链接
    conn.close()
    people_msg = "序号:%s 名字:%s 出生年月:%s 性别:%s"
    for date in vulue:
        html_content += people_msg % (date[0], date[1], date[2], date[3])
        html_content += "\t\n"
    # print(html_content)
    # html_content += vulue
    return html_content

@route("/index.html")
def register():
    with open("./static/index.html", "rb") as f:
        html_content = f.read()
    return html_content

# env = {"center.py":center,
#        "register.py":register}

def application(env, start_response):
    start_response("200 ok", [("content-type","text/html;charset=utf-8"),])
    try:
        file_name = env["PATH_INFO"]
        print(file_name)
        return info_path[file_name]()

    except Exception as ret:
        return "404 error"

这个程序有个问题就是,我一直开着,浏览器请求过来后,能正常显示出数据,但是等待一会后下面这行代码报错:

# 得到用户请求的数据内容
user = page_name.group(1)

说取不出来值,可如果没有请求过来的话accept默认不是堵塞的吗,为什么还能执行到正则匹配用户请求的值这行代码?(之前用的字符串切割取值,报错,换成正则也是报错,实在是想不明白accept接受到什么请求了打印出来的是个空的,/ 都没有)

现在正恶补下Flask与Django框架。

原文地址:https://www.cnblogs.com/lzb888/p/11143659.html

时间: 2024-10-12 22:56:14

Python做一个简单的web服务器,外接一个支持wsgi协议框架显示动态数据的相关文章

自己动手模拟开发一个简单的Web服务器

开篇:每当我们将开发好的ASP.NET网站部署到IIS服务器中,在浏览器正常浏览页面时,可曾想过Web服务器是怎么工作的,其原理是什么?“纸上得来终觉浅,绝知此事要躬行”,于是我们自己模拟一个简单的Web服务器来体会一下. 一.请求-处理-响应模型 1.1 基本过程介绍 每一个HTTP请求都会经历三个步凑:请求-处理-响应:每当我们在浏览器中输入一个URL时都会被封装为一个HTTP请求报文发送到Web服务器,而Web服务器则接收并解析HTTP请求报文,然后针对请求进行处理(返回指定的HTML页面

如何用PHP/MySQL为 iOS App 写一个简单的web服务器(译) PART1

原文:http://www.raywenderlich.com/2941/how-to-write-a-simple-phpmysql-web-service-for-an-ios-app 作为一个iPhone/iPad开发者,能够自己写一个简单的web服务器将是很有用的. 例如,你可能希望在软件启动时显示一些来自服务器的更新,或者在服务器端保存一些用户数据.除了你的想象力,没有什么能限制你了. 在第一篇中,我们将会一步一步的建立一个web服务器,基于promo code system(促销码系

自己模拟的一个简单的web服务器

首先我为大家推荐一本书:How Tomcat Works.这本书讲的很详细的,虽然实际开发中我们并不会自己去写一个tomcat,但是对于了解Tomcat是如何工作的还是很有必要的. Servlet容器是如何工作的 servlet容器是一个复杂的系统.不过,一个servlet容器要为一个servlet的请求提供服务,基本上有三件事要做: 1,创建一个request对象并填充那些有可能被所引用的servlet使用的信息,如参数.头部. cookies.查询字符串. URI 等等.一个 request

使用 Nodejs 搭建一个简单的Web服务器

使用Nodejs搭建Web服务器是学习Node.js比较全面的入门教程,因为要完成一个简单的Web服务器,你需要学习Nodejs中几个比较重要的模块,比如:http协议模块.文件系统.url解析模块.路径解析模块.以及301重定向问题,下面我们就简单讲一下如何来搭建一个简单的Web服务器. 作为一个Web服务器应具备以下几个功能: 1.能显示以.html/.htm结尾的Web页面 2.能直接打开以.js/.css/.json/.text结尾的文件内容 3.显示图片资源 4.自动下载以.apk/.

一个简单的web服务器

static void Main(string[] args) { IPAddress localAddress = IPAddress.Loopback;//获取本机的ip地址 IPEndPoint endPoint =new IPEndPoint(localAddress, 49155); Socket socket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp); socket.Bind

一个简单的Web服务器-支持Servlet请求

上接 一个简单的Web服务器-支持静态资源请求,这个服务器可以处理静态资源的请求,那么如何处理Servlet请求的呢? 判断是否是Servlet请求 首先Web服务器需要判断当前请求是否是Servlet请求. 像Tomcat,通过解析HTTP报文拿到请求url后,就可以根据web.xml来查找是否有匹配的Servlet,如果有匹配则认定为是一个有效的Servlet请求,然后将request,response传给对应的servlet的service()方法. 这里既然要实现一个简单的Web服务器,

(一)一个简单的Web服务器

万丈高楼平地起,首先我们必须了解 超文本传输协议(HTTP) 以后才能够比较清晰的明白web服务器是怎么回事. 1. 浅析Http协议 HTTP是一种协议,允许web服务器和浏览器通过互联网进行来发送和接受数据.它是一种请求和响应协议.客户端请求一个文件而服务器响应请求.HTTP使用可靠的TCP连接--TCP默认使用80端口.第一个HTTP版是HTTP/0.9,然后被HTTP/1.0所替代.正在取代HTTP/1.0的是当前版本HTTP/1.1,它定义于征求意见文档(RFC) 2616,可以从ht

java实现一个简单的Web服务器

Web服务器也称为超文本传输协议服务器,使用http与其客户端进行通信,基于java的web服务器会使用两个重要的类, java.net.Socket类和java.net.ServerSocket类,并基于发送http消息进行通信. 这个简单的Web服务器会有以下三个类: *HttpServer *Request *Response 应用程序的入口在HttpServer类中,main()方法创建一个HttpServer实例,然后调用其await()方法,顾名思义,await()方法会在指定端口

【转】用Python建立最简单的web服务器

利用Python自带的包可以建立简单的web服务器.在DOS里cd到准备做服务器根目录的路径下,输入命令: python -m Web服务器模块 [端口号,默认8000] 例如: python -m SimpleHTTPServer 8080 然后就可以在浏览器中输入 http://localhost:端口号/路径 来访问服务器资源. 例如: http://localhost:8080/index.htm(当然index.htm文件得自己创建) 其他机器也可以通过服务器的IP地址来访问. 这里的