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),这意味着每个请求都会在一个新的连接上发送,而不是复用现有的连接。
相关推荐
bing_1584 分钟前
简单工厂模式 (Simple Factory Pattern) 在Spring Boot 中的应用
spring boot·后端·简单工厂模式
天上掉下来个程小白29 分钟前
案例-14.文件上传-简介
数据库·spring boot·后端·mybatis·状态模式
xinxiyinhe35 分钟前
如何设置Cursor中.cursorrules文件
人工智能·python
诸神缄默不语1 小时前
如何用Python 3自动打开exe程序
python·os·subprocess·python 3
Asthenia04121 小时前
基于Jackson注解的JSON工具封装与Redis集成实战
后端
橘子师兄1 小时前
分页功能组件开发
数据库·python·django
编程星空1 小时前
css主题色修改后会多出一个css吗?css怎么定义变量?
开发语言·后端·rust
Logintern092 小时前
使用VS Code进行Python编程的一些快捷方式
开发语言·python
Multiple-ji2 小时前
想学python进来看看把
开发语言·python
程序员侠客行2 小时前
Spring事务原理 二
java·后端·spring