Node.js开发者的现代Python教程

介绍

Python,作为一种简洁、强大且广泛应用的编程语言,已经成为数据科学、人工智能、网络服务器开发等多个领域的主流语言。本教程旨在为熟悉Node.js的开发者提供一个现代Python的快速入门指南。

环境搭建

uv是一个使用Rust编写的Python项目和包管理工具

安装uv

bash 复制代码
curl -LsSf https://astral.sh/uv/install.sh | sh
source $HOME/.local/bin/env

使用uv安装Python

bash 复制代码
➜ uv python list
cpython-3.13.1+freethreaded-macos-aarch64-none    <download available>
cpython-3.13.1-macos-aarch64-none                 <download available>
cpython-3.9.6-macos-aarch64-none                  <download available>
...

选择一个版本并安装

bash 复制代码
uv python install cpython-3.9.6-macos-aarch64-none

创建项目

初始化一个项目

bash 复制代码
uv init demo && cd demo

同步项目依赖

bash 复制代码
uv sync

uv会根据 pyproject.toml.python-version 定义的项目依赖和Python版本依赖, 自动生成venv虚拟环境

激活虚拟环境

bash 复制代码
➜ uv venv
Using CPython 3.9.6 interpreter at: /Library/Developer/CommandLineTools/usr/bin/python3
Creating virtual environment at: .venv
Activate with: source .venv/bin/activate

使用当前项目的环境运行代码

bash 复制代码
uv run hello.py
Hello from demo!

安装依赖

Robyn是一个基于Rustuvloop构建的高性能Web框架,uvloop是一个基于libuv实现Python异步运行时

使用uv安装Robyn

bash 复制代码
uv add robyn

安装完成后可以看到项目的pyproject.toml文件中自动增加了对应的依赖项目版本和锁定版本的uv.lock文件

toml 复制代码
[project]
name = "demo"
version = "0.1.0"
description = "Add your description here"
readme = "README.md"
requires-python = ">=3.9.6"
dependencies = [
    "robyn>=0.64.2",
]

要卸载某个依赖项可以执行

bash 复制代码
uv remove [依赖项的名称]

Web开发

在项目中创建src目录,并在src目录中创建main.py入口文件

python 复制代码
from robyn import Robyn

app = Robyn(__file__)

@app.get("/")
async def h(request):
    return "Hello, world!"

app.start(port=8080)

启动项目

bash 复制代码
➜ uv run ./src/main.py --open-browser

INFO:robyn.logger:SERVER IS RUNNING IN VERBOSE/DEBUG MODE. Set --log-level to WARN to run in production mode.
INFO:robyn.logger:Robyn version: 0.37.0
INFO:robyn.logger:Starting server at 127.0.0.1:8080
INFO:robyn.logger:Press Ctrl + C to stop

INFO:actix_server.builder:starting 1 workers
INFO:actix_server.server:Actix runtime found; starting in Actix runtime
INFO:actix_server.server:starting service: "actix-web-service-127.0.0.1:8080", workers: 1, listening on: 127.0.0.1:8080

可以看到输出了 Hello, world!

命令行参数说明:

css 复制代码
--open-browser         启动成功后打开浏览器
--processes PROCESSES  进程数量[默认:1]
--workers WORKERS      工作者数量[默认:1]
--dev                  开发模式,可快速重启

在入口文件旁边创建robyn.env文件可以通过环境变量传递参数

python 复制代码
ROBYN_PORT=8888
ROBYN_DEV_MODE=True

中间件

python 复制代码
@app.before_request("/")
async def hello_before_request(request):
    print("before_request")
    return request

@app.after_request("/")
def hello_after_request(response):    
    print("after_request")
    return response

依赖注入

应用级依赖注入

python 复制代码
from robyn import Robyn, ALLOW_CORS

app = Robyn(__file__)
GLOBAL_DEPENDENCY = "GLOBAL DEPENDENCY"

app.inject_global(GLOBAL_DEPENDENCY=GLOBAL_DEPENDENCY)

@app.get("/sync/di")
def sync_di(request, global_dependencies):
    return global_dependencies["GLOBAL_DEPENDENCY"]

路由级依赖注入

python 复制代码
from robyn import Robyn, ALLOW_CORS

app = Robyn(__file__)
ROUTER_DEPENDENCY = "ROUTER DEPENDENCY"

app.inject(ROUTER_DEPENDENCY=ROUTER_DEPENDENCY)

@app.get("/sync/di")
def sync_di(request, router_dependencies):
    return router_dependencies["ROUTER_DEPENDENCY"]

异常处理

可根据异常的类型进行对应的处理

python 复制代码
@app.exception
def handle_exception(error):
    return Response(status_code=500, description=f"error msg: {error}", headers={})

使用Rust

src/rust目录中创建一个Rust文件

bash 复制代码
uv run robyn --create-rust-file rust_math
rust 复制代码
// rustimport:pyo3

use pyo3::prelude::*;

#[pyfunction]
fn square(n: i32) -> i32 {
    n * n
}

直接运行依赖Rust包的项目

python 复制代码
from robyn import Robyn
from rust.rust_math import square

app = Robyn(__file__)

@app.before_request("/")
async def hello_before_request(request):
    print("before_request")
    return request

@app.after_request("/")
def hello_after_request(response):    
    print("after_request")
    return response

@app.get("/")
async def h(request):
    return square(5)

app.start()
bash 复制代码
uv run ./src/main.py --compile-rust-path="."

性能测试

oha是一个使用Rust编写的HTTP基准测试工具,用于模拟多个客户端同时向服务器发送请求

使用oha测试项目

bash 复制代码
oha -z 5s -c 1000 -q 1000 --latency-correction --disable-keepalive http://127.0.0.1:8888/

-   `-z` 运行时间 5s 表示持续运行5秒
-   `-c` 并发连接数
-   `-q` 每秒查询次数(QPS)
-   `--latency-correction`:开启延迟校正,用于更准确地测量请求的响应时间。
-   `--disable-keepalive`:禁用HTTP持久连接(Keep-Alive),这意味着每个请求都会在一个新的连接上发送,而不是复用现有的连接。
相关推荐
上进小菜猪6 小时前
把 KES 集群交给 Kubernetes 的九十天:一个 DBA 的试用实录
后端
两点王爷7 小时前
PostgreSQL 常用 SQL 语句与 GIS 相关函数详解
数据库·后端
麻雀飞吧7 小时前
先判断工具用来学习、开发还是执行
人工智能·python
考虑考虑7 小时前
Springboot环境变量占位符语法
spring boot·后端·spring
人邮异步社区7 小时前
学习Python的最佳学习路径是什么?
python·程序员
步行cgn9 小时前
Spring 基于 XML 的自动装配:byName 详解
java·后端·spring
troy12810 小时前
Python 基础语法(九):Django/Flask/FastAPI 三大 Web 框架详细对比解析
python·jupyter·django·flask·github·fastapi
jzshmyt10 小时前
我用 Python 从零“生成“了一个宇宙,然后让它观察自己(v14)
人工智能·pytorch·python·numpy·matplotlib·空间计算·scipy
RISCV_Explorer11 小时前
RISC-V启动与运行时规范机制解析——BRS约定、HSM多核启动与设备树要求
后端·risc-v
星栈独行11 小时前
ADK-Rust 是什么?Rust 生态新一代 AI Agent 开发套件
人工智能·后端·rust