第二十四节 让web服务器支持WSGI协议

import socket
import multiprocessing
import re
# import dynamic.mini_frame
import sys
# 通过sys.argv在cmd命令行给实例对象传参

class WSGIServer():

    def __init__(self, port, app, static_path):
        self.application = app
        self.static_path = static_path
        self.web_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.web_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        self.web_socket.bind((‘192.168.1.7‘,int(port)))
        self.web_socket.listen(128)

    def tcp_serve(self, resp_socket):
        recv_data = resp_socket.recv(1024).decode(‘utf-8‘)
        request_lines = recv_data.splitlines()
        file_name = ‘‘
        ret = re.match(r"[^/]+(/[^ ]*)",request_lines[0])
        if ret:
            file_name=ret.group(1)
            if file_name == "/":
                file_name = ‘\index.html‘

        path = self.static_path + file_name
        if not file_name.endswith(".py"):
            # 判断是都是.py结尾,不是返回动态页面,是返回静态页面
            try:
                f=open(path,‘rb‘)
            except:
                resp_data = ‘HTTP/1.1 200 OK\r\n‘ + "\r\n" + ‘.....file not find....‘
                resp_socket.send(resp_data.encode(‘utf-8‘))
            else:
                html_content = f.read()
                f.close()
                resp_data = ‘HTTP/1.1 200 OK\r\n‘ + "\r\n"
                resp_socket.send(resp_data.encode(‘utf-8‘))
                resp_socket.send(html_content)
        else:
            # 动态页面处理
            env= dict()
            env[‘PATH INFO‘] = file_name
            # 调用mini_frame框架里的application函数,返回header和body,在将两者在web服务器里组装,返回给浏览器
            body =self.application(env, self.set_response_headers)
            header = ‘HTTP/1.1 %s\r\n‘ % self.status
            for temp in self.headers:
                header += "%s:%s\r\n" % (temp[0], temp[1])
            header += "\r\n"
            resp_data = header +body
            resp_socket.send(resp_data.encode(‘utf-8‘))

        resp_socket.close()

    def set_response_headers(self,status,headers):
        ‘‘‘该方法用于接收mini_frame框架里返回的header数据‘‘‘
        self.status = status
        self.headers = [(‘Server‘,‘mini_web v8.8‘)]
        self.headers += headers

    def run_forver(self):
        while True:
            resp_socket, resp_addr = self.web_socket.accept()
            p = multiprocessing.Process(target=self.tcp_serve, args=(resp_socket,))
            p.start()
            # 同乌班图一样也需要关闭套接字,跟文件描述符有关,不然页面一直刷新不出来
            resp_socket.close()
        # self.web_socket.close()

def main():
    if len(sys.argv) == 3:
        try:
            port = int(sys.argv[1])
            frame_app_name = sys.argv[2]
        except Exception as ret:
            print(‘端口输入有误....‘)
            return
    else:
        print(‘请按以下方式运行:‘)
        print(‘python xxx.py 7890 mini_frame:application‘)

        return
    ret = re.match(r"([^:]+):(.*)", frame_app_name)

    if ret:
        frame_name = ret.group(1)
        app_name = ret.group(2)
    else:
        print(‘请按以下方式运行:‘)
        print(‘python xxx.py 7890 mini_frame:application‘)
        print("...........................")
        return
    # 打开配置文件,进行路径读入
    with open(‘web_server.conf‘) as fd:
        conf_info = eval(fd.read())
    ‘‘‘{
    "static_path":"E:\\360Downloads\\Software\\新建文件夹\\新建文件夹\\tmag_23_Infinity",
    "dynamic_path":"./dynamic"
        }‘‘‘

    # sys.path 返回的是一个列表!该路径已经添加到系统的环境变量了,当我们要添加自己的搜索目录时,可以通过列表的append()方法
    # 对于模块和自己写的脚本不在同一个目录下,在脚本开头加sys.path.append(‘xxx‘):
    sys.path.append(conf_info[‘dynamic_path‘])
    # 直接用import frame_name 不会将frame_name 认为是一个变量,直接认为是一个模块名
    frame = __import__(frame_name)
    app = getattr(frame, app_name)

    wsgi_server = WSGIServer(port, app, conf_info["static_path"])
    wsgi_server.run_forver()

if __name__ == ‘__main__‘:
    main()

原文地址:https://www.cnblogs.com/kogmaw/p/12602541.html

时间: 2024-10-14 12:27:27

第二十四节 让web服务器支持WSGI协议的相关文章

第二十三节 让web服务器支持WSGI协议

import socket import multiprocessing import re import dynamic.mini_frame class WSGIServer(): def __init__(self): self.web_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.web_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

centos LNMP第二部分nginx、php配置 第二十四节课

centos  LNMP第二部分nginx.php配置  第二十四节课 上半节课 下半节课 f

第三百二十四节,web爬虫,scrapy模块介绍与使用

第三百二十四节,web爬虫,scrapy模块介绍与使用 Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 其可以应用在数据挖掘,信息处理或存储历史数据等一系列的程序中.其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的, 也可以应用在获取API所返回的数据(例如 Amazon Associates Web Services ) 或者通用的网络爬虫.Scrapy用途广泛,可以用于数据挖掘.监测和自动化测试. Scrapy 使用了 Twisted异步网络库来处理网络通讯.

centos mysql 优化 第二十四节课

centos mysql  优化  第二十四节课 f

第三百三十四节,web爬虫讲解2—Scrapy框架爬虫—Scrapy爬取百度新闻,爬取Ajax动态生成的信息

第三百三十四节,web爬虫讲解2-Scrapy框架爬虫-Scrapy爬取百度新闻,爬取Ajax动态生成的信息 crapy爬取百度新闻,爬取Ajax动态生成的信息,抓取百度新闻首页的新闻标题和rul地址 有多网站,当你浏览器访问时看到的信息,在html源文件里却找不到,由得信息还是滚动条滚动到对应的位置后才显示信息,那么这种一般都是 js 的 Ajax 动态请求生成的信息 我们以百度新闻为列: 1.分析网站 首先我们浏览器打开百度新闻,在网页中间部分找一条新闻信息 然后查看源码,看看在源码里是否有

第二十四节,自定义函数

第二十四节,自定义函数函数是将要实现的功能写在函数里,在要使用此功能的地方调用此函数即可实现功能,这样大大减少编程重复书写同样的代码,在多个要使用同样功能的地方调用函数即可不需要重复写同样的代码函数式编程最重要的是增强代码的重用性和可读性 函数的定义主要有如下要点: def:表示函数的关键字函数名:函数的名称,日后根据函数名调用函数函数体:函数中进行一系列的逻辑计算,如:发送邮件.计算出 [11,22,38,888,2]中的最大数等...参数:为函数体提供数据return:返回值:当函数执行完毕

【php增删改查实例】第二十四节 - 文件上传在项目中的具体应用

文件上传在项目中,一般有两个用武之地,分别为设置用户的头像和上传附件.本节我们演示如果进行用户头像的上传. 因为一个用户单独并且唯一对应了一个头像,是一对一的关系,所以我们需要去给tm_users表添加一个头像字段 – header . 点击保存按钮,完成表字段的添加. 本节中的头像上传,可以对图像进行裁剪,最终上传到服务器的是一个经过裁剪后的图像. 图像是保存在磁盘上的,数据库只负责保存头像的地址. 现在把 5-10上课资料文件夹中的imageUpload文件夹拷贝到5-10文件夹中. ima

Scala入门到精通——第二十四节 高级类型 (三)

作者:摆摆少年梦 视频地址:http://blog.csdn.net/wsscy2004/article/details/38440247 本节主要内容 Type Specialization Manifest.TypeTag.ClassTag Scala类型系统总结 在scala中,类(class)与类型(type)是两个不一样的概念.我们知道类是对同一类型数据的抽象,而类型则更详细. 比方定义class List[T] {}, 能够有List[Int] 和 List[String]等详细类型

第二十四节(Java文件流,缓冲流)

Java流 文件通常是由一连串的字节或字符构成,组成文件的字节序列称为字节流,组成文件的字符序列称为字符流. Java 中根据流的方向可 以分为输入流和输出流. 输入流是将文件或其它输入设备的数据加载到内存的过程: 输出流恰恰相反, 是将内存中的数据保存到文件或其他输出设备. 见图: 文件是由字符或字节构成, 那么将文件加载到内存或再将文件输出到文件, 需要有输入和输出流的支持,那么在 Java 语言中又把输入和输出流分为了两个,字节输入和输出流,字符输入和输出流 InputStream 是字节