WSGI-浏览器response-后台

本文介绍了WSGI协议的迭代版本,从静态资源处理到复杂功能实现。探讨了WSGI服务器与框架的区别,以及如何使用配置文件管理不同文件类型。同时,强调了动态网页静态化和安全性的重要性,并提供了代码示例。
摘要由CSDN通过智能技术生成

WSGI模版-迭代版本

测试文件夹地址:https://pan.baidu.com/s/1fZi1_6XYH_8fiPimLaM7XQ

还有一种方式是将自己的源码的文档,利用gitbook自动生成,将public文件夹作为源站一样可行。

相关的使用如:利用gitbook搭建自己的私人blog,或者是上传自己的文档书,由于.io有且仅有一个,被自己的blog地址所用,所以挂载的书(原名PythonAdvanced)。

格式如图.

第一版本

  • 只有静态的资源,只需要通过获取服务器对应文件目录的资源,并且发送到浏览器端即可.
import socket
import re
import multiprocessing


class WSGIServer(object):
    def __init__(self):
        self.tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        self.tcp_server_socket.bind(("", 12800))
        self.tcp_server_socket.listen(128)

    def service_client(self, new_socket):
        # GET / HTTP/1.1
        request = new_socket.recv(1024).decode("utf-8")

        request_lines = request.splitlines()
        print(request_lines)

        # splitlines[0]内容为:GET /index.html HTTP/1.1
        # [get, post, put, del]四者是通配的.
        file_name = ""
        ret = re.match(r"[^/]+(/[^ ]*)", request_lines[0])
        if ret:
            file_name = ret.group(1)
            if file_name == "/":
                file_name = "/index.html"



        # 读取服务器端额数据到浏览器,网站的整个文件保存在html文件夹下.
        try:
            f = open("./html" + file_name, "rb")
        except:
            response = "HTTP/1.1 404 NOT FOUND\r\n"
            response += "\r\n"
            response += "------file not found-----"
            new_socket.send(response.encode("utf-8"))
        else:
            html_content = f.read()
            f.close()
            # 发送的数据包的头文件格式,不合并发送的理由是若文件为单独的一张图片,error.
            response = "HTTP/1.1 200 OK\r\n"
            response += "\r\n"
            # 头文件发送一次.
            new_socket.send(response.encode("utf-8"))

            # 内容单独发送一次.
            new_socket.send(html_content)
        new_socket.close()


    def run_forever(self):
        while True:
            # 等待浏览器的链接请求.
            new_socket, client_addr = self.tcp_server_socket.accept()

            # 多线程服务浏览器的请求.
            p = multiprocessing.Process(target=self.service_client, args=(new_socket,))
            p.start()

            # 多进程需要该行,多线程不需要.
            new_socket.close()
        # 关闭服务器的监听<==>关闭服务器.
        self.tcp_server_socket.close()


def main():
    # 主函数,将具体的实现方式模块化.

    # 创建对象,or类的实例化<==>,启动服务器.
    wsgi_server = WSGIServer()

    # 完成浏览器的数据请求.
    wsgi_server.run_forever()


if __name__ == "__main__":
    main()

第二版本

  • 有简单额的数据,可以通过提交请求的后缀名称,判断数据是否是静态的,所以只需要在读取文件之间判断文件的扩展名称,再确定交给哪个处理端进行处理。

  • server端

import socket
import re
import multiprocessing
import time
import mini_frame


class WSGIServer(object):
    def __init__(self):
        self.tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

        self.tcp_server_socket.bind(("", 10500))

        self.tcp_server_socket.listen(128)

    def service_client(self, new_socket):
        request = new_socket.recv(1024).decode("utf-8")
        request_lines = request.splitlines()
        print(request_lines)
        file_name = ""
        ret = re.match(r"[^/]+(/[^ ]*)", request_lines[0])
        if ret:
            file_name = ret.group(1)
            if file_name == "/":
                file_name = "/index.html"
        if not file_name.endswith(".py"):
            try:
                f = open("./html" + file_name, "rb")
            except:
                response = "HTTP/1.1 404 NOT FOUND\r\n"
                response += "\r\n"
                response += "------file not found-----"
                new_socket.send(response.encode("utf-8"))
            else:
                html_content = f.read()
                f.close()
                response = "HTTP/1.1 200 OK\r\n"
                response += "\r\n"
                new_socket.send(response.encode("utf-8"))
                new_socket.send(html_content)
        else:
            header = "HTTP/1.1 200 OK\r\n"
            header += "\r\n"
            body = mini_frame.application(file_name)

            response = header+body
            new_socket.send(response.encode("utf-8"))
        new_socket.close()


    def run_forever(self):
        while True:
            new_socket, client_addr = self.tcp_server_socket.accept()
            p = multiprocessing.Process(target=self.service_client, args=(new_socket,))
            p.start()
            new_socket.close()
        self.tcp_server_socket.close()


def main():
    wsgi_server = WSGIServer()
    wsgi_server.run_forever()


if __name__ == "__main__":
    main()

  • mini_fram端
import time


def login():
    return "i----login--welcome hahahh to our website.......time:%s" % time.ctime()

def register():
    return "-----register---welcome hahahh to our website.......time:%s" % time.ctime()

def profile():
    return "-----profile----welcome hahahh to our website.......time:%s" % time.ctime()

def application(file_name):
	if file_name == "/login.py":
		return login()
	elif file_name == "/register.py":
		return register()
	else:
		return "not found you page...."

第三版本-WSGI

  • 更加复杂的功能,考虑使用WSGI协议,需要遵守的协议,或者叫做数据包的格式.

  • 需要注意的是:服务器是服务器,框架是框架,二者不能等同。

    • 服务器是只接受请求,发送来自框架的请求 并且 转发至客户浏览器.
    • 框架负责数据的处理,生成header or body .
# 格式固定,charset=utf-8说明浏览解码格式.
'200 OK', [('Content-Type', 'text/html;charset=utf-8')])
  • web-server
import socket
import re
import multiprocessing
import time
import mini_frame


class WSGIServer(object):
    def __init__(self):
        self.tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值