展开菜单
首页 精品内容 本月促销 装机必备 Windows PDF教程 macOS软件 IOS软件 Android AI 专题
全部分类

当前位置:

首页 > 编程开发 > 使用Python开发自定义Web框架的步骤和方法

使用Python开发自定义Web框架的步骤和方法

开发自定义Web框架接收web服务器的动态资源请求,给web服务器提供处理动态资源请求的服务。根据请求资源路径的后缀名进行判断:如果请求资源路径的后缀名是.html则是动态资源请求,让web框架程序进行处理。否则是静态资源请求,让web服务器程序进行处理。1.开发Web服务器主体程序1、接受客户端HTTP请求(底层是TCP)#-*-coding:utf-8-*-#@File:My_Web_Server.py#@author:Flymeawei#@email:1071505897@qq.com#@Time:

开发自定义Web框架

接收web服务器的动态资源请求,给web服务器提供处理动态资源请求的服务。根据请求资源路径的后缀名进行判断:

如果请求资源路径的后缀名是.html则是动态资源请求, 让web框架程序进行处理。

否则是静态资源请求,让web服务器程序进行处理。

1.开发Web服务器主体程序

1、接受客户端HTTP请求(底层是TCP)

# -*- coding: utf-8 -*-
# @File  : My_Web_Server.py
# @author: Flyme awei 
# @email : 1071505897@qq.com
# @Time  : 2022/7/24 21:28


from socket import *
import threading


# 开发自己的Web服务器主类
class MyHttpWebServer(object):

    def __init__(self, port):
        # 创建 HTTP服务的 TCP套接字
        server_socket = socket(AF_INET, SOCK_STREAM)
        # 设置端口号互用,程序退出之后不需要等待,直接释放端口
        server_socket.setsockopt(SOL_SOCKET, SO_REUSEADDR, True)
        # 绑定 ip和 port
        server_socket.bind(('', port))
        # listen使套接字变为了被动连接
        server_socket.listen(128)
        self.server_socket = server_socket

    # 处理请求函数
    @staticmethod  # 静态方法
    def handle_browser_request(new_socket):
        # 接受客户端发来的数据
        recv_data = new_socket.recv(4096)
        # 如果没有数据,那么请求无效,关闭套接字,直接退出
        if len(recv_data) == 0:
            new_socket.close()
            return
            
# 启动服务器,并接受客户端请求
    def start(self):
        # 循环并多线程来接收客户端请求
        while True:
            # accept等待客户端连接
            new_socket, ip_port = self.server_socket.accept()
            print("客户端ip和端口", ip_port)
            # 一个客户端的请求交给一个线程来处理
            sub_thread = threading.Thread(target=MyHttpWebServer.handle_browser_request, args=(new_socket, ))
            # 设置当前线程为守护线程
            sub_thread.setDaemon(True)
            sub_thread.start()  # 启动子线程


# Web 服务器程序的入口
def main():
    web_server = MyHttpWebServer(8080)
    web_server.start()


if __name__ == '__main__':
    main()

2、判断请求是否是静态资源还是动态资源

 # 对接收的字节数据进行转换为字符数据
        request_data = recv_data.decode('utf-8')
        print("浏览器请求的数据:", request_data)
        request_array = request_data.split(' ', maxsplit=2)

        # 得到请求路径
        request_path = request_array[1]
        print("请求的路径是:", request_path)
        if request_path == "/":
            # 如果请求路径为根目录,自动设置为:/index.html
            request_path = "/index.html"
        # 判断是否为:.html 结尾
        if request_path.endswith(".html"):
            "动态资源请求"
           pass
        else:
            "静态资源请求"
            pass

 3、如果静态资源怎么处理?

使用Python开发自定义Web框架的步骤和方法

"静态资源请求"
            # 根据请求路径读取/static 目录中的文件数据,相应给客户端
            response_body = None  # 响应主体
            response_header = None  # 响应头的第一行
            response_first_line = None  # 响应头内容
            response_type = 'test/html'  # 默认响应类型
            try:
                # 读取 static目录中相对应的文件数据,rb模式是一种兼容模式,可以打开图片,也可以打开js
                with open('static'+request_path, 'rb') as f:
                    response_body = f.read()
                if request_path.endswith('.jpg'):
                    response_type = 'image/webp'

                response_first_line = 'HTTP/1.1 200 OK'
                response_header = 'Content-Length:' + str(len(response_body)) + '\r\n' + \
                                  'Content-Type: ' + response_type + '; charset=utf-8\r\n' + \
                                  'Date:' + time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()) + '\r\n' + \
                                  'Server: Flyme awei Server\r\n'

            # 浏览器读取的文件可能不存在
            except Exception as e:
                with open('static/404.html', 'rb') as f:
                    response_body = f.read()  # 响应的主体页面内容
                # 响应头
                response_first_line = 'HTTP/1.1 404 Not Found\r\n'
                response_header = 'Content-Length:'+str(len(response_body))+'\r\n' + \
                                  'Content-Type: text/html; charset=utf-8\r\n' + \
                                  'Date:' + time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()) + '\r\n' + \
                                  'Server: Flyme awei Server\r\n'
            # 最后都会执行的代码
            finally:
                # 组成响应数据发送给(客户端)浏览器
                response = (response_first_line + response_header + '\r\n').encode('utf-8') + response_body
                new_socket.send(response)
                # 关闭套接字
                new_socket.close()

使用Python开发自定义Web框架的步骤和方法

静态资源请求验证:

使用Python开发自定义Web框架的步骤和方法

4、如果动态资源又怎么处理

if request_path.endswith(".html"):
            "动态资源请求"
            # 动态资源的处理交给Web框架来处理,需要把请求参数交给Web框架,可能会有多个参数,采用字典结构
            params = {
                'request_path': request_path
            }
            # Web框架处理动态资源请求后,返回一个响应
            response = MyFramework.handle_request(params)
            new_socket.send(response)
            new_socket.close()

5、关闭Web服务器

new_socket.close()

Web服务器主体框架总代码展示:

# -*- coding: utf-8 -*-
# @File  : My_Web_Server.py
# @author: Flyme awei 
# @email : 1071505897@qq.com
# @Time  : 2022/7/24 21:28


import sys
import time
from socket import *
import threading
import MyFramework


# 开发自己的Web服务器主类
class MyHttpWebServer(object):

    def __init__(self, port):
        # 创建 HTTP服务的 TCP套接字
        server_socket = socket(AF_INET, SOCK_STREAM)
        # 设置端口号互用,程序退出之后不需要等待,直接释放端口
        server_socket.setsockopt(SOL_SOCKET, SO_REUSEADDR, True)
        # 绑定 ip和 port
        server_socket.bind(('', port))
        # listen使套接字变为了被动连接
        server_socket.listen(128)
        self.server_socket = server_socket

    # 处理请求函数
    @staticmethod  # 静态方法
    def handle_browser_request(new_socket):
        # 接受客户端发来的数据
        recv_data = new_socket.recv(4096)
        # 如果没有数据,那么请求无效,关闭套接字,直接退出
        if len(recv_data) == 0:
            new_socket.close()
            return

        # 对接收的字节数据进行转换为字符数据
        request_data = recv_data.decode('utf-8')
        print("浏览器请求的数据:", request_data)
        request_array = request_data.split(' ', maxsplit=2)

        # 得到请求路径
        request_path = request_array[1]
        print("请求的路径是:", request_path)
        if request_path == "/":
            # 如果请求路径为根目录,自动设置为:/index.html
            request_path = "/index.html"
        # 判断是否为:.html 结尾
        if request_path.endswith(".html"):
            "动态资源请求"
            # 动态资源的处理交给Web框架来处理,需要把请求参数交给Web框架,可能会有多个参数,采用字典结构
            params = {
                'request_path': request_path
            }
            # Web框架处理动态资源请求后,返回一个响应
            response = MyFramework.handle_request(params)
            new_socket.send(response)
            new_socket.close()
        else:
            "静态资源请求"
            # 根据请求路径读取/static 目录中的文件数据,相应给客户端
            response_body = None  # 响应主体
            response_header = None  # 响应头的第一行
            response_first_line = None  # 响应头内容
            response_type = 'test/html'  # 默认响应类型
            try:
                # 读取 static目录中相对应的文件数据,rb模式是一种兼容模式,可以打开图片,也可以打开js
                with open('static'+request_path, 'rb') as f:
                    response_body = f.read()
                if request_path.endswith('.jpg'):
                    response_type = 'image/webp'

                response_first_line = 'HTTP/1.1 200 OK'
                response_header = 'Content-Length:' + str(len(response_body)) + '\r\n' + \
                                  'Content-Type: ' + response_type + '; charset=utf-8\r\n' + \
                                  'Date:' + time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()) + '\r\n' + \
                                  'Server: Flyme awei Server\r\n'

            # 浏览器读取的文件可能不存在
            except Exception as e:
                with open('static/404.html', 'rb') as f:
                    response_body = f.read()  # 响应的主体页面内容
                # 响应头
                response_first_line = 'HTTP/1.1 404 Not Found\r\n'
                response_header = 'Content-Length:'+str(len(response_body))+'\r\n' + \
                                  'Content-Type: text/html; charset=utf-8\r\n' + \
                                  'Date:' + time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()) + '\r\n' + \
                                  'Server: Flyme awei Server\r\n'
            # 最后都会执行的代码
            finally:
                # 组成响应数据发送给(客户端)浏览器
                response = (response_first_line + response_header + '\r\n').encode('utf-8') + response_body
                new_socket.send(response)
                # 关闭套接字
                new_socket.close()

    # 启动服务器,并接受客户端请求
    def start(self):
        # 循环并多线程来接收客户端请求
        while True:
            # accept等待客户端连接
            new_socket, ip_port = self.server_socket.accept()
            print("客户端ip和端口", ip_port)
            # 一个客户端的请求交给一个线程来处理
            sub_thread = threading.Thread(target=MyHttpWebServer.handle_browser_request, args=(new_socket, ))
            # 设置当前线程为守护线程
            sub_thread.setDaemon(True)
            sub_thread.start()  # 启动子线程


# Web 服务器程序的入口
def main():
    web_server = MyHttpWebServer(8080)
    web_server.start()


if __name__ == '__main__':
    main()

2.开发Web框架主体程序

1、根据请求路径,动态的响应对应的数据

# -*- coding: utf-8 -*-
# @File  : MyFramework.py
# @author: Flyme awei 
# @email : 1071505897@qq.com
# @Time  : 2022/7/25 14:05

import time

# 自定义Web框架


# 处理动态资源请求的函数
def handle_request(parm):
    request_path = parm['request_path']

    if request_path == '/index.html':  # 当前请求路径有与之对应的动态响应,当前框架只开发了 index.html的功能
        response = index()
        return response
    else:
        # 没有动态资源的数据,返回404页面
        return page_not_found()


# 当前 index函数,专门处理index.html的请求
def index():
    # 需求,在页面中动态显示当前系统时间
    data = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())
    response_body = data
    response_first_line = 'HTTP/1.1 200 OK\r\n'
    response_header = 'Content-Length:' + str(len(response_body)) + '\r\n' + \
                      'Content-Type: text/html; charset=utf-8\r\n' + \
                      'Date:' + time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()) + '\r\n' + \
                      'Server: Flyme awei Server\r\n'
    response = (response_first_line + response_header + '\r\n' + response_body).encode('utf-8')
    return response


def page_not_found():
    with open('static/404.html', 'rb') as f:
        response_body = f.read()  # 响应的主体页面内容
    # 响应头
    response_first_line = 'HTTP/1.1 404 Not Found\r\n'
    response_header = 'Content-Length:' + str(len(response_body)) + '\r\n' + \
                      'Content-Type: text/html; charset=utf-8\r\n' + \
                      'Date:' + time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()) + '\r\n' + \
                      'Server: Flyme awei Server\r\n'

    response = (response_first_line + response_header + '\r\n').encode('utf-8') + response_body
    return response

2、如果请求路径,没有对应的响应数据也需要返回404页面

使用Python开发自定义Web框架的步骤和方法

3.使用模板来展示响应内容

1、自己设计一个模板 index.html ,中有一些地方采用动态的数据来替代




    
    
    
    首页 - 电影列表
    
    
    




        
        
                
                        
                        
                        
                 
                 电影列表
        
                                                  电影信息                         
  • 个人中心
  •                          
            
                                                   序号                     名称                     导演                     上映时间                     票房                     电影时长                     类型                     备注                     删除电影                          {%datas%}              

    2、怎么替代,替代什么数据

    response_body = response_body.replace('{%datas%}', data)

    使用Python开发自定义Web框架的步骤和方法

    4.开发框架的路由列表功能

    1、以后开发新的动作资源的功能,只需要:

    a、增加一个条件判断分支

    b、增加一个专门处理的函数

    2、路由: 就是请求的URL路径和处理函数直接的映射。

    3、路由表

    请求路径处理函数
    /index.htmlindex函数
    /user_info.htmluser_info函数
    # 定义路由表
    route_list = {
        ('/index.html', index),
        ('/user_info.html', user_info)
    }
    
    
    for path, func in route_list:
        if request_path == path:
            return func()
        else:
            # 没有动态资源的数据,返回404页面
            return page_not_found()

    注意:用户的动态资源请求,通过遍历路由表找到对应的处理函数来完成的。

    5.采用装饰器的方式添加路由

    1、采用带参数的装饰器

    # -*- coding: utf-8 -*-
    # @File  : My_Web_Server.py
    # @author: Flyme awei 
    # @email : 1071505897@qq.com
    # @Time  : 2022/7/24 21:28
    
    
    # 定义路由表
    route_list = []
    # route_list = {
    # ('/index.html', index),
    # ('/user_info.html', user_info)
    # }
    
    
    # 定义一个带参数的装饰器
    def route(request_path):  # 参数就是URL请求
        def add_route(func):
            # 添加路由表
            route_list.append((request_path, func))
    
            @wraps(func)
            def invoke(*args, **kwargs):
                # 调用指定的处理函数,并返回结果
                return func()
            return invoke
        return add_route
    
    
    # 处理动态资源请求的函数
    def handle_request(parm):
        request_path = parm['request_path']
    
        # if request_path == '/index.html':  # 当前请求路径有与之对应的动态响应,当前框架只开发了 index.html的功能
        #     response = index()
        #     return response
        # elif request_path == '/user_info.html':  # 个人中心的功能
        #     return user_info()
        # else:
        #     # 没有动态资源的数据,返回404页面
        #     return page_not_found()
        for path, func in route_list:
            if request_path == path:
                return func()
            else:
                # 没有动态资源的数据,返回404页面
                return page_not_found()

    2、在任何一个处理函数的基础上增加一个添加路由的功能

    @route('/user_info.html')

    小结:使用带参数的装饰器,可以把我们的路由自动的,添加到路由表中。

    6.电影列表页面的开发案例

    使用Python开发自定义Web框架的步骤和方法

    1、查询数据

    my_web.py

    # -*- coding: utf-8 -*-
    # @File  : My_Web_Server.py
    # @author: Flyme awei 
    # @email : 1071505897@qq.com
    # @Time  : 2022/7/24 21:28
    
    
    import socket
    import sys
    import threading
    import time
    import MyFramework
    
    
    # 开发自己的Web服务器主类
    class MyHttpWebServer(object):
    
        def __init__(self, port):
            # 创建HTTP服务器的套接字
            server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            # 设置端口号复用,程序退出之后不需要等待几分钟,直接释放端口
            server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
            server_socket.bind(('', port))
            server_socket.listen(128)
            self.server_socket = server_socket
    
        # 处理浏览器请求的函数
        @staticmethod
        def handle_browser_request(new_socket):
            # 接受客户端发送过来的数据
            recv_data = new_socket.recv(4096)
            # 如果没有收到数据,那么请求无效,关闭套接字,直接退出
            if len(recv_data) == 0:
                new_socket.close()
                return
    
            # 对接受的字节数据,转换成字符
            request_data = recv_data.decode('utf-8')
            print("浏览器请求的数据:", request_data)
            request_array = request_data.split(' ', maxsplit=2)
            # 得到请求路径
            request_path = request_array[1]
            print('请求路径是:', request_path)
    
            if request_path == '/':  # 如果请求路径为跟目录,自动设置为/index.html
                request_path = '/index.html'
    
            # 根据请求路径来判断是否是动态资源还是静态资源
            if request_path.endswith('.html'):
                '''动态资源的请求'''
                # 动态资源的处理交给Web框架来处理,需要把请求参数传给Web框架,可能会有多个参数,所有采用字典机构
                params = {
                    'request_path': request_path,
                }
                # Web框架处理动态资源请求之后,返回一个响应
                response = MyFramework.handle_request(params)
                new_socket.send(response)
                new_socket.close()
    
    
            else:
                '''静态资源的请求'''
                response_body = None  # 响应主体
                response_header = None  # 响应头
                response_first_line = None  # 响应头的第一行
                # 其实就是:根据请求路径读取/static目录中静态的文件数据,响应给客户端
                try:
                    # 读取static目录中对应的文件数据,rb模式:是一种兼容模式,可以打开图片,也可以打开js
                    with open('static' + request_path, 'rb') as f:
                        response_body = f.read()
                    if request_path.endswith('.jpg'):
                        response_type = 'image/webp'
                    response_first_line = 'HTTP/1.1 200 OK'
                    response_header = 'Server: Laoxiao_Server\r\n'
    
                except Exception as e:  # 浏览器想读取的文件可能不存在
                    with open('static/404.html', 'rb') as f:
                        response_body = f.read()  # 响应的主体页面内容(字节)
                    # 响应头 (字符数据)
                    response_first_line = 'HTTP/1.1 404 Not Found\r\n'
                    response_header = 'Server: Laoxiao_Server\r\n'
                finally:
                    # 组成响应数据,发送给客户端(浏览器)
                    response = (response_first_line + response_header + '\r\n').encode('utf-8') + response_body
                    new_socket.send(response)
                    new_socket.close()  # 关闭套接字
    
        # 启动服务器,并且接受客户端的请求
        def start(self):
            # 循环并且多线程来接受客户端的请求
            while True:
                new_socket, ip_port = self.server_socket.accept()
                print("客户端的ip和端口", ip_port)
                # 一个客户端请求交给一个线程来处理
                sub_thread = threading.Thread(target=MyHttpWebServer.handle_browser_request, args=(new_socket,))
                sub_thread.setDaemon(True)  # 设置当前线程为守护线程
                sub_thread.start()  # 子线程要启动
    
    
    # web服务器程序的入口
    def main():
        web_server = MyHttpWebServer(8080)
        web_server.start()
    
    
    if __name__ == '__main__':
        main()

    MyFramework.py

    # -*- coding: utf-8 -*-
    # @File  : My_Web_Server.py
    # @author: Flyme awei 
    # @email : 1071505897@qq.com
    # @Time  : 2022/7/24 21:28
    
    
    import time
    from functools import wraps
    import pymysql
    
    # 定义路由表
    route_list = []
    
    
    # route_list = {
    #     # ('/index.html',index),
    #     # ('/userinfo.html',user_info)
    # }
    
    # 定义一个带参数装饰器
    def route(request_path):  # 参数就是URL请求
        def add_route(func):
            # 添加路由到路由表
            route_list.append((request_path, func))
    
            @wraps(func)
            def invoke(*arg, **kwargs):
                # 调用我们指定的处理函数,并且返回结果
                return func()
    
            return invoke
    
        return add_route
    
    
    # 处理动态资源请求的函数
    def handle_request(params):
        request_path = params['request_path']
    
        for path, func in route_list:
            if request_path == path:
                return func()
        else:
            # 没有动态资源的数据,返回404页面
            return page_not_found()
        # if request_path =='/index.html': # 当前的请求路径有与之对应的动态响应,当前框架,我只开发了index.html的功能
        #     response = index()
        #     return response
        #
        # elif request_path =='/userinfo.html': # 个人中心的功能,user_info.html
        #     return user_info()
        # else:
        #     # 没有动态资源的数据,返回404页面
        #     return page_not_found()
    
    
    # 当前user_info函数,专门处理userinfo.html的动态请求
    @route('/userinfo.html')
    def user_info():
        # 需求:在页面中动态显示当前系统时间
        date = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())
        # response_body =data
    
        with open('template/user_info.html', 'r', encoding='utf-8') as f:
            response_body = f.read()
    
        response_body = response_body.replace('{%datas%}', date)
    
        response_first_line = 'HTTP/1.1 200 OK\r\n'
        response_header = 'Server: Laoxiao_Server\r\n'
    
        response = (response_first_line + response_header + '\r\n' + response_body).encode('utf-8')
        return response
    
    
    # 当前index函数,专门处理index.html的请求
    @route('/index.html')
    def index():
        # 需求:从数据库中取得所有的电影数据,并且动态展示
        # date = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())
        # response_body =data
        # 1、从MySQL中查询数据
        conn = pymysql.connect(host='localhost', port=3306, user='root', password='******', database='test', charset='utf8')
        cursor = conn.cursor()
        cursor.execute('select * from t_movies')
        result = cursor.fetchall()
        # print(result)
    
        datas = ""
        for row in result:
            datas += '''
                    %s
                    %s
                    %s
                    %s
                    %s 亿人民币
                    %s
                    %s
                    %s
                      
                    
                    ''' % row
        print(datas)
    
        # 把查询的数据,转换成动态内容
        with open('template/index.html', 'r', encoding='utf-8') as f:
            response_body = f.read()
    
        response_body = response_body.replace('{%datas%}', datas)
    
        response_first_line = 'HTTP/1.1 200 OK\r\n'
        response_header = 'Server: Laoxiao_Server\r\n'
    
        response = (response_first_line + response_header + '\r\n' + response_body).encode('utf-8')
        return response
    
    
    # 处理没有找到对应的动态资源
    def page_not_found():
        with open('static/404.html', 'rb') as f:
            response_body = f.read()  # 响应的主体页面内容(字节)
        # 响应头 (字符数据)
        response_first_line = 'HTTP/1.1 404 Not Found\r\n'
        response_header = 'Server: Laoxiao_Server\r\n'
        response = (response_first_line + response_header + '\r\n').encode('utf-8') + response_body
        return response

    2、根据查询的数据得到动态的内容

    使用Python开发自定义Web框架的步骤和方法

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发 Python web
    相关文章 更多
    精品专题 更多
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    macOS软件

    正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

    IOS软件

    正软商城iOS软件专区,精选适用于iPhone和iPad的办公、学习、影音、设计、效率及AI应用,提供功能介绍、适用设备、系统要求和正版获取方式等信息。

    AI

    正软商城AI软件专区,汇集AI写作、AI绘画、AI视频、AI办公、AI编程、AI翻译、智能客服和数据分析等人工智能工具,提供功能介绍、适用平台、收费方式及正版购买信息。

    Mac软件 更多
    WPS Office macOS版
    WPS Office macOS版

    WPS Office是一款面向macOS用户的综合办公套件,将文字处理、电子表格、演示文稿、PDF工具、模板与云协作整合在同一应用中。它兼容常见Microsoft Office格式,支持Intel及Apple芯片Mac,基础功能可免费使用,

    Shapr3D macOS版
    Shapr3D macOS版

    Shapr3D是一款面向工业设计、机械工程、建筑概念和三维打印工作流的CAD软件。Mac版采用Parasolid建模内核,支持草图约束、实体建模、工程图、可视化渲染及常见CAD格式交换,并可通过账户在多台设备之间同步项目。

    REAPER macOS版
    REAPER macOS版

    REAPER是Cockos开发的数字音频工作站,提供多轨音频与MIDI录制、剪辑、处理、混音和母带制作工具。Mac版兼容Intel与Apple芯片,支持AU、VST、VST3、CLAP等插件格式,并提供高度可定制的工作流程。

    Ableton Live macOS版
    Ableton Live macOS版

    Ableton Live 是面向音乐制作人与现场表演者的数字音频工作站,提供编曲视图、独具特色的现场视图、音频录制、MIDI创作、实时变速、乐器及效果器。Mac版原生支持Apple芯片,并可连接音频接口、MIDI控制器和第三方插件。

    Adobe After Effects macOS版
    Adobe After Effects macOS版

    Adobe After Effects 是面向动态图形、影视特效与视频合成的专业创作软件。它提供关键帧动画、遮罩抠像、运动跟踪、三维空间、文字动画和表达式等工具,并可与 Premiere Pro、Photoshop、Illustrator

    Adobe Audition macOS版
    Adobe Audition macOS版

    Adobe Audition 是面向播客、影视后期、音乐制作及内容创作者的专业音频工作站,提供波形精修、多轨录制与混音、频谱编辑、降噪修复、响度匹配和效果处理工具,并可与 Adobe Premiere 协同完成视频声音制作。

    Adobe Bridge macOS版
    Adobe Bridge macOS版

    Adobe Bridge 是面向摄影师、设计师及内容团队的免费数字资产管理工具,可集中预览照片、视频和 Adobe 项目文件,并利用评级、标签、关键词、元数据、筛选与收藏集完成分类检索。它还支持批量重命名、格式导出、相机导入及 Camera

    Adobe Illustrator macOS版
    Adobe Illustrator macOS版

    Adobe Illustrator 是 Adobe 推出的专业矢量图形设计软件,适合在 Mac 上制作标志、图标、插画、包装、信息图及印刷版面。它以路径和锚点构建可无损缩放的图形,并提供钢笔、形状、文字、图像描摹、渐变、画板及生成式功能。

    Adobe InDesign macOS版
    Adobe InDesign macOS版

    Adobe InDesign 是面向印刷品与数字出版物的专业版面设计软件,可在 Mac 上制作书籍、杂志、宣传册、海报、报告及交互式文档。它提供精细的文字样式、网格、母版、长文档管理和印前输出能力。

    Adobe Lightroom Classic macOS版
    Adobe Lightroom Classic macOS版

    Adobe Lightroom Classic 是面向桌面摄影工作流的照片管理与后期处理软件,可将原始照片保存在本地硬盘,通过目录、关键词、评分和收藏夹高效整理图库,并提供 RAW 冲印、蒙版、镜头校正、批量同步及多格式导出等功能。

    Adobe Media Encoder macOS版
    Adobe Media Encoder macOS版

    Adobe Media Encoder 是 Adobe 推出的专业音视频编码与转码工具,可通过队列、预设和监视文件夹批量完成格式转换、代理文件创建及多平台成片输出,并与 Premiere Pro、After Effects 等软件紧密协作。

    Adobe Photoshop macOS版
    Adobe Photoshop macOS版

    Adobe Photoshop 是面向摄影师、设计师和内容创作者的专业图像处理软件,提供图层、蒙版、选区、修复、调色、文字排版、智能对象及生成式编辑等能力。Mac 版支持 Intel 与 Apple Silicon 处理器。

    WINDOWS 更多
    Autodesk Fusion Windows版
    Autodesk Fusion Windows版

    Autodesk Fusion 是面向产品设计与制造的云连接开发平台,在统一环境中整合三维 CAD、CAM、CAE、PCB、工程图、数据管理和团队协作功能,适合产品设计师、机械工程师、电子工程师及加工制造团队完成从概念建模、验证分析到生产交

    Archicad Windows版
    Archicad Windows版

    Archicad 是 Graphisoft 面向建筑师、设计师、工程师及 BIM 团队开发的建筑信息模型平台。它把三维建筑建模、施工文档、数据管理、专业协调、实时协作和可视化集中在统一项目环境中,适合从概念方案到施工交付的完整建筑设计流程。

    Vectorworks Architect Windows版
    Vectorworks Architect Windows版

    Vectorworks Architect 是面向建筑师、室内设计师和建筑顾问的综合设计与BIM平台,覆盖概念草图、二维制图、三维建模、施工文档、数据报表、可视化及开放式协作。它强调自由造型与数据化建筑对象并存,

    Shapr3D Windows版
    Shapr3D Windows版

    Shapr3D 是一款基于 Siemens Parasolid 几何内核的专业三维CAD软件,可在 Windows 电脑和平板设备上完成草图绘制、实体建模、参数化修改、模型可视化及技术图纸制作。软件提供免费基础方案,

    FreeCAD Windows版
    FreeCAD Windows版

    FreeCAD 是面向机械设计、产品开发、建筑建模和创客项目的免费开源参数化三维 CAD 工具。它可在 Windows 上完成约束草图、实体零件、装配、工程图、BIM、有限元分析及 CAM 等任务,

    Twinmotion Windows版
    Twinmotion Windows版

    Twinmotion 是 Epic Games 推出的实时三维可视化工具,可导入常见 CAD、BIM 与三维模型,通过材质、环境、植被、灯光及动画资源快速构建场景,并输出图片、视频、全景图和交互演示。

    BricsCAD Windows版
    BricsCAD Windows版

    BricsCAD 是以 DWG 为核心格式的专业 CAD 平台,可用于二维制图、三维建模、工程文档与设计协作。产品按 Lite、Pro、BIM、Mechanical 和 Ultimate 等层级提供不同工具,

    Ableton Live Windows版
    Ableton Live Windows版

    Ableton Live 是面向音乐创作、录音、编曲、声音设计、混音与现场演出的数字音频工作站。它将适合即兴触发素材的 Session 视图与传统时间线编曲结合,并提供音频变速、MIDI工具、软件乐器、效果器和声音资源,

    FL Studio Windows版
    FL Studio Windows版

    FL Studio 是 Image-Line 推出的数字音频工作站,面向音乐制作人、编曲者、歌手及声音设计人员。它将步进音序、钢琴卷帘、音频录制、剪辑、混音、自动化和插件宿主整合在统一环境中,并提供大量乐器、效果器、采样与预设。

    Pro Tools Windows版
    Pro Tools Windows版

    Pro Tools 是 Avid 推出的专业数字音频工作站,提供多轨录音、音频剪辑、MIDI编曲、插件处理、自动化混音及影视声音制作能力。它适合音乐人、录音师、制作人和音频后期团队使用,并提供免费入门版、订阅方案及永久授权选择。

    Adobe Audition Windows版
    Adobe Audition Windows版

    Adobe Audition 是面向播客、影视后期、广播与音乐制作的专业音频工作站,提供波形编辑、多轨混音、频谱分析、录音、降噪修复和效果处理等功能。Windows 版通过 Adobe Creative Cloud 安装和管理,

    REAPER Windows版
    REAPER Windows版

    REAPER 是 Cockos 推出的数字音频工作站,适用于录音、MIDI 编曲、音频编辑、混音、母带制作及声音设计。软件安装包小巧,支持多轨录制、灵活路由、自动化、第三方插件和脚本扩展,并提供完整功能的 60 天免费评估期。