news 2026/9/9 5:22:49

Django入门指南:从环境搭建到URL与视图的完整请求链路

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Django入门指南:从环境搭建到URL与视图的完整请求链路

在实际的 Web 开发学习路径里,Django 往往是继 Python 基础语法之后,第一个值得系统投入的 Web 框架。它自带 Admin 后台、ORM、模板系统、表单处理和认证机制,非常适合用来构建“真实可用”的 Web 应用。这一篇是四部分系列教程的第一部分,目标很明确:先把 Python 环境、Django 安装、项目结构、URL 到视图的请求链路全部跑通,让你在本地看到一个能正常响应浏览器的 Django 应用。后续三部分再依次深入模型与数据库、模板与表单、以及完整的业务项目实战。

这篇笔记不会只贴命令,而是会解释每一步为什么这样做、哪些参数可以调整、报错时应该看哪里。读完并亲手操作一遍之后,你应该能独立创建一个 Django 项目,理解项目和应用的区别,并且知道如何继续往下写功能。

1. 先从整体理解 Django:它解决什么问题,为什么适合构建真实 Web 应用

很多初学者第一次接触 Django 时,第一反应是“它和 Flask 有什么区别”。这里先放下框架对比,回到 Web 开发本身。一个真实 Web 应用通常包含这几件事:接收 HTTP 请求、路由到对应的处理逻辑、读写数据库、渲染页面或返回 JSON、处理用户登录和权限。如果全部手写,工作量非常大,而且容易在安全和规范上犯错。

Django 的核心思路是“batteries included”,也就是把 Web 应用最常见的组成部分全部内置。你不需要花大量时间挑选第三方库来拼装一个项目,Django 本身提供的组件已经覆盖了绝大多数业务场景。

1.1 Django 的核心组成

Django 的核心模块可以按职责划分为几块:

模块作用对应学习重点
URL 路由将浏览器请求的路径映射到视图函数或类urls.py、path/re_path
视图层处理请求、执行业务逻辑、返回响应FBV 和 CBV
ORM用 Python 对象操作数据库表models.Model、QuerySet
模板系统在 HTML 中渲染动态数据Django Template Language
表单处理用户输入、校验、错误提示forms.Form、ModelForm
Admin 后台自动生成数据管理页面django.contrib.admin
认证系统用户注册、登录、会话、权限django.contrib.auth
中间件在请求和响应之间插入处理逻辑Middleware

这个表格不需要现在全部背下来,但建议把它当作后续学习的地图。第一部分只需要关注前三行:URL、视图、以及如何让项目跑起来。

1.2 Django 的请求处理流程

理解一个请求从浏览器到服务器的完整路径,对排查问题至关重要。一个典型请求的处理顺序是:

  1. 浏览器向服务器发送 HTTP 请求,例如访问http://127.0.0.1:8000/index/
  2. Django 按settings.pyROOT_URLCONF指定的 urls 模块查找匹配的路由。
  3. 匹配到path('index/', ...)后,调用对应的视图函数。
  4. 视图函数执行业务逻辑,可能查询数据库、调用其他函数。
  5. 视图返回HttpResponse或渲染后的模板。
  6. 中间件和后端处理响应,最终返回给浏览器。

这条链路看起来简单,但它决定了你以后排查问题时的顺序:先看 URL 是否匹配,再看视图有没有被执行,然后看响应内容是什么,最后才怀疑中间件或服务器配置。

1.3 Django 适合什么场景,不适合什么场景

Django 适合内容管理类系统、数据分析展示平台、企业内部系统、电商后台、社区论坛这类需要“用户 + 数据 + 后台管理”的项目。它的优势是开发效率高,规范和内置功能完善。

如果只是一个非常轻量的 API,或者只有十几个路由的微型站点,Django 会显得重。这时候 Flask 或 FastAPI 更合适。但这个判断要放在实际项目中做,初学阶段先把 Django 的完整开发流程走一遍,比反复纠结选型更有价值。

2. 环境准备:Python 版本、虚拟环境和 Django 安装

Django 是一个 Python 第三方包,所以环境准备的核心是 Python 本身。很多新手在这一步就出现“明明装了 Python,却提示找不到命令”的情况,大部分原因是安装时没有把 Python 加入 PATH,或者终端没有重启。

2.1 确认 Python 环境

打开终端,执行以下命令:

python --version

如果提示找不到命令,再试:

python3 --version

在 Windows 上还可能遇到py启动器:

py --version

Django 5.x 要求 Python 3.10 及以上版本。如果你的版本低于这个要求,建议先从官网下载新版本安装,而不是继续在老版本上凑合。版本过低会导致 Django 安装失败或运行时报语法错误。

确认 Python 可用之后,再确认 pip:

python -m pip --version

这里推荐使用python -m pip而不是直接pip,因为前者能确保 pip 与当前 Python 解释器对应,避免多版本环境下安装到错误位置。

2.2 创建虚拟环境

虚拟环境的作用是隔离项目依赖。不同项目依赖的 Django 版本可能不同,如果不隔离,升级一个项目依赖时可能影响另一个项目。创建虚拟环境的命令:

# 在项目根目录执行 python -m venv venv

Windows 激活方式:

venv\Scripts\activate

macOS / Linux 激活方式:

source venv/bin/activate

激活成功后,终端提示符前面会出现(venv)字样。此时执行的pythonpip都指向虚拟环境,不会污染系统全局环境。

不需要隔离环境时,退出命令是:

deactivate

2.3 安装 Django 并确认版本

激活虚拟环境后安装 Django:

pip install django

如果想安装指定版本,例如 5.0 LTS 系列:

pip install django==5.0.*

安装完成后确认版本:

python -m django --version

这里的django-admin是 Django 提供的命令行工具,后面创建项目会用到。

2.4 环境检查清单

每次开始一个新项目前,建议按以下顺序确认环境:

检查项命令预期结果
Python 版本python --version3.10 及以上
pip 可用python -m pip --version显示 pip 版本号
虚拟环境激活which pythonwhere python路径指向项目内 venv
Django 已安装python -m django --version显示版本号

注意:如果django-admin命令找不到,优先改用python -m django。前者依赖 PATH 配置,后者由 Python 解释器直接调用,更不容易出错。

3. 创建第一个 Django 项目:项目与应用的职责拆分

环境准备完成后,进入最核心的创建环节。这里要先理解一个容易混淆的概念:Django 项目中“项目”和“应用”是两个不同层次的东西。

项目是一个完整的网站或服务,它负责整体配置、URL 入口、数据库设置。应用是项目中的一个功能模块,例如一个博客系统可以有articles应用、comments应用、users应用。项目可以包含多个应用,应用也可以被多个项目复用。

3.1 创建项目

在终端中进入你希望存放代码的目录,执行:

django-admin startproject myproject

如果刚才的django-admin不可用,使用:

python -m django startproject myproject

执行后会在当前目录生成一个myproject文件夹。进入这个文件夹并启动开发服务器,验证基本环境是否正常:

cd myproject python manage.py runserver

浏览器访问http://127.0.0.1:8000/,看到 Django 的默认欢迎页面,说明环境已经跑通。

3.2 理解项目目录结构

创建后的目录结构如下:

myproject/ ├── manage.py └── myproject/ ├── __init__.py ├── asgi.py ├── settings.py ├── urls.py └── wsgi.py

每个文件的职责:

文件作用
manage.py项目管理入口,运行开发服务器、执行迁移、创建应用都靠它
settings.py全局配置,包括数据库、应用注册、模板、静态文件
urls.py项目的 URL 总入口
wsgi.py/asgi.py部署时给服务器使用的接口
__init__.py标识目录是一个 Python 包

新手最容易犯的错误是直接改外层myproject目录里的文件,或者在错误的层级执行manage.py。记住:manage.py在哪一层,就在哪一层执行命令。

3.3 创建应用

项目创建好之后,创建第一个应用。这里以blog为例:

python manage.py startapp blog

执行后目录中多出blog/文件夹,里面有views.pymodels.pyadmin.pymigrations/等文件。这些文件就是后续开发的主要战场。

3.4 注册应用

创建完应用后必须告诉 Django“这个应用属于当前项目”。在settings.py中找到INSTALLED_APPS,把blog加进去:

INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'blog', # 新增这一行 ]

不注册应用,Django 不会为它执行数据库迁移,也不会加载它的模板和静态文件。这是新手经常会漏掉的一步。

4. 编写第一个视图:从 urls 到 views 的完整请求链路

视图是 Django 处理请求的核心。这一节用一个最简单的“首页”视图,把 URL 配置、视图函数和浏览器访问串起来。

4.1 编写视图函数

打开blog/views.py,写入:

from django.http import HttpResponse def index(request): return HttpResponse("欢迎来到我的第一个 Django 页面")

这个视图只有一个参数request,它封装了浏览器发来的所有请求信息。函数返回一个HttpResponse,Django 会把这个响应内容发送回浏览器。

4.2 配置 URL

Django 的路由配置分为两层。项目总路由在myproject/urls.py中,应用自己的路由通常在应用目录下新建urls.py

先修改项目总路由myproject/urls.py

from django.contrib import admin from django.urls import path, include urlpatterns = [ path('admin/', admin.site.urls), path('', include('blog.urls')), ]

然后在blog目录下新建urls.py

from django.urls import path from . import views urlpatterns = [ path('', views.index, name='index'), ]

path('', views.index, name='index')表示访问根路径/时调用views.indexname参数是路由的别名,后面在模板中用{% url %}反向解析 URL 时会用到。

4.3 启动开发服务器

回到项目根目录,运行:

python manage.py runserver

默认监听127.0.0.1:8000。如果想换端口:

python manage.py runserver 8080

开发服务器支持代码修改后自动重载,不需要手动重启。但新增文件、迁移数据库、修改settings.py中部分参数时,有时需要手动重启才能生效。

4.4 验证结果

浏览器访问http://127.0.0.1:8000/,页面应该显示:

欢迎来到我的第一个 Django 页面

此时可以验证一下 URL 配置的效果。把blog/urls.py改成:

urlpatterns = [ path('hello/', views.index, name='index'), ]

访问http://127.0.0.1:8000/hello/才能看到内容,访问根路径会变成 404。这说明路由匹配是精确的,字符串必须一致。

注意:Django 对 URL 末尾的斜杠有重定向机制。访问/hello时,如果配置写的是/hello/,Django 默认会返回 301 重定向到/hello/。这个行为由APPEND_SLASH控制,默认开启。

5. 理解关键的配置项:settings.py 中必须认识的参数

到了这一步,项目已经能跑通完整请求链路。接下来需要理解settings.py中最常用的几个配置项,因为后面所有功能开发都会和它们打交道。

5.1 常用配置参数速查

参数默认值作用
DEBUGTrue是否开启调试模式,生产环境必须为 False
ALLOWED_HOSTS[]允许访问的主机名列表
INSTALLED_APPS内置应用列表注册项目中的所有应用
DATABASESsqlite3数据库连接配置
LANGUAGE_CODEen-us默认语言
TIME_ZONEUTC时区
USE_TZTrue是否启用时区支持
STATIC_URL/static/静态文件 URL 前缀
ROOT_URLCONF项目名.urls总路由位置

5.2 DEBUG 模式

DEBUG = True时,Django 会在页面显示详细报错信息,包括异常堆栈、模板错误、SQL 语句等。这对开发排查很有帮助,但生产环境开启会有严重安全风险,会暴露文件路径、配置信息和数据库结构。

修改为 False 后,必须同步配置ALLOWED_HOSTS,例如:

DEBUG = False ALLOWED_HOSTS = ['example.com', 'www.example.com']

否则访问时会提示DisallowedHost错误。

5.3 数据库配置

默认使用 SQLite,配置如下:

DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': BASE_DIR / 'db.sqlite3', } }

SQLite 的特点是零配置、单文件,适合学习和中小型项目。切换到 MySQL 或 PostgreSQL 时,需要修改ENGINE和连接参数,同时安装对应的数据库驱动。学习阶段不必急着换数据库,先把 SQLite 用明白。

5.4 静态文件和模板

静态文件是 CSS、JavaScript、图片这类不需要服务端处理的资源。Django 开发环境下,只要配置了STATIC_URL,在模板中就可以通过{% load static %}{% static 'css/style.css' %}引用。

模板路径默认按应用目录查找,每个应用下的templates文件夹会被 Django 自动识别。多个应用有同名模板时,建议在模板文件夹内再加一层以应用名命名的子目录,例如blog/templates/blog/index.html,避免模板冲突。

6. 常见问题排查:把第一道坎拆开来看

新手在完成上述流程时,几乎一定会遇到下面几类问题。这里把现象、原因和解决方案整理成一条可直接对照的排查链。

6.1 命令找不到或运行的不是预期版本

现象:执行django-admin提示命令不存在,或者pip install django后仍然报错No module named 'django'

排查顺序:

  1. 确认当前是否激活了虚拟环境,输入which python看路径。
  2. 如果路径指向系统 Python,说明虚拟环境没有激活或激活失效。
  3. 改用python -m django --version验证 Django 是否安装到了当前解释器。
  4. 确认是否安装到了全局环境而不是虚拟环境,可以使用pip list查看。

解决方案:激活正确的虚拟环境后重新安装依赖。不要同时使用pippip3混装。

6.2 端口被占用

现象:运行runserver时提示Error: That port is already in use.

原因:上一个开发服务器没有正确退出,或端口被其他程序占用。

排查方式:

# Windows netstat -ano | findstr 8000 # macOS / Linux lsof -i :8000

解决方案:结束占用进程,或者换端口启动:

python manage.py runserver 8001

6.3 迁移相关报错

现象:启动后页面提示You have unapplied migrations

原因:Django 内置应用(如 admin、auth)的数据表还没有创建。

解决方案:

python manage.py migrate

这里解释一下migrate的作用:Django 用模型描述数据表结构,迁移文件记录每一次结构变化,migrate命令把这些变化同步到数据库。这也是后续定义模型后必须执行的操作。

6.4 模板路径或静态文件找不到

现象:页面能访问,但样式丢失,或模板加载报错。

排查顺序:

  1. 确认应用是否注册到INSTALLED_APPS
  2. 确认模板文件是否在应用目录下的templates文件夹中。
  3. 确认模板中使用的是{% extends %}{% block %}是否和母版一致。
  4. 确认浏览器控制台的 404 路径是否正确,必要时清缓存或强制刷新。

7. 学习环境与生产环境的差异:如何避免“本地能跑,部署就崩”

很多人在本地开发很顺利,一放到服务器上就遇到一系列问题。这不是运气问题,而是开发环境与生产环境的设计目标不同。开发环境追求快速迭代和错误可见,生产环境追求稳定、安全和性能。

7.1 开发服务器和生产服务器的区别

runserver是 Django 自带的轻量开发服务器,它的文档明确说明不适合生产环境。原因有三个:

第一,并发能力有限。开发服务器是单进程模型,无法处理大量并发请求。第二,静态文件处理效率低。开发模式下静态文件由 Django 直接返回,生产环境应该交给 Nginx 或 CDN。第三,安全性不足。开发服务器没有经过完整的加固和性能调优。

生产环境通常的做法是:使用 Gunicorn 或 uWSGI 作为 WSGI 服务器,前面再放 Nginx 处理静态文件和反向代理。

7.2 上线前必须检查的配置项

配置项开发环境生产环境
DEBUGTrueFalse
ALLOWED_HOSTS留空或 localhost填写实际域名
SECRET_KEY默认值必须改为随机长字符串,且配置外置
数据库SQLite建议 MySQL/PostgreSQL
静态文件Django 处理Nginx/CloudFront
日志终端输出文件或日志服务

SECRET_KEY是签名会话、验证码、CSRF 等安全功能的基础,生产环境中不能写死在代码库里。建议使用环境变量读取,例如:

import os SECRET_KEY = os.environ.get('DJANGO_SECRET_KEY', 'dev-only-unsafe-key')

这段代码的意思是:优先从环境变量DJANGO_SECRET_KEY中读取,没有设置时使用默认值。这样既保证本地能跑,又避免生产环境使用固定密钥。

8. 最佳实践与常见坑:从第一步就养成正确的工程习惯

这一节把第一部分中最重要的习惯和踩坑经验集中列出。有些问题虽然现在不严重,但等代码量变大后再改会非常痛苦。

8.1 项目结构建议

对于功能逐渐变多的项目,推荐的目录组织方式是:

myproject/ ├── manage.py ├── myproject/ │ ├── settings/ │ │ ├── base.py │ │ ├── dev.py │ │ └── prod.py │ ├── urls.py │ └── wsgi.py ├── apps/ │ ├── blog/ │ └── users/ ├── static/ ├── media/ ├── templates/ └── requirements.txt

settings.py拆分成base.pydev.pyprod.py,可以让不同环境使用不同配置。应用统一放在apps目录下,便于管理。这个结构不需要在一开始就完全照搬,但建议随着项目增长逐步调整。

8.2 至少要注意的三个常见坑

第一个坑是“用python还是python3”混淆。在多版本 Python 环境中,python可能指向 Python 2 或旧版本,导致依赖安装后运行报错。统一在项目内使用虚拟环境,并且始终用python -m pippython -m django,可以避免绝大多数版本混乱问题。

第二个坑是“修改了代码但页面没有变化”。首先确认开发服务器是否自动重载,其次确认是不是浏览器缓存。如果修改的是settings.py或新增了文件,手动重启开发服务器往往能解决。

第三个坑是“把密钥和敏感配置写进了代码”。日志被推送、代码被公开后,SECRET_KEY和数据库密码等于直接泄露。从第一天起就用环境变量管理敏感配置,比项目上线前再补救要省事得多。

8.3 再看一遍环境检查清单

每次新建项目时,建议按这个清单快速自检:

  1. python --version确认 Python 版本满足要求。
  2. python -m venv venv创建虚拟环境并激活。
  3. pip install django安装依赖。
  4. python -m django --version确认 Django 版本。
  5. django-admin startproject myproject创建项目。
  6. python manage.py startapp blog创建应用。
  7. python manage.py migrate初始化数据表。
  8. python manage.py runserver启动服务器。
  9. 浏览器访问根路径,确认页面正常。

这套流程跑通之后,第二部分可以开始引入模型(Model)和数据库迁移。到那时,Django 的 ORM 会成为你操作数据的主要工具,而第一部分建立的环境和项目结构会一直伴随着后续开发。建议在继续之前,亲手把本文的示例代码从零写一遍,越熟练越好。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/9 5:22:05

AI Agent技能包实战:用npx安装和使用ponytail

上个月我在折腾 AI Agent 的时候,发现社区里冒出来一个很轻巧的新玩法:用一条npx skill add dietrichgebert/ponytail命令,就能给现有的 AI 助手装上一个叫“ponytail”的技能包。一开始我以为又是那种需要一堆环境变量、配置文件才能跑起来的…

作者头像 李华
网站建设 2026/9/9 5:21:06

Comsol 6.0流体对电弧影响仿真:从多物理场耦合到参数扫描实践

做开关电器和放电加工方向这么久,我一直有个很深的体会:电弧这个看起来"纯电气"的东西,实际行为有一大半是由周围的流体决定的。你这边放个电,那边气体一吹,电弧形态、温度分布、甚至会不会熄灭,…

作者头像 李华
网站建设 2026/9/9 5:17:07

状态机与JKI框架:LabVIEW程序架构从“能跑”到“敢改”的升级路径

“你这程序能跑,但没人敢改。”这是我在一次项目评审里给同事的原话。对方做了一台测试工装的上位机,功能上确实都打通了:初始化设备、连续读取传感器、保存报表、异常提示,全都能跑。但前面板堆了近二十个控件,程序框…

作者头像 李华
网站建设 2026/9/9 5:15:46

TDengine高吞吐写入存储配置调优:WAL、buffer与磁盘选型实践

1. 先聊聊我为什么盯上了存储配置这件事早些年调时序数据库,大家的习惯是"先装上、跑起来再说",存储这块基本靠默认值打天下。等到数据量真涨上去了,写入开始变慢,查询变卡,才回头翻配置文件,结果…

作者头像 李华
网站建设 2026/9/9 5:12:10

一块LCD模组的品质之旅:从玻璃原片到出厂检验

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

作者头像 李华
网站建设 2026/9/9 5:10:11

Codex CLI与Agent开发中的常见代理错误与npx技能管理

我无法根据“ruflo”这一标题生成符合要求的博文内容。原因如下:“ruflo”在当前公开技术生态中无明确、稳定、可验证的指代对象。它未出现在主流AI开发框架(如LangChain、LlamaIndex、AutoGen、Hermes、OpenAgents)、知名Agent运行时&#x…

作者头像 李华