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),这意味着每个请求都会在一个新的连接上发送,而不是复用现有的连接。
相关推荐
m0_748256564 分钟前
Rust环境安装配置
开发语言·后端·rust
梅洪9 分钟前
ASP.NET Core API 前后端分离跨域
后端·bootstrap·asp.net
IT界的奇葩19 分钟前
基于springboot使用Caffeine
java·spring boot·后端·caffeine
rookiesx29 分钟前
springboot jenkins job error console log
spring boot·后端·jenkins
凡人的AI工具箱32 分钟前
40分钟学 Go 语言高并发教程目录
开发语言·后端·微服务·性能优化·golang
pzx_00133 分钟前
【论文阅读】相似误差订正方法在风电短期风速预报中的应用研究
开发语言·论文阅读·python·算法·leetcode·sklearn
每天写点bug37 分钟前
【golang】匿名内部协程,值传递与参数传递
开发语言·后端·golang
柠檬豆腐脑1 小时前
跨语言集成:将 Python 的强大功能带入 Nodejs 应用
前端·python·node.js
江上挽风&sty1 小时前
python爬虫--小白篇【爬虫实践】
爬虫·python
潘多编程1 小时前
Spring Boot性能提升:实战案例分析
java·spring boot·后端