美文网首页Python学习
2018-06-07动态的web服务器

2018-06-07动态的web服务器

作者: 菩灵 | 来源:发表于2018-06-07 20:41 被阅读8次

动态网站:请求的后面是一个程序
WSGI,在被调用函数中的参数设置:

WSGI函数中的参数设置
import一个包名或者模块名,它能把这个包/模块给导进来,并且有一个返回值(和import re 功能一样),返回值是模块的当前名字

研究了一晚上的代码奉上:

# coding:utf-8

import socket
import re
import sys

# 定义一个常量用来接收客户端发起的文件请求地址
# 设置静态文件根目录
HTML_ROOT_DIR = "./html"
WSGI_PYTHON_DIR = "./wsgipython"

from multiprocessing import Process


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

    def start(self):
        self.server_socket.listen(128)
        while True:
            client_socket, client_address = self.server_socket.accept()
            print("[%s, %s]用户连接上了" % client_address)
            handle_client_process = Process(target=self.handle_client, args=(client_socket,))
            handle_client_process.start()
            client_socket.close()

    def start_response(self, status, headers):
        """
                 status = "200 OK"
            headers = [
                ("Content-Type", "text/plain")
            ]
            star
                """
        response_headers = "HTTP1.1 " + status + "\r\n"
        for header in headers:
            response_headers += "%s: %s\r\n" % header
        self.response_headers = response_headers



    def handle_client(self, client_socket):
        # 获取客户端请求
        request_data = client_socket.recv(1024)
        print(request_data)

        # 判断用户发来的请求
        # 使用splitlines来切割不同行
        request_lines = request_data.splitlines()
        for line in request_lines:
            print(line)

        # GET / HTTP/1.1
        request_start_line = request_lines[0]
        file_name = re.match(r"\w+ +(/[^ ]*) ", request_start_line.decode("utf-8")).group(1)
        method = re.match(r"(\w+) +/[^ ]* ", request_start_line.decode("utf-8")).group(1)

        # time.py
        if file_name.endswith(".py"):
            try:
                m = __import__(file_name[1:-3])
            except Exception:
                self.response_headers = "HTTP/1.1 404 Not Found\r\n"
                response_body = "not found"
            else:
                env = {
                    "PATH_INFO": file_name,
                    "METHOD": method
                }
                response_body = m.application(env, self.start_response)

            response = self.response_headers + "\r\n" + response_body

        else:
            # 通常把常量写在“左边”,变量写在右边,防止少写一个“=”不报错
            if "/" == file_name:
                file_name = "/index.html"

            # 打开文件,读取内容(客户有可能请求图片资源:加上b)
            try:
                file = open(HTML_ROOT_DIR + file_name, "rb")
            except IOError:
                response_start_line = "HTTP/1.1 404 NOT FOUND\r\n"
                response_headers = "Sever: My Sever\r\n"
                response_body = "The file is not found!"
            else:
                file_data = file.read()
                file.close()

                # 构造响应数据
                response_start_line = "HTTP/1.1 200 OK\r\n"
                response_headers = "Sever: My Sever\r\n"
                response_body = file_data.decode("utf-8")

            response = response_start_line + response_headers + "\r\n" + response_body
            print("response data:", response)

        # 向客户端形响应数据
        client_socket.send(bytes(response, "utf-8"))
        # 关闭客户端连接
        client_socket.close()

    def bind(self, port):
        self.server_socket.bind(("", port))


def main():
    sys.path.insert(1, WSGI_PYTHON_DIR)
    http_server = HTTPServer()
    # http_server.set_port()
    http_server.bind(8080)
    http_server.start()


if __name__ == "__main__":
    main()

还有一个附加目录的附加代码:

# coding:utf-8

import time

def application(env, start_response):
    status = "200 OK"
    headers = [
        ("Content-Type", "text/plain")
    ]
    start_response(status, headers)
    return time.ctime()

运行结果:


动态网站的运行结果

森罗万象的代码:
1、sys模块可以配合.insert用来添加模块导入时的搜索路径
2、第一次见到程序中定义了函数,在被导入的包中使用,再传会给程序
3、学习了元组的复加

相关文章

  • php中的数据库

    Xampp分为数据库服务器与web服务。web服务分为静态web服务器与动态web服务器访问用:localhost...

  • 2018-06-07动态的web服务器

    动态网站:请求的后面是一个程序WSGI,在被调用函数中的参数设置: 研究了一晚上的代码奉上: 还有一个附加目录的附...

  • 单点登录(cas)、缓存技术与负载均衡

    基于动态缓存的电子商务优化针对电子商务网站的特点和性能要求,在Web服务器前端设置动态缓存服务器,作为Web服务器...

  • Python mini-web框架1:WSGI-mini-web

    总体内容 1、多进程-web服务器面向对象web服务器,返回的是静态界面 2、静态资源、动态资源、web服务器支持...

  • Python web服务器

    Web静态服务器 显示静态的页面 首页.html 客户端浏览器 服务端 Web服务器动态资源请求 浏览器请求动态页...

  • JavaWeb入门到实战学习笔记

    了解,讲得并不是很好,很展开。 概念 动态web Web服务器 web服务器这节也是蜻蜓点水,引出tomcat而已...

  • Part II 3.从Web应用开始(Getting Start

    Web应用 在Java EE平台中,**Web组件**为Web服务器提供动态扩充的能力。Web组件可以是Java ...

  • 06-mini-web框架01

    web服务器静态资源、动态资源解析 WSGI WSGI允许开发者将选择web框架和web服务器分开,可以混合匹配w...

  • Flask-基础

    网页的分类 静态网页:无法与服务器进行交互的网页 动态网页:能够与服务器进行交互的网页 WEB与服务器 WEB 网...

  • JSP

    一、简介 JSP Java Server Pages,动态web技术。 web服务器中通过转为Servlet来调用...

网友评论

    本文标题:2018-06-07动态的web服务器

    本文链接:https://www.haomeiwen.com/subject/qdknsftx.html