当前位置: 首页 > news >正文

Mac上使用pyenv与venv搭建专业Django开发环境全攻略

1. 为什么在Mac上安装Django值得你花时间?

如果你是一个在Mac上搞开发的Pythoner,想快速搭建一个Web应用,或者正从Flask、FastAPI等其他框架转过来,那么Django几乎是你绕不开的一个选择。它不像某些轻量级框架那样“缺胳膊少腿”,Django自诩为“完美主义者的最后期限框架”,意思就是它自带了你开发一个成熟Web应用所需的大部分轮子——从用户认证、后台管理到ORM和表单处理,开箱即用。这能让你把精力集中在业务逻辑上,而不是反复造轮子。

但问题来了,很多新手,甚至一些有经验的开发者,在Mac这个看似优雅的系统上安装Django时,总会遇到一些“水土不服”的问题。比如,系统自带的Python 2.7(虽然现在新系统已经移除了,但影响深远)、多个Python版本共存导致的路径混乱、或者用了pip安装后却找不到django-admin命令。这些坑,我当年一个没落,全踩了一遍。所以,这篇教程的目的,不仅仅是告诉你敲哪几条命令,更重要的是帮你理清Mac下Python环境管理的逻辑,让你一次配置,长久受益,避免未来在依赖地狱里挣扎。

我们将从最干净、最推荐的方式开始:使用pyenv管理Python版本,再用pip安装Django。同时,我也会对比直接使用系统Python、Homebrew安装Python等不同方案的利弊,让你知其然更知其所以然。无论你是刚拿到新Mac的萌新,还是想重整开发环境的老手,这篇超过5000字的详实指南都能带你平滑上路。

2. 环境基石:为Django选择合适的Python家园

在安装Django之前,最重要的一步是准备好一个独立、干净的Python环境。Mac系统环境比较复杂,直接使用系统Python是极其不推荐的做法,原因有三:第一,系统Python的路径受系统保护,随意安装包可能需要sudo,容易引发权限问题并污染系统环境;第二,macOS系统组件可能依赖特定版本的Python,你的操作可能导致系统功能异常;第三,无法实现项目间Python版本的隔离。

因此,我们的核心思路是:为开发项目创建一个独立的、可复制的Python环境。主流方案有两个:虚拟环境(Virtual Environment)配合Python版本管理工具,或者使用Anaconda这类科学计算发行版。对于Web开发,特别是Django,我强烈推荐前者,因为它更轻量、更符合Python生态的标准实践。

2.1 方案对比:pyenv + venv 还是 Homebrew Python?

这是Mac用户最常面临的选择题。我们来拆解一下:

  • 直接使用Homebrew安装的Python: Homebrew安装的Python(例如brew install python@3.11)本身是一个独立的、较新版本的Python,比系统Python好。但它仍然是一个“全局”安装。如果你需要为不同项目切换不同的Python版本(比如一个项目用3.8,另一个用3.11),你需要反复brew unlinkbrew link,非常麻烦且容易出错。因此,它适合作为系统默认Python的升级替代,但不适合多版本项目管理。

  • 使用pyenv管理多版本,再结合venv创建虚拟环境: 这是目前社区公认的最佳实践pyenv是一个纯粹的Python版本管理工具,它可以让你在同一台机器上安装多个版本的Python,并轻松地在它们之间切换。而venv(Python 3.3+内置)或virtualenv(第三方)则用于在某个Python版本下,为每个项目创建独立的包安装目录,解决项目依赖冲突。优势:版本切换灵活,环境隔离彻底,与项目目录绑定,可复制性强(通过requirements.txt)。我们的选择:本教程将以此方案为主线进行详解。

2.2 第一步:安装Homebrew(如果尚未安装)

Homebrew是Mac的包管理器,几乎是Mac开发者的标配。我们将用它来安装pyenv。 打开终端(Terminal),执行以下命令:

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

安装过程中可能会提示你安装Xcode Command Line Tools,按提示确认即可。安装完成后,根据终端最后的提示,将Homebrew的可执行文件路径添加到你的shell配置文件(如~/.zshrc, 如果你用的是Zsh,这是macOS Catalina及之后版本的默认shell)中。命令通常如下:

echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> ~/.zshrc source ~/.zshrc

注意:如果你使用的是较旧的Mac或Bash shell,配置文件可能是~/.bash_profile。使用echo $SHELL可以查看当前shell。

2.3 第二步:使用Homebrew安装并配置pyenv

通过Homebrew安装pyenv非常简单:

brew update brew install pyenv

安装完成后,我们需要配置shell,让pyenv能够自动工作。将以下内容添加到你的~/.zshrc(或~/.bash_profile)文件末尾:

export PYENV_ROOT="$HOME/.pyenv" [[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH" eval "$(pyenv init -)"

然后让配置生效:

source ~/.zshrc

现在,你可以验证pyenv是否安装成功:

pyenv --version

2.4 第三步:用pyenv安装所需的Python 3版本

首先,查看pyenv可以安装哪些Python版本:

pyenv install --list | grep " 3\."

你会看到一个很长的列表。建议选择当前稳定的、且Django官方支持良好的版本。例如,Django 4.2 LTS支持Python 3.8到3.11。我们选择安装Python 3.11.9(请以最新稳定版为准):

pyenv install 3.11.9

这个过程会从源码编译Python,需要一些时间,请耐心等待。如果遇到编译错误,通常是缺少某些依赖库。常见的解决方法是使用Homebrew安装这些依赖:

brew install openssl readline sqlite3 xz zlib tcl-tk

安装完成后,我们可以查看当前系统所有通过pyenv管理的Python版本:

pyenv versions

输出中,带星号(*)的是当前全局激活的版本,通常是系统版本。现在,我们将刚安装的Python 3.11.9设置为全局默认版本

pyenv global 3.11.9

再次执行pyenv versions,你应该能看到3.11.9前面有了星号。验证一下:

python --version # 应输出:Python 3.11.9 which python # 应输出:/Users/你的用户名/.pyenv/shims/python

这个路径说明Python命令已经被pyenv接管,指向了我们指定的版本。

3. 创建项目专属的虚拟环境

现在我们有了干净的Python 3.11.9,接下来要为Django项目创建独立的虚拟环境。虚拟环境的核心价值在于“隔离”。想象一下,你项目A需要Django 4.2,项目B需要Django 3.2,如果没有虚拟环境,这两个版本在全局安装会冲突。虚拟环境为每个项目提供了一个独立的Python运行环境和pip包安装目录。

3.1 创建项目目录并初始化虚拟环境

首先,为你未来的Django项目创建一个总目录,并进入:

mkdir ~/Projects cd ~/Projects

然后,创建你的第一个Django项目目录,比如叫myblog

mkdir myblog cd myblog

现在,在这个项目目录下,使用Python内置的venv模块创建虚拟环境。虚拟环境目录通常命名为venv.venv

python -m venv venv

这条命令会在myblog文件夹内创建一个名为venv的子目录,里面包含了一个独立的Python解释器、pip工具等。

3.2 激活与使用虚拟环境

创建后,你需要“激活”这个环境,这样后续的所有pythonpip命令才会作用于这个隔离的环境。

  • 激活

    source venv/bin/activate

    激活后,你的命令行提示符前通常会显示环境名,如(venv) ~/Projects/myblog $

  • 验证

    which python # 应输出:/Users/你的用户名/Projects/myblog/venv/bin/python pip --version # 会显示pip的版本和其所在的路径(应在venv目录内)
  • 停用: 当你完成工作,想退出当前虚拟环境时,只需执行:

    deactivate

    提示符前的(venv)会消失。

重要心得:养成习惯,进入项目目录后,第一件事就是激活虚拟环境。很多“ModuleNotFoundError”错误,都是因为在没有激活环境的情况下安装包或运行程序导致的。你可以将激活命令写在项目目录的.env文件或shell别名里来简化操作。

4. 安装Django及其最佳搭档

虚拟环境激活后,我们就可以安全地安装Django了。这里不仅仅是运行一条安装命令,我会带你理解版本选择,并安装一些能极大提升开发体验的周边工具。

4.1 安装Django:版本选择与命令

使用pip安装最新稳定版的Django非常简单:

pip install django

但是,在生产环境中,直接安装最新版可能有风险。更专业的做法是指定一个具体版本,以确保环境的一致性。你可以先查看有哪些版本:

pip index versions django

假设我们选择安装Django 4.2.11(一个长期支持版本LTS):

pip install django==4.2.11

为什么选择LTS版本?LTS版本会获得更长时间的安全更新和支持(通常3年),对于需要长期维护的项目来说至关重要。非LTS版本的支持期可能只有8个月。

安装完成后,验证一下:

python -m django --version # 或 django-admin --version # 应输出:4.2.11

如果django-admin命令找不到,请检查虚拟环境是否已激活。在虚拟环境下,django-admin脚本会被安装到venv/bin/目录下。

4.2 强烈推荐:一同安装的开发效率工具

仅仅安装Django还不够,以下几个工具能让你在Mac上的Django开发如虎添翼,建议在项目初期就一并安装。

  1. ipython:一个增强的Python交互式Shell,支持自动补全、语法高亮、内省等功能,比原生的python manage.py shell好用太多。

    pip install ipython

    之后在Django项目中运行python manage.py shell,它会自动使用IPython。

  2. django-extensions:一个功能强大的Django第三方扩展集合,提供了诸如shell_plus(自动导入所有模型)、runserver_plus(带调试器的服务器)、graph_models(生成模型关系图)等神器。

    pip install django-extensions

    安装后需要将其添加到项目的settings.pyINSTALLED_APPS中。

  3. black 与 isort:代码格式化工具。black是“不妥协的代码格式化器”,能自动将你的代码格式化成统一的风格;isort则专门用于对import语句进行排序和分组。它们能让你从代码风格的争论中解放出来。

    pip install black isort
  4. psycopg2-binary:如果你计划使用PostgreSQL数据库(生产环境推荐),需要安装这个适配器。即使暂时不用,先装上也无妨。

    pip install psycopg2-binary

4.3 冻结依赖:生成requirements.txt

这是一个至关重要的步骤。requirements.txt文件记录了当前项目所有依赖包及其精确版本,是项目可复现性的保证。 在虚拟环境激活的状态下,运行:

pip freeze > requirements.txt

查看生成的requirements.txt文件,你会看到类似这样的内容:

asgiref==3.7.2 black==23.11.0 django==4.2.11 ...

最佳实践:将这个文件纳入版本控制(如Git)。当你的同事克隆项目,或者你在新机器上部署时,只需要创建虚拟环境,然后运行pip install -r requirements.txt,就能一键重建完全相同的依赖环境。

5. 创建第一个Django项目并验证安装

环境与工具都已就绪,现在让我们真正启动一个Django项目,验证一切是否工作正常。

5.1 使用django-admin创建项目

确保你在项目目录~/Projects/myblog下,并且虚拟环境已激活。然后执行:

django-admin startproject myblog_project .

注意命令最后的那个点.它表示在当前目录创建项目文件。如果不加点,Django会再创建一个名为myblog_project的子目录。

执行后,你的目录结构应该如下:

myblog/ ├── venv/ # 虚拟环境目录 ├── manage.py # Django项目管理脚本 ├── myblog_project/ # 项目配置目录 │ ├── __init__.py │ ├── settings.py # 项目设置文件,非常重要! │ ├── urls.py # 项目URL声明 │ └── wsgi.py # WSGI Web服务器接口 └── requirements.txt # 依赖列表

5.2 初步配置与数据库迁移

在启动服务器前,我们最好先对settings.py做一点安全调整,并初始化数据库。

  1. 修改ALLOWED_HOSTS(针对开发): 打开myblog_project/settings.py,找到ALLOWED_HOSTS。在开发阶段,我们可以暂时允许所有主机,或者添加本地地址:

    ALLOWED_HOSTS = ['*'] # 开发时可临时这样设置,生产环境绝不允许! # 或更安全的方式: # ALLOWED_HOSTS = ['localhost', '127.0.0.1']
  2. 执行数据库迁移: Django默认使用轻量级的SQLite数据库,无需额外配置。我们需要运行迁移命令来创建数据库文件和应用所需的数据表:

    python manage.py migrate

    这个命令会根据settings.pyINSTALLED_APPS的默认应用,在项目根目录生成一个db.sqlite3文件,并创建相应的表。

5.3 启动开发服务器并访问

Django自带一个轻量级的Web服务器,专为开发设计。运行:

python manage.py runserver

你会看到类似这样的输出:

Watching for file changes with StatReloader Performing system checks... System check identified no issues (0 silenced). December 07, 2023 - 10:00:00 Django version 4.2.11, using settings 'myblog_project.settings' Starting development server at http://127.0.0.1:8000/ Quit the server with CONTROL-C.

现在,打开你的Mac上的浏览器(Safari, Chrome等),访问http://127.0.0.1:8000/。你应该能看到Django的“火箭”欢迎页面,上面写着“The install worked successfully! Congratulations!”

恭喜!这标志着你的Django环境在Mac上已成功安装并运行。

6. 进阶配置与开发环境优化

基础环境搭好了,但要想开发得顺手,还需要一些优化。这部分是针对Mac环境的一些贴心设置。

6.1 配置Django使用自带的SQLite3(避免系统版本问题)

macOS自带的SQLite3版本可能较旧。虽然Python安装时通常包含了SQLite3,但为了确保一致性,Django会使用Python模块中的sqlite3。一般情况下这没问题。如果你遇到数据库相关错误,可以显式地告诉Django使用我们Python环境中的模块。在settings.pyDATABASES配置中,其实无需额外配置,因为它默认使用的就是Python的sqlite3模块。但你可以通过以下命令验证:

python -c "import sqlite3; print(sqlite3.sqlite_version)"

这个版本号应该与你安装的Python版本捆绑的SQLite一致。

6.2 使用django-extensions的增强功能

还记得我们安装的django-extensions吗?现在来配置它。编辑myblog_project/settings.py,找到INSTALLED_APPS列表,在最后添加:

INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', ... # 其他默认应用 'django_extensions', # 添加这一行 ]

现在你可以体验它的强大功能了:

  • 超级增强的Shell:运行python manage.py shell_plus,它会自动导入你项目中所有的模型,让你在调试时省去大量import语句。
  • 带Werkzeug调试器的Runserver:运行python manage.py runserver_plus,如果出现服务器错误,页面会显示一个交互式的调试器,可以直接在浏览器中执行代码片段来排查问题(注意:仅限开发环境,生产环境禁用!)。

6.3 设置环境变量与敏感信息管理

永远不要将密码、密钥等敏感信息硬编码在settings.py里并提交到代码仓库。推荐使用环境变量。在Mac上,我们可以在虚拟环境激活脚本中设置,或者使用.env文件配合python-dotenv库。

  1. 安装python-dotenv

    pip install python-dotenv
  2. 在项目根目录(manage.py同级)创建.env文件:

    touch .env
  3. .env文件中定义你的密钥(使用一个随机生成的字符串):

    SECRET_KEY=your-super-secret-random-key-here-make-it-very-long DEBUG=True
  4. 修改myblog_project/settings.py顶部,读取环境变量:

    import os from pathlib import Path from dotenv import load_dotenv # 加载.env文件 load_dotenv() # Build paths inside the project like this: BASE_DIR / 'subdir'. BASE_DIR = Path(__file__).resolve().parent.parent # SECURITY WARNING: keep the secret key used in production secret! SECRET_KEY = os.getenv('SECRET_KEY', 'a-default-fallback-key-for-dev-only') # SECURITY WARNING: don't run with debug turned on in production! DEBUG = os.getenv('DEBUG', 'False') == 'True'
  5. 至关重要:将.env添加到你的.gitignore文件中,确保它不会被提交。

6.4 集成VS Code(可选但推荐)

如果你使用VS Code,可以配置一个高效的工作区。

  1. 在项目根目录创建.vscode/settings.json
    { "python.defaultInterpreterPath": "${workspaceFolder}/venv/bin/python", "python.linting.enabled": true, "python.formatting.provider": "black", "python.formatting.blackArgs": ["--line-length", "88"], "[python]": { "editor.formatOnSave": true, "editor.codeActionsOnSave": { "source.organizeImports": true } }, "files.exclude": { "**/__pycache__": true, "**/*.pyc": true, "**/.pytest_cache": true, "**/.venv": true } }
  2. 安装VS Code的Python扩展。
  3. 打开项目时,VS Code会自动检测到虚拟环境venv,并提示你选择它作为解释器。选择后,所有代码补全、调试、格式化(保存时自动用black格式化并用isort整理imports)都会基于这个环境进行。

7. 常见问题排查与解决方案

即使按照教程一步步来,你也可能会遇到一些“特色”问题。这里我汇总了几个在Mac上安装Django时的高频坑点。

7.1 “zsh: command not found: python” 或 “python: command not found”

问题:在终端输入pythonpython3提示找不到命令。原因pyenv没有正确初始化,或者其shims目录不在PATH中。解决

  1. 确认已按照步骤2.3将pyenv init的配置添加到~/.zshrc并执行了source ~/.zshrc
  2. 检查PATH:echo $PATH,查看是否有/Users/你的用户名/.pyenv/shims路径。
  3. 尝试完全重启终端,或者新开一个终端标签页。

7.2 “Error: The ‘sqlite3’ module is not available.”

问题:运行python manage.py migrate时提示缺少sqlite3模块。原因:通过pyenv编译安装Python时,可能缺少SQLite3的开发头文件。解决

  1. 确保已通过Homebrew安装了sqlite3brew install sqlite3
  2. 重新安装Python,并在安装前指定sqlite3的路径。首先找到sqlite3的安装路径:
    brew --prefix sqlite3 # 输出类似:/opt/homebrew/opt/sqlite3
  3. 使用PYTHON_CONFIGURE_OPTS环境变量重新安装Python:
    PYTHON_CONFIGURE_OPTS="--with-sqlite3-libs=$(brew --prefix sqlite3)/lib --with-sqlite3-includes=$(brew --prefix sqlite3)/include" pyenv install 3.11.9

7.3 “django-admin: command not found”

问题:创建项目时找不到django-admin命令。原因:99%的情况是没有激活虚拟环境。Django被安装在了虚拟环境的bin目录下,全局路径中没有。解决

  1. 确保你已进入项目目录。
  2. 运行source venv/bin/activate激活虚拟环境。
  3. 再运行django-admin startproject ...

7.4 端口8000被占用

问题:运行runserver时提示Error: That port is already in use.解决:可以指定另一个端口运行服务器,例如使用8080端口:

python manage.py runserver 8080

然后访问http://127.0.0.1:8080/

7.5 安装包速度慢或超时

问题pip install时下载速度极慢,甚至超时。原因:默认的PyPI源在国外。解决:为pip配置国内镜像源。在虚拟环境下,创建或编辑~/.pip/pip.conf文件(Mac用户),内容如下:

[global] index-url = https://pypi.tuna.tsinghua.edu.cn/simple trusted-host = pypi.tuna.tsinghua.edu.cn

或者,在安装时临时指定源:

pip install django -i https://pypi.tuna.tsinghua.edu.cn/simple

8. 从安装到上手:创建你的第一个应用

环境彻底搞定后,让我们快速走一遍Django的标准工作流,感受一下它的魅力。

8.1 创建应用(App)

在Django中,项目(Project)是网站的配置集合,而应用(App)是一个实现具体功能的Web应用。一个项目可以包含多个应用。 在项目根目录(有manage.py的目录)下,运行:

python manage.py startapp articles

这会创建一个名为articles的应用目录,里面包含了模型(models.py)、视图(views.py)等文件。

8.2 定义模型并激活应用

编辑articles/models.py,创建一个简单的文章模型:

from django.db import models class Article(models.Model): title = models.CharField(max_length=200) content = models.TextField() created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) def __str__(self): return self.title

然后,将articles应用添加到项目配置中。编辑myblog_project/settings.pyINSTALLED_APPS列表:

INSTALLED_APPS = [ ..., 'articles', # 添加这一行 ]

8.3 创建并应用数据库迁移

每当你更改了模型(models.py),就需要创建迁移文件来记录这些更改,然后应用到数据库。

  1. 生成迁移文件:

    python manage.py makemigrations articles

    这会在articles/migrations/目录下生成一个类似0001_initial.py的文件。

  2. 应用迁移,更新数据库:

    python manage.py migrate

8.4 创建超级用户并探索Admin后台

Django的一大亮点是其自动生成的管理后台。首先,我们需要创建一个可以登录后台的超级用户:

python manage.py createsuperuser

按提示输入用户名、邮箱和密码。

然后,确保articles应用在后台可见。编辑articles/admin.py

from django.contrib import admin from .models import Article admin.site.register(Article)

现在,启动开发服务器(如果已停止):

python manage.py runserver

访问http://127.0.0.1:8000/admin/,用刚才创建的超级用户登录。你应该能看到“Articles”模型,并可以对其进行增删改查操作。至此,你已经完成了一个具备完整CRUD功能的Django应用雏形。

整个过程,从安装Python、Django,到创建项目、应用、模型,再到生成管理后台,Django的“电池内置”哲学体现得淋漓尽致。在Mac上搭建好这个稳固的环境,只是你Django之旅的起点。接下来,你可以深入探索视图(Views)、URL路由(URLs)、模板(Templates)来构建前端页面,或者研究Django REST Framework来构建API。记住,良好的开端是成功的一半,现在你的Mac已经拥有了一个专业、隔离且高效的Django开发环境,可以放心地去构建任何你想做的Web应用了。如果在后续开发中遇到环境问题,随时回看这篇指南中关于pyenv和虚拟环境的部分,它们是你保持环境清爽的基石。

http://www.cnnetsun.cn/news/4031653.html

相关文章:

  • LoRA+ControlNet+IP-Adapter三件套:精准控制AI绘画的终极工作流
  • VisualCppRedist AIO 完整指南:如何一键修复 Visual C++ 运行库缺失问题
  • 智能办公一体化架构:从AI能力中台到场景落地的实践指南
  • 彻底解决MSVCR100.dll缺失错误:DirectX修复工具使用指南与原理剖析
  • WarcraftHelper快速上手指南:让魔兽争霸3摆脱卡顿、画面拉伸与加载失败
  • Linux系统部署达梦数据库全流程指南:从安装配置到Navicat连接实战
  • Ubuntu 24.04 LTS深度调校:从安装到开发环境的实战优化指南
  • 从碎片化阅读到知识内化:构建个人知识处理流水线
  • 淘宝开放平台API接入实战:从签名授权到生产环境部署全解析
  • 投稿进度追踪太费时?免费浏览器插件 Elsevier Tracker 让我每天省下20分钟
  • 免模拟器在Windows装安卓APK:这个免费工具让手机应用直接上大屏
  • MIUI权限深度解析:NFC与Wi-Fi功能失效的AppOps排查与解决方案
  • 【单片机课程设计/毕业设计】基于 STM32 单片机的实时时钟智能服药装置设计 基于 STM32 的红外光电传感智能药盒控制系统开发(012903)
  • MySQL 8.0.25 安装配置全攻略:从零搭建稳定数据库环境
  • 数学建模竞赛:从资料借鉴到体系构建的实战指南
  • 数学建模竞赛学术诚信与公平性深度解析:违规类型、举报处理与健康参赛指南
  • IDEA、Git与Beyond Compare整合:打造高效代码对比与合并工作流
  • Git全流程实战:从环境配置到高效协作的完整指南
  • JSR303自定义校验实战:从原理到实现,告别臃肿的if-else
  • 动态配置AI模型:基于API的Codex模型路由与调用实战
  • 2026年苹果录音转文字工具实测对比:果粉怎么选,差距竟然这么大
  • 2026新手选荣耀录音转文字导出哪个好 实操经验总结
  • AES加密算法原理详解与Python/Node.js实战实现指南
  • MathorCup数学建模竞赛:从优化模型到团队协作的全流程实战指南
  • 数学建模竞赛中的时序预测与优化排班:从物流货量预测到人员调度实战
  • RJ45网线制作全攻略:从T-568B标准到实战排错
  • 《知了·金蝉偈》蝉不懂禅,妄称知了。蝉亦为禅,共佛新生。,,,遍历千情终有果,渡尽心劫有情佛。一个理工男,一个程序员,改行做诗歌,这是最满意的一个作品,阐述了一整个IP宇宙的最底层根基。堪称完美!
  • Windows 10家庭版MySQL 8.0初始化失败:从静默到成功的完整排错指南
  • Visual Studio C++异常处理模型:/EHa、/EHsc与/EHs的深度解析与工程实践
  • 阿里云技术面试复盘:从系统设计到故障排查的实战考察