精华内容
下载资源
问答
  • Python搭建web服务器

    千次阅读 2020-05-15 11:35:23
    利用Python自带的包可以建立简单的web服务器。在DOS里cd到准备做服务器根目录的路径下,输入命令: python -mWeb服务器模块[端口号,默认8000] 例如: python -m SimpleHTTPServer 8080 在命令的开头加一个nohup...

    利用Python自带的包可以建立简单的web服务器。在DOS里cd到准备做服务器根目录的路径下,输入命令:

    • python -m Web服务器模块 [端口号,默认8000]

    例如:

    • python -m SimpleHTTPServer 8080

       在命令的开头加一个nohup,忽略所有的挂断信号,防止关闭bash或者ctrl c kill掉进程。

    • nohup python -m SimpleHTTPServer 8080 &

    然后就可以在浏览器中输入

    • http://localhost:端口号/html路径   来访问服务器资源。 

    例如:

    • http://localhost:8080/Desktop/index.html(当然index.html文件得自己创建)

    其他机器也可以通过服务器的IP地址来访问。(使用ifconfig查看本地ip)

    展开全文
  • python 搭建web服务器

    千次阅读 2018-04-30 19:12:19
    <p>Hello, web! ''' def do_GET(self): self.send_response(200) self.send_header("Content-type","text/html") self.send_header("Content-length",str(len(self.Page))) #字符串类型 self.end_headers...

    使用 httpie 在命令行进行测试


    1、最基本的:

    # _*_coding :utf-8 _*_
    import httpie
    from http.server import BaseHTTPRequestHandler,HTTPServer
    
    class RequestHandler(BaseHTTPRequestHandler):
        '''处理请求并返回页面'''
        # 页面模板
        Page = '''\
            <html>
            <body>
            <p>Hello, web!</p>
            </body>
            </html>
        '''
        def do_GET(self):
            self.send_response(200)
            self.send_header("Content-type","text/html")
            self.send_header("Content-length",str(len(self.Page))) #字符串类型
            self.end_headers()
            self.wfile.write(self.Page.encode())
    
    
    if __name__ == '__main__':
        print("server start...")
        serverAddr = ('',9999) #链接不上可能是端口号被占用 换个试试
        server = HTTPServer(serverAddr,RequestHandler)
        server.serve_forever()


    2、封装创建page,发送报文的方法

    # _*_coding :utf-8 _*_
    import httpie
    from http.server import BaseHTTPRequestHandler,HTTPServer
    
    class RequestHandler(BaseHTTPRequestHandler):
        '''处理请求并返回页面'''
        # 页面模板
        Page = '''
                <html>
                <body>
                <table>
                <tr>  <td>Header</td>         <td>Value</td>          </tr>
                <tr>  <td>Date and time</td>  <td>{date_time}</td>    </tr>
                <tr>  <td>Client host</td>    <td>{client_host}</td>  </tr>
                <tr>  <td>Client port</td>    <td>{client_port}</td> </tr>
                <tr>  <td>Command</td>        <td>{command}</td>      </tr>
                <tr>  <td>Path</td>           <td>{path}</td>         </tr>
                </table>
                </body>
                </html>
            '''
    
        def do_GET(self):
            page = self.create_page()
            self.send_content(page)
    
        def create_page(self):
            values = {
                'date_time': self.date_time_string(),
                'client_host': self.client_address[0],
                'client_port': self.client_address[1],
                'command': self.command,
                'path': self.path
            }
            page = self.Page.format(**values) #dict为参数的传递方式  **
            return page
    
    
        def send_content(self,page):
            self.send_response(200)
            self.send_header("Content-type", "text/html")
            self.send_header("Content-length", str(len(self.Page)))  # 字符串类型
            self.end_headers()
            self.wfile.write(page.encode()) #这里必须转化威字节(bytes)类型 否则报错
    
    
    
    
    if __name__ == '__main__':
        print("server start...")
        serverAddr = ('',9999) #链接不上可能是端口号被占用 换个试试
        server = HTTPServer(serverAddr,RequestHandler)
        server.serve_forever()



    3、增加了对路径的异常处理:

    # _*_coding :utf-8 _*_
    import httpie
    import sys,os
    from http.server import BaseHTTPRequestHandler,HTTPServer
    
    class RequestHandler(BaseHTTPRequestHandler):
        '''处理请求并返回页面'''
        # 页面模板
        Page = '''
                <html>
                <body>
                <table>
                <tr>  <td>Header</td>         <td>Value</td>          </tr>
                <tr>  <td>Date and time</td>  <td>{date_time}</td>    </tr>
                <tr>  <td>Client host</td>    <td>{client_host}</td>  </tr>
                <tr>  <td>Client port</td>    <td>{client_port}</td> </tr>
                <tr>  <td>Command</td>        <td>{command}</td>      </tr>
                <tr>  <td>Path</td>           <td>{path}</td>         </tr>
                </table>
                </body>
                </html>
            '''
        Error_Page = """\
            <html>
            <body>
            <h1>Error accessing {path}</h1>
            <p>{msg}</p>
            </body>
            </html>
         """
    
        def do_GET(self):
            try:
                #文件完整路径
                full_path = os.getcwd() + self.path
    
                #如果该路径不存在...
                if not os.path.exists(full_path):
                # 抛出异常:文件未找到
                    raise ServerException("'{0}' not found".format(self.path))
    
                # 如果该路径是一个文件
                elif os.path.isfile(full_path):
                # 调用 handle_file 处理该文件
                    self.handle_file(full_path)
    
                # 如果该路径不是一个文件
                # 抛出异常:该路径为不知名对象
                else:
                    raise ServerException("Unknown object '{0}'".format(self.path))
            except Exception as msg: #msg则是上面抛出的信息
                self.handle_error(msg)
    
    
        def create_page(self):
            values = {
                'date_time': self.date_time_string(),
                'client_host': self.client_address[0],
                'client_port': self.client_address[1],
                'command': self.command,
                'path': self.path
            }
            page = self.Page.format(**values) #dict为参数的传递方式  **
            return page
    
    
        def send_content(self,page): #这里不再是个server1一样了  需要传参数page
            self.send_response(200)
            self.send_header("Content-type", "text/html")
            self.send_header("Content-length", str(len(self.Page)))  # 字符串类型
            self.end_headers()
            self.wfile.write(page.encode())       #这里必须转化威字节(bytes)类型 否则报错
    
        def handle_file(self,full_path):
            try:
                with open(full_path,"r") as reader:  #读字节 故在sent_content()中不需要转化为bytes了
                    content = reader.read()
                self.send_content(content)
            except IOError as msg:
                msg = "'{0}' cannot be read :{1}".format(self.path,msg)
                self.handle_error(msg)
        def handle_error(self,msg):
            content = self.Error_Page.format(path = self.path,msg = msg)
            self.send_content(content)
    
    
    class ServerException(Exception):
    
        '''服务器内部错误'''
        pass
    
    if __name__ == '__main__':
        print("server start...")
        serverAddr = ('',9999) #链接不上可能是端口号被占用 换个试试
        server = HTTPServer(serverAddr,RequestHandler)
        server.serve_forever()

    plain.html为自己创建的静态网页


    4、增加了代码的重构,更加简明,易扩展

    #-*- coding:utf-8 -*-
    import sys, os, subprocess
    from http.server import HTTPServer,BaseHTTPRequestHandler
    
    #-------------------------------------------------------------------------------
    
    class ServerException(Exception):
        '''服务器内部错误'''
        pass
    
    #-------------------------------------------------------------------------------
    
    class base_case(object):
        '''条件处理基类'''
    
        def handle_file(self, handler, full_path):
            try:
                with open(full_path, 'r') as reader: #这里不要直接读城b 的否则会与下面的decode冲突
                    content = reader.read()
                handler.send_content(content)
            except IOError as msg:
                msg = "'{0}' cannot be read: {1}".format(full_path, msg)
                handler.handle_error(msg)
    
        def index_path(self, handler):
            return os.path.join(handler.full_path, 'index.html')
    
        def test(self, handler):
            assert False, 'Not implemented.'
    
        def act(self, handler):
            assert False, 'Not implemented.'
    
    #-------------------------------------------------------------------------------
    
    class case_no_file(base_case):
        '''文件或目录不存在'''
    
        def test(self, handler):
            return not os.path.exists(handler.full_path)
    
        def act(self, handler):
            raise ServerException("'{0}' not found".format(handler.path))
    
    #-------------------------------------------------------------------------------
    
    class case_cgi_file(base_case):
        '''可执行脚本'''
    
        def run_cgi(self, handler):
            data = subprocess.check_output(["python", handler.full_path])
            handler.send_content(data)
    
        def test(self, handler):
            return os.path.isfile(handler.full_path) and handler.full_path.endswith('.py')
    
        def act(self, handler):
            self.run_cgi(handler)
    
    #-------------------------------------------------------------------------------
    
    class case_existing_file(base_case):
        '''文件存在的情况'''
    
        def test(self, handler):
            return os.path.isfile(handler.full_path)
    
        def act(self, handler):
            self.handle_file(handler, handler.full_path)
    
    #-------------------------------------------------------------------------------
    
    class case_directory_index_file(base_case):
        '''在根路径下返回主页文件'''
    
        def test(self, handler):
            return os.path.isdir(handler.full_path) and os.path.isfile(self.index_path(handler))
    
        def act(self, handler):
            self.handle_file(handler, self.index_path(handler))
    
    #-------------------------------------------------------------------------------
    
    class case_always_fail(base_case):
        '''默认处理'''
    
        def test(self, handler):
            return True
    
        def act(self, handler):
            raise ServerException("Unknown object '{0}'".format(handler.path))
    
    #-------------------------------------------------------------------------------
    
    class RequestHandler(BaseHTTPRequestHandler):
        '''
        请求路径合法则返回相应处理
        否则返回错误页面
        '''
    
        Cases = [case_no_file(),
                 case_cgi_file(),
                 case_existing_file(),
                 case_directory_index_file(),
                 case_always_fail()]
    
        # 错误页面模板
        Error_Page = """
            <html>
            <body>
            <h1>Error accessing {path}</h1>
            <p>{msg}</p>
            </body>
            </html>
            """
    
        def do_GET(self):
            try:
    
                # 得到完整的请求路径
                self.full_path = os.getcwd() + self.path
    
                # 遍历所有的情况并处理
                for case in self.Cases:
                    if case.test(self):
                        case.act(self)
                        break
    
            # 处理异常
            except Exception as msg:
                self.handle_error(msg)
    
        def handle_error(self, msg):
            content = self.Error_Page.format(path=self.path, msg=msg)
            self.send_content(content, 404)
    
        # 发送数据到客户端
        def send_content(self, content, status=200):
            self.send_response(status)
            self.send_header("Content-type", "text/html")
            self.send_header("Content-Length", str(len(content)))
            self.end_headers()
            self.wfile.write(content.encode())
    
    #-------------------------------------------------------------------------------
    
    if __name__ == '__main__':
        print("server start...")
        serverAddress = ('', 9999)
        server = HTTPServer(serverAddress, RequestHandler)
        server.serve_forever()

    此时的 状态为 404了


    参考:https://zhuanlan.zhihu.com/p/21323273?utm_source=qq&utm_medium=social

    展开全文
  • 静态文件多进程版:—————————————————————————————————————————————阅读本代码需要的前期知识:1、Python网络编程2、了解HTTP协议3、多进程,多线程4、socket套接字5、...

    静态文件多进程版:

    —————————————————————————————————————————————

    阅读本代码需要的前期知识:

    1、Python网络编程

    2、了解HTTP协议

    3、多进程,多线程

    4、socket套接字

    5、WSGI协议

    # coding:utf-8

    import socket

    import re

    from multiprocessing import Process

    # 设置静态文件根目录

    HTML_ROOT_DIR = "./html"

    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[0],client_address[1]))

    print("[%s, %s]用户连接上了" % client_address)

    handle_client_process = Process(target=self.handle_client, args=(client_socket,))

    handle_client_process.start()

    client_socket.close()

    def handle_client(self, client_socket):

    """处理客户端请求"""

    # 获取客户端请求数据

    request_data = client_socket.recv(1024)

    print("request data:", request_data)

    request_lines = request_data.splitlines()

    for line in request_lines:

    print(line)

    # 解析请求报文

    # 'GET / HTTP/1.1'

    request_start_line = request_lines[0]

    # 提取用户请求的文件名

    print("*" * 10)

    print(request_start_line.decode("utf-8"))

    file_name = re.match(r"\w+ +(/[^ ]*) ", request_start_line.decode("utf-8")).group(1)

    if "/" == file_name:

    file_name = "/index.html"

    # 打开文件,读取内容

    try:

    file = open(HTML_ROOT_DIR + file_name, "rb")

    except IOError:

    response_start_line = "HTTP/1.1 404 Not Found\r\n"

    response_headers = "Server: My server\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 = "Server: My server\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():

    http_server = HTTPServer()

    # http_server.set_port

    http_server.bind(8000)

    http_server.start()

    if __name__ == "__main__":

    main()

    动态WEB服务器(WSGI实现)

    —————————————————————————————————————————————

    服务器文件代码:

    # coding:utf-8

    import socket

    import re

    import sys

    from multiprocessing import Process

    # 设置静态文件根目录

    HTML_ROOT_DIR = "./html"

    WSGI_PYTHON_DIR = "./wsgipython"

    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[0],client_address[1]))

    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 = "HTTP/1.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:", request_data)

    request_lines = request_data.splitlines()

    for line in request_lines:

    print(line)

    # 解析请求报文

    # 'GET / HTTP/1.1'

    request_start_line = request_lines[0]

    # 提取用户请求的文件名

    print("*" * 10)

    print(request_start_line.decode("utf-8"))

    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)

    # "/ctime.py"

    # "/sayhello.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"

    # 打开文件,读取内容

    try:

    file = open(HTML_ROOT_DIR + file_name, "rb")

    except IOError:

    response_start_line = "HTTP/1.1 404 Not Found\r\n"

    response_headers = "Server: My server\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 = "Server: My server\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(8000)

    http_server.start()

    if __name__ == "__main__":

    main()

    动态文件代码:

    import time

    def application(env, func):

    headers = "200 OK"

    response = [

    ("Content-Type","text/plain")

    ]

    func(headers,response)

    return str(time.time())

    展开全文
  • python -m SimpleHTTPServer 8080 #不指定端口默认为8000执行上面的命令,就会启动web服务器了,可以下载用户启动路径的文件。一个网友根据SimpleHTTPServer源码写了一个支持上传功能的版本。我贴到附件。保持后台...

    python -m SimpleHTTPServer 8080 #不指定端口默认为8000

    执行上面的命令,就会启动web服务器了,可以下载用户启动路径的文件。一个网友根据SimpleHTTPServer源码写了一个支持上传功能的版本。我贴到附件。

    保持后台运行,退出shell也不会关闭的命令

    nohup python -m SimpleHTTPServer 8080 &

    结束后台进程

    eval $(ps -ef | grep "[0-9] python -m SimpleHTTPServer" | awk '{print "kill "$2}')

    一键脚本

    wget -N --no-check-certificate http://diannaobos.com/zb_users/upload/2018/07/pythonhttp.sh && chmod +x pythonhttp.sh

    启动HTTP

    bash pythonhttp.sh start

    停止HTTP

    bash pythonhttp.sh stop

    查看日志(日志位于你开放HTTP的文件夹内):

    cat httpserver.log

    如果你需要持续的查看/监控日志,那可以使用这个命令:

    tail -f httpserver.log

    展开全文
  • 簡易web服務器web服務器是指在物理服務器上搭建的網絡連接服務器,時刻等待客戶端的請求,並作出響應。客戶端與服務器的通信,是以HTTP協議進行的,客戶端可以是任意支持HTTP協議的軟件客戶端在向服務器發送HTTP請求...
  • 搭建Python + Apache + mod_python环境:1、说起服务器,当然少不了Apache,不用安装这么麻烦,下载个XAMPP就好了,注意里面的Apache要是2.2版本。2、下载Python2.5.x,安装,也要注意版本。3、下载mod_python-...
  • {"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":6,"count":6}]},"card":[{"des":"云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT ...
  • 在在服服务务器器上上安安装装python3.8.2环环境境的的教教程程详详解解 这篇文章主要介绍了在服务器上安装python3.8.2环境的教程详解,本文给大家介绍的非常详细对大家的学习或工 作具有一 的参考借鉴价值需要的朋友...
  • 用Pyhton可以非常快速的搭建平台,下面直接上代码:直接安装好python后,命令行里执行 python xxx.py即可~// 包含的库from http.server import HTTPServer, BaseHTTPRequestHandlerimport jsonimport ssl// 全局的...
  • ubuntu 是自带python2.7的,如果要使用python3.x,可以直接安装对应的版本,千万不要卸载以前的版本,因为其他库的运行需要借助python2.7让linux 在tab时对大小写不敏感bind "set completion-ignore-case on"1....
  • {"optioninfo":{"dynamic":"true",..."一站式研发平台快速搭建移动应用,包括HTTPDNS、移动推送、移动热修复、 移动测试、移动监控等,打造移动应用全周期服务能力","liveButtonName":"立即开通","liveButtonLink":...
  • python搭建web服务器,与ajax交互,接收处理Get和Post请求;简单实用,没有用框架,适用于简单需求,更多功能可进行扩展。 python有自带模块BaseHTTPServer、CGIHTTPServer、SimpleHTTPServer,详细功能可参考API...
  • {"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":6,"count":6}]},"card":[{"des":"云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT ...
  • {"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":6,"count":6}]},"card":[{"des":"云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT ...
  • linux下用python搭建web服务器

    千次阅读 2018-05-11 21:14:59
    web服务器是指在物理服务器上搭建的网络连接服务器,时刻等待客户端的请求,并作出响应。 客户端与服务器的通信,是以HTTP协议进行的,客户端可以是任意支持HTTP协议的软件 客户端在向服务器发送HTTP请求前,先建立...
  • 我们都知道在Web开发中,都需要服务器,比如Java Web开发的Tomcat,WebLogic,WebSphere,现在来看利用Tornado Web Server框架如何写一个简易的Python服务器。一般来说只需要实现get和post方法就可以了。以上次使用...
  • 1 """Simple HTTP Server.23 This module builds on BaseHTTPServer by implementing the standard GET4 and HEAD requests in a fairly straightforward manner.56 """789 __version__ = "0.6"1011 __all__ = ["Sim...
  • 使用Python服务器, 例如这里想把命令D:\wwwroot作为网站根目录, 那么在cmd里cd到该目录下, cd是改变目录,变盘符不能用。你输入D:回车即可 C:\Users\Administrator\Desktop>D: /*切换到D盘*/ D:\>cd...
  • 容器:一种服务调用规范框架,J2EE 大量运用了容器和组件技术来构建分层的企业级应用。...WEB 容器给处于其中的应用程序组件(JSP,SERVLET)提供一个环境,使 JSP,SERVLET 直接跟容器中的环境变量交互,不必...
  • 本文主要介绍如何从零开始,进行一个 django 框架下 web 服务器搭建,这里只简要介绍搭建的步骤。 1、首先,cmd进入命令行,切换当前目录到你要在哪里进行创建项目的目录下,比如我在 D:\web\ 下创建目录,则如下...
  • 一、ApacheApache是世界使用排名第一的Web服务器软件。它可以运行在几乎所有广泛使用的计算机平台上,由于其跨平台和安全性被广泛使用,是最流行的Web服务器端软件之一。它快速、可靠并且可通过简单的API扩充,将...
  • 准备也学学Python,GUI的库太大了,学起来周期太长,先搞搞Web,入了门再说。 先搭建Python + Apache + mod_python环境: 1、说起服务器,当然少不了Apache,不用安装这么麻烦,下载个XAMPP就好了,注意里面的...
  • 简单的说,web服务器就是机器上监听了本地的IP和端口的一个进程,当有客户的请求进来时,它会响应客户的请求并返回相应的信息。客户端和服务端之间的通信基于HTTP协议,客户端可以是浏览器或者任何支持HTTP的应用。...
  • 一、基本概念实验1: 在阿里云上部署Tomcat服务器业务背景Tomcat为网站的服务器,每个网站在后面都有一个服务器来解析那个网页,Tomcat 对于 Java 来说它就是一个 Servlet 处理器,支持运行基于 Servlet 的 Java 程序...
  • 主要介绍了Python 搭建Web站点系列文章的第一篇,主要给大家简单介绍Web服务器与Web框架的相关资料,需要的朋友可以参考下
  • {"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":6,"count":6}]},"card":[{"des":"云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT ...
  • Python搭建简单的web服务器1.win+R输入cmd打开命令行2.通过cd进入到你保存 HTML 文件的目录。例如:H:\D3\d3输入 cd\ 指令进入到C盘的根目录。(CD(更改目录)。使用此命令可以更改当前目录)这里解释一下cd指令基本...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,989
精华内容 795
关键字:

python搭建web服务器

python 订阅