尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Python Django实战:从环境搭建到CRUD与部署全流程
《Python Django大师班构建真实Web应用》中文语音第一部分的内容并不是从概念讲起而是直接带你走一遍“从零到能跑Web应用”的完整链路。很多人学Django卡住的第一个点往往不是框架本身而是环境装不明白、项目结构看不懂、数据操作写不通。第一部分把这些一次性解决Python环境安装与验证、虚拟环境建立、Django安装、项目与App初始化、数据模型迁移、ORM增删改查全部按真实开发顺序走通。对于想用Python做Web应用、但又不想只停留在“看教程”阶段的开发者来说这一部分的价值是可以照着敲、敲完就能继续往下做。这篇文章会按照第一部分的开发主线重新整理一遍同时把环境配置、工程骨架、ORM查询和常见问题单独放大方便后续复习和排查。如果你最近刚从Flask或其他脚本类Python项目转过来这一篇的路径会更贴近Django实际工程习惯。1. 核心能力速览第一部分虽然只占总课程的四分之一但覆盖的知识密度并不低。先看整体情况。能力项说明技术栈Python Django SQLite 的开发组合适合Web应用起步第一部分重点Python环境安装、虚拟环境、Django安装、项目初始化、ORM与增删改查运行方式命令行启动开发服务器浏览器访问本地地址硬件要求普通开发电脑即可CPU和内存不是瓶颈磁盘建议预留5GB以上系统支持Windows、Linux、macOS 均可服务器部署可考虑宝塔面板数据库开发阶段默认SQLite业务扩大后可以迁移到MySQL或PostgreSQL核心产出能运行的项目工程、可管理的数据模型、完整的请求响应链路可扩展方向Admin后台、模板系统、REST API、部署上线Django本身作为Python Web开发的主流框架自带ORM、Admin后台、模板引擎、路由系统和安全防护机制。这意味着第一部分搭建好的工程骨架后续可以直接承载用户系统、内容管理、数据后台等真实业务模块。2. 适用场景与使用边界2.1 适合什么人学这套课程第一部分最适合两类开发者。第一类是刚入门Python准备做第一个Web应用的人因为Django把Web开发最常见的功能都集成好了不需要自己拼装路由、数据库连接和模板引擎。第二类是已经在用Flask等其他框架、希望转向重量级框架的开发者Django的“约定大于配置”和自带后台能明显减少重复开发。从职业角度来看Django同样适合企业内部管理系统、数据管理平台、内容网站和信息类应用的后端开发。这类产品通常需要多张数据表、后台管理、权限控制和表单处理Django本身的设计目标就是搞定这些需求。2.2 不适合什么场景Django不适合的场景也要说清楚。如果业务需要极高的实时交互比如在线协同编辑、游戏服务端或大规模WebSocket推送Django本身并不是最优选择。虽然Django支持异步视图和WebSocket但第一部分的传统视图方式是请求-响应模式不适合需要长连接和高频推送的架构。如果业务完全依赖非关系型数据库比如只用MongoDB、Redis做持久化存储Django ORM的优势也会减弱。Django默认面向关系型数据库虽然可以通过第三方库扩展但不如原生就做偏向NoSQL的框架直接。极致低延迟、超高性能的纯网关类服务也不是Django的典型场景。2.3 开发合规与软件使用边界学习Django时要从Python官网和Django官网下载官方安装包避免使用来路不明的修改版本。生产环境部署时依赖包版本要锁定避免意外升级引入兼容问题。调用第三方服务或接入外部数据时需要确认数据来源是否已获授权尤其是用户信息、版权素材和商业数据。Django项目上线后要设置合理的请求访问权限不要把Debug模式暴露到公网。3. Python环境准备与安装3.1 先确认Python版本Django是Python Web框架环境前提是安装一个可用的Python解释器。从主流实践来看建议选择Python 3.10以上的稳定版本因为当前主流Django版本对Python 3新特性支持更好同时也能保持较好的兼容性。安装之前可以先在终端检查是否已经存在Python环境。打开命令行窗口分别执行以下命令。python --version python3 --version pip --version如果系统返回类似Python 3.12.x的版本信息说明已经安装了Python。如果提示命令不存在或者版本过低就需要重新安装。这里有一个常见的判断点Windows环境通常会显示pythonLinux和macOS可能存在python与python3两个命令的区分建议以实际返回结果为准。3.2 Windows与Linux下的Python安装Windows安装Python比较简单去Python官网下载对应系统的安装包安装时务必勾选“Add Python to PATH”这一步决定了后续能否直接在命令行调用Python。安装完成后打开新的终端窗口执行python --version确认安装成功。Linux环境常见的是Debian/Ubuntu系和CentOS系。Debian系可以使用apt安装CentOS系可以使用yum或dnf安装部分服务器可能没有预装Python 3需要先更新软件源再安装。sudo apt update sudo apt install python3 python3-pip python3-venv有些Linux发行版会同时存在Python 2和Python 3建议统一使用python3和pip3命令避免误用旧版本。3.3 创建虚拟环境虚拟环境是Python项目开发的基础习惯作用是把当前项目的依赖与系统全局依赖隔离。这样不同项目使用不同版本的Django或第三方库时不会互相冲突。创建虚拟环境时在项目目录下执行mkdir django-project cd django-project python -m venv venvWindows激活虚拟环境venv\Scripts\activateLinux和macOS激活虚拟环境source venv/bin/activate激活后命令行提示符前面会出现(venv)字样说明当前已经处于虚拟环境中。后面的Django安装和命令执行都建议在这个环境里进行。3.4 安装Django与常用依赖激活虚拟环境后使用pip安装Django。pip install django安装完成后验证版本。python -m django --version如果输出Django版本号说明安装成功。除了Django本体真实项目通常还会伴随一些工具包。比如在工业项目中经常需要同时安装django、pymodbus和requests用于Web管理界面与Modbus协议设备通信、外部HTTP接口请求。统一安装的方式如下pip install django pymodbus requests这里需要说明pymodbus是Modbus协议通信库requests是HTTP请求库它们不是Web应用的必要组成部分而是根据业务需求自行补充的工具包。只有Django是框架本体。3.5 VS Code的Python开发环境配置如果使用VS Code作为开发工具建议安装Python扩展。打开VS Code扩展市场搜索“Python”安装微软官方发布的扩展即可。安装后在项目根目录打开命令行激活虚拟环境再启动VS Code通常可以自动识别当前虚拟环境。code .VS Code底部状态栏可以切换解释器选择虚拟环境中的venv解释器。这样运行代码、调试和补全提示都会基于当前项目的依赖环境不会跟全局环境混淆。4. Django项目创建与App设计4.1 创建项目虚拟环境和Django准备就绪后开始创建项目。项目名称可以按实际业务来定比如博客系统叫blog_project管理系统叫admin_system。示例中用一个通用的config作为项目配置目录再单独用myproject作为实际项目理解起来更直观。django-admin startproject myproject .这里的.表示在当前目录创建项目文件不加的话会多创建一层目录。执行后项目里会出现一个manage.py文件和myproject配置包里面包含settings.py、urls.py、wsgi.py等核心文件。4.2 创建AppDjango中“项目”是整体配置“应用”是具体业务模块。一个项目可以包含多个App比如用户模块、文章模块、订单模块。创建一个文章应用python manage.py startapp blog创建后blog目录包含models.py、views.py、admin.py、migrations/ 等文件。从真实项目习惯来看App的划分应该在创建前想清楚。不要把用户、文章、支付全部塞进同一个App否则后期维护会很吃力。4.3 配置settings.py打开myproject/settings.py把新App注册到INSTALLED_APPS中。INSTALLED_APPS [ django.contrib.admin, django.contrib.auth, django.contrib.contenttypes, django.contrib.sessions, django.contrib.messages, django.contrib.staticfiles, blog, ]同时把语言和时区调整为中文和北京时间。LANGUAGE_CODE zh-hans TIME_ZONE Asia/Shanghai USE_TZ True这样Django Admin后台会显示中文时间处理也更符合本地业务习惯。4.4 启动开发服务器完成基础配置后启动开发服务器。python manage.py runserver启动成功后终端会显示类似Starting development server at http://127.0.0.1:8000/的提示。浏览器访问http://127.0.0.1:8000/能看到初始页面说明Django运行正常。这里有一个常见问题如果8000端口被其他程序占用可以用自定义端口启动。python manage.py runserver 127.0.0.1:8080在局域网开发调试时也可以启动为0.0.0.0:8000让其他设备访问本机服务。5. 数据模型与ORM增删改查5.1 定义数据模型真实Web应用基本上都要操作数据库。Django不要求直接写SQL而是通过模型类描述数据结构再通过ORM完成数据库操作。以文章应用为例在blog/models.py中定义一个文章模型。from django.db import models class Post(models.Model): title models.CharField(标题, max_length100) content models.TextField(内容) created_at models.DateTimeField(创建时间, auto_now_addTrue) updated_at models.DateTimeField(更新时间, auto_nowTrue) def __str__(self): return self.title这里用到了三个常用字段类型CharField用于短文本TextField用于长文本DateTimeField用于时间。字段定义中的中文说明会自动体现在Admin后台和表单校验中。5.2 生成迁移文件并同步数据库定义好模型后需要让Django根据模型生成数据库表结构。python manage.py makemigrations python manage.py migratemakemigrations会在App的migrations目录生成迁移文件migrate则把迁移文件应用到数据库表中。第一次执行migrate时除了业务表还会创建Django自带的用户、会话、权限等系统表。5.3 执行查询与删除对象Django ORM提供了一套很简洁的数据操作API。打开Django Shell进行交互式验证。python manage.py shell新增数据from blog.models import Post post Post(title第一篇文章, contentDjango ORM 实战) post.save() Post.objects.create(title第二篇文章, content自动创建)查询数据# 获取全部记录 posts Post.objects.all() print(posts) # 获取单条记录 first_post Post.objects.get(id1) print(first_post.title) # 条件过滤 posts Post.objects.filter(title__containsDjango) print(posts)删除对象post Post.objects.get(id1) post.delete()这里有几个实际开发中容易踩到的点。get()如果查询结果多于一条或少于一条会抛出异常因此更推荐用filter()判断后再取一条或者使用get_object_or_404()这样的快捷方式。filter()返回的是查询集支持链式调用、惰性求值和分片操作比如Post.objects.filter(...).order_by(-created_at)[:5]。批量删除也是常见需求使用查询集的delete()方法即可。Post.objects.filter(title__startswith测试).delete()执行前建议先确认过滤条件是否正确避免误删数据。5.4 在Admin后台管理数据Django自带Admin后台是真实项目中很实用的数据管理界面。先在blog/admin.py中注册模型。from django.contrib import admin from .models import Post admin.register(Post) class PostAdmin(admin.ModelAdmin): list_display (id, title, created_at) search_fields (title,)创建超级管理员python manage.py createsuperuser按提示输入用户名、邮箱和密码。然后启动服务器访问http://127.0.0.1:8000/admin/登录后就能在后台直接增加、修改、删除文章数据。有了Admin后台第一部分的模型定义结果可以立即在界面上看到这也为后续真实业务管理提供了基础。6. 视图、路由与模板6.1 URL路由配置Django通过URL配置决定用户访问某个地址时执行哪个视图函数。在myproject/urls.py中引入App的URL配置。from django.contrib import admin from django.urls import include, path urlpatterns [ path(admin/, admin.site.urls), path(blog/, include(blog.urls)), ]在blog应用下创建或修改urls.py定义首页路由。from django.urls import path from . import views urlpatterns [ path(, views.index, nameindex), path(posts/, views.post_list, namepost_list), ]6.2 视图函数视图函数接收浏览器请求返回响应内容。编写一个最简单的视图。from django.http import HttpResponse def index(request): return HttpResponse(Django 应用运行正常)此时浏览器访问http://127.0.0.1:8000/blog/页面会显示“Django 应用运行正常”。6.3 模板渲染真实项目中不会直接返回字符串而是返回HTML模板。在blog目录下创建templates/blog/结构新建post_list.html。!DOCTYPE html html langzh-hans head meta charsetUTF-8 title文章列表/title /head body h1文章列表/h1 ul {% for post in posts %} li{{ post.title }} - {{ post.created_at }}/li {% endfor %} /ul /body /html视图函数改为渲染模板。from django.shortcuts import render from .models import Post def post_list(request): posts Post.objects.all().order_by(-created_at) return render(request, blog/post_list.html, {posts: posts})模板中的{% for %}和{{ }}是Django模板语法分别表示循环和输出变量。这里体现了ORM、视图、模板三层协作的基本流程也是后续所有页面的通用模型。7. 将应用扩展为完整CRUD7.1 设计新增数据的表单真实Web应用不能只在Admin后台录入数据还要在业务页面中完成新增逻辑。可以使用Django表单来减少手动校验工作。在blog应用下创建forms.py。from django import forms from .models import Post class PostForm(forms.ModelForm): class Meta: model Post fields [title, content]视图函数处理GET请求时展示表单POST请求时校验并保存数据。from django.shortcuts import render, redirect from .forms import PostForm def post_create(request): if request.method POST: form PostForm(request.POST) if form.is_valid(): form.save() return redirect(post_list) else: form PostForm() return render(request, blog/post_create.html, {form: form})对应模板中需要包含表单字段和CSRF令牌。form methodpost {% csrf_token %} {{ form.as_p }} button typesubmit保存/button /formcsrf_token是Django内置的安全机制用来防止跨站请求伪造在正式项目里不能省略。7.2 更新与删除数据更新操作通常需要知道要更新哪条记录可以通过URL传递主键id。from django.shortcuts import get_object_or_404, redirect, render from .forms import PostForm from .models import Post def post_update(request, post_id): post get_object_or_404(Post, idpost_id) if request.method POST: form PostForm(request.POST, instancepost) if form.is_valid(): form.save() return redirect(post_list) else: form PostForm(instancepost) return render(request, blog/post_create.html, {form: form}) def post_delete(request, post_id): post get_object_or_404(Post, idpost_id) post.delete() return redirect(post_list)URL配置补充对应路由。path(posts/create/, views.post_create, namepost_create), path(posts/int:post_id/edit/, views.post_update, namepost_update), path(posts/int:post_id/delete/, views.post_delete, namepost_delete),到这里一个文章模块的增删改查已经完整跑通。这些代码量不大但结构很典型后面套上用户权限、分类管理、分页显示就是一个真实可用的内容管理系统雏形。7.3 利用Admin后台做运营管理在实际项目中普通用户通过前端页面提交内容管理员通过Admin后台审核和管理内容。把数据模型注册进Admin后运营人员不需要写代码就能维护数据。建议根据业务需求调整Admin列表字段、搜索字段和过滤器降低后台使用成本。admin.register(Post) class PostAdmin(admin.ModelAdmin): list_display (id, title, created_at) list_filter (created_at,) search_fields (title, content)8. 接口API与前后端数据交互8.1 使用JsonResponse返回数据第一部分主要演示服务端渲染页面但真实项目中经常会遇到需要向前端页面或外部系统返回JSON数据的情况。Django的JsonResponse可以快速返回JSON格式响应。from django.http import JsonResponse from .models import Post def post_api(request): posts list(Post.objects.all().values(id, title, created_at)) return JsonResponse({status: ok, data: posts})将路由配置为/blog/api/posts/后直接访问该地址即可看到JSON数据。这个能力是后续做前后端分离、小程序接口、移动端接口的基础。8.2 通用接口调用示例假如你需要在自己项目中模拟调用Django接口可以使用requests库。import requests response requests.get(http://127.0.0.1:8000/blog/api/posts/, timeout10) data response.json() print(data)用curl测试同样方便。curl http://127.0.0.1:8000/blog/api/posts/如果返回JSON中包含status和data两个字段说明接口服务正常。这里要提醒实际生产环境接口要做认证和权限控制不能直接把数据表内容全部暴露。8.3 批量任务与数据初始化批量处理时可以结合Django Shell或管理命令。比如批量导入初始文章数据可以写一个脚本在Shell中运行。from blog.models import Post titles [开发笔记一, 开发笔记二, 开发笔记三] for title in titles: Post.objects.create(titletitle, content批量生成内容) print(完成)更大的数据量则建议用迭代器iterator()避免内存占用过高并在循环中分批提交。无论是批量任务还是接口调用都应该增加日志记录和异常捕获方便出问题时排查。9. 开发环境资源占用与性能观察Django自带的开发服务器虽然只用于本地调试但仍能观察一些性能指标来评估数据模型设计是否合理。最直观的方法是查看服务器终端的请求日志日志会记录每次请求的路径、状态码和耗时。启动服务时的提示信息也能反映项目加载速度模块越多加载时间越长。数据库查询量是Web应用性能的关键。页面加载后Django会对每个数据访问操作执行SQL查询。可以临时开启Django的查询记录确认页面执行了多少条SQL。from django.db import connection # 在视图函数中调试时使用 print(len(connection.queries))如果列表页的数据量增大后加载变慢优先查看是否存在“N1查询问题”。例如循环输出关联数据时每条记录都触发一次数据库查询。用ORM的select_related()和prefetch_related()可以减少查询次数这一点在后续课程中应该重点练习。内存和显存在Django本地开发中不属于瓶颈因为第一部分的模型和页面非常简单。真正需要担心的是服务器部署后的并发能力和数据库性能。总是在开发早期保持“先跑通再优化”的心态不要在只有几十条测试数据时就过度设计缓存和索引。10. 常见问题与排查方法学习Django第一部分时遇到的报错基本集中在环境、路径、语法和数据库四类。这里整理一张排查表。问题现象可能原因排查方式解决方案python命令无法识别Python未安装或未加入PATH执行python --version重新安装Python并勾选Add to PATHpip安装Django失败网络问题或pip版本过低查看pip错误日志升级pip并更换国内镜像源django-admin命令不存在虚拟环境未激活或Django未安装检查命令行前缀和pip list激活虚拟环境并重新安装Django运行runserver报端口占用8000端口被其他进程占用检查端口占用更换端口如runserver 8080访问页面报404路由配置未匹配检查urls.py和请求地址配置include或补充path规则修改模型后数据库未变化忘记执行迁移查看migrations目录执行makemigrations和migrateget查询不到数据条件不匹配使用filter调试改用filterfirst或get_object_or_404Admin忘记密码密码遗忘无执行createsuperuser重新创建管理员模板变量不显示变量名拼写错误检查模板和视图上下文保持变量名大小写一致镜像源问题在国内开发环境中很常见pip官方源有时速度较慢建议优先使用国内镜像。pip install django -i https://pypi.tuna.tsinghua.edu.cn/simple这个问题解决后第三方依赖的安装效率会明显提升。11. 部署实践从本地到宝塔服务器11.1 导出依赖清单项目开发完成后需要把依赖清单导出方便部署时恢复环境。pip freeze requirements.txt在服务器上新建虚拟环境后执行以下命令安装依赖。pip install -r requirements.txt11.2 关闭Debug并配置静态文件生产环境不能使用Django默认的Debug模式。在settings.py中设置DEBUG False同时配置ALLOWED_HOSTS。ALLOWED_HOSTS [你的域名或IP]修改settings.py中STATIC_ROOT配置STATIC_ROOT BASE_DIR / staticfiles随后收集静态文件到指定目录。python manage.py collectstatic11.3 宝塔面板部署Django宝塔面板是很多国内开发者选择的服务器运维工具部署Django的基本思路是通过WSGI服务承载Django应用。先确保服务器安装了Python环境和项目代码再把项目目录配置为Python项目并选择对应的运行方式。常见方式是使用Gunicorn配合反向代理。pip install gunicorn gunicorn myproject.wsgi:application --bind 0.0.0.0:8000然后在宝塔Nginx配置中把域名请求转发到本机的8000端口。部署过程中重点检查Python版本是否一致、依赖包是否安装完整、允许访问的域名是否配置正确、静态文件是否收集完成。Django部署属于生产环节进入这一阶段前确保第一部分的项目结构已经理解扎实。12. 第一部分实战建议与下一步方向第一部分全部走完后你应该至少具备以下三项能力能在本机创建并运行Django项目能定义数据模型并完成数据库迁移能通过ORM完成数据的增删改查并把数据渲染到页面中。这套流程是后续所有业务功能的基础越熟练越好。第一次学习时建议不要跳过虚拟环境和迁移操作。虚拟环境是依赖隔离的底线迁移是数据模型演进的工具这两步如果不熟悉越往后越容易出问题。遇到报错不要急着搜索完整错误先读第一行提示分清是路径错误、语法错误还是数据库错误再对照本篇排查表处理。后面的课程大概率会围绕用户认证、权限管理、样式集成、部署上线等真实细节展开。在进入下一部分前建议把本文中的项目重新手动创建一遍不要复制粘贴每一步都自己敲一遍。只有手速跟上思路后续的真实项目开发才不会卡在基础环节。最重要的是把“会跑通”和“会开发”区分开。会跑通只是照着命令执行会开发是项目里新增一个业务模块时知道自己要动哪些文件、要改哪些配置、要写哪些查询。第一篇笔记帮助完成前一步后面的练习才是真正积累经验的过程。
RELATED

相关推荐

前端错误弹窗记录方案:如何把用户报错变成可复现线索

前端错误弹窗记录方案:如何把用户报错变成可复现线索

做前端时间久了,最怕听到的其实不是“页面崩了”,而是“用户那边弹了个错,我截了图,就这个”。这张截图大概率只包含弹窗的半截标题,没有触发页面、没有请求参数、没有操作步骤,等你赶到现场,那…

📅 2026/9/9 5:25:04
动态包含性能瓶颈:PHP include/require优化实战与改造方案

动态包含性能瓶颈:PHP include/require优化实战与改造方案

接手这个老项目优化任务的时候,我第一反应是去看数据库慢查询和缓存命中率,结果折腾半天都没找到大头。后来把PHP的请求链路拆开,才发现一个被很多人忽略的细节:模板块里大量使用了动态包含——也就是把include/require的参数写成…

📅 2026/9/9 5:25:04
前置过滤器选购指南:避开精度误区,认准这五个核心参数

前置过滤器选购指南:避开精度误区,认准这五个核心参数

2. 常识一:过滤精度看40微米,但“精度越高越好”是误区2.1 精度参数到底怎么读先说结论:目前主流前置过滤器的过滤精度基本都在40微米左右,这也是行业内公认的“黄金精度”。40微米是什么概念?一根头发丝的直径大概是7…

📅 2026/9/9 5:25:04
MORE NEWS

更多资讯

📰

2026年大模型API聚合网关选型指南:从接口混乱到统一治理

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

面试反问技巧:用精准提问获取真实信息,识别团队风险

1. 面试中的“反向拷打”:为什么你必须学会审问面试官面试到了尾声,面试官几乎都会问一句:“你有什么想问我的吗?”很多候选人在这时候要么说“没有了”,要么问一个无关痛痒的问题草草收场。我做了这么多年技术面试官&…

📰

SEO代做与网站优化的本质区别,如何避免踩坑

1. SEO代做和网站优化,到底差在哪SEO代做和网站优化这两个说法,在圈内经常被混着用,客户也经常搞不清。但作为长期做搜索流量的人,我得说这俩其实是两码事。简单理解:网站优化是一个过程,SEO代做是购买这门…

📰

Java数组从入门到进阶:定义、遍历、排序与常见坑全面解析

1. 先聊清楚:数组到底是干嘛的如果你刚开始学Java,数组大概率是你在循环、判断之外遇到的第一个“真正有点数据结构味道”的东西。很多新手学到这里会有一个疑问:我声明一堆变量不行吗?为什么非要搞个数组出来?假设你要…

📰

边缘计算规模落地指南:从选型到部署的实战避坑清单

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

Composer依赖解析失败?ThinkPHP 8创建项目排查全攻略

错误信息这样写:composer create-project topthink/think tp8,然后等了几分钟结果砸来一句Your requirements could not be resolved to an installable set of packages.。如果你搜索过这个问题,大概率已经在网上翻到了各种“换镜像源”“清…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬