尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

10分钟用Django搭建个人网站:从零到一的全栈开发实践

10分钟用Django搭建个人网站:从零到一的全栈开发实践 1. 从零到一为什么选择Django作为你的第一把“锤子”如果你刚接触Python后端开发或者想快速搭建一个能跑起来的个人网站那么Django这个名字你肯定绕不开。很多人会纠结Flask更轻量FastAPI更新潮为什么偏偏是Django我的答案是对于“快速搭建”这个目标Django提供了一套最完整、最“固执己见”的工具箱。它不像Flask那样给你一堆零件让你自己组装而是直接给了你一套已经组装好的、功能齐全的“宜家家具”——你只需要按照说明书官方文档拧上几颗螺丝一个能用的柜子网站就立起来了。这种“开箱即用”的特性正是我们能在10分钟内看到成果的关键。Django的核心设计哲学是“不重复发明轮子”。它内置了用户认证、后台管理、ORM对象关系映射、表单处理、路由分发等几乎所有Web开发中都会用到的核心组件。这意味着你不用花时间去选型、集成各种第三方库也不用担心不同库之间的兼容性问题。对于个人网站这种典型需求——比如展示文章博客、管理项目、有一个简单的留言板——Django的模型几乎是为这些场景量身定制的。你定义好数据模型比如一篇文章有标题、内容、发布时间Django就能自动为你生成数据库表并通过自带的管理后台Admin立刻提供一个功能强大的内容管理界面。这个后台的完善程度足以让很多小型项目省去开发独立管理端的工作。很多人问“为什么国内很少用Django”这其实是个错觉。在需要快速原型验证、内部管理系统、内容型网站CMS等领域Django的应用非常广泛。它的“重”和“全”在项目初期是巨大的优势能极大提升开发效率。所谓的“少”可能是在追求极致性能和高并发的互联网大厂核心业务中更倾向于自研或更灵活的微服务框架。但对于个人网站、学习项目、初创公司MVP最小可行产品来说Django的“全栈”特性是无可比拟的捷径。至于“高并发”对于绝大多数个人网站初期的访问量来说完全不是瓶颈后期真有需求也可以通过缓存、异步任务、数据库优化乃至架构升级来解决Django本身也提供了良好的扩展基础。所以当你决定用10分钟搭建一个网站时选择Django就等于选择了一条阻力最小的路。我们接下来的所有操作都将围绕如何最高效地利用Django这套“工具箱”展开。2. 十分钟极速部署一行命令启动你的网站世界理论说得再多不如动手跑起来。Django的快速启动能力是它最迷人的特性之一。下面我将带你走一遍从零开始到看到第一个Django页面的完整流程并解释每一个步骤背后的意图。2.1 环境准备与项目创建首先确保你的系统已经安装了Python3。打开终端Windows的CMD/PowerShell macOS/Linux的Terminal通过python --version或python3 --version检查。我强烈建议使用Python 3.8及以上版本。接下来我们需要安装Django。使用Python的包管理工具pip是最简单的方式pip install django如果你遇到权限问题可以加上--user参数或者使用虚拟环境venv来隔离项目依赖这是更专业和推荐的做法。创建虚拟环境的命令是python -m venv myenv然后激活它Windows:myenv\Scripts\activate macOS/Linux:source myenv/bin/activate再在激活的环境里执行上面的pip install django。安装完成后就可以创建我们的项目了。Django使用一个名为django-admin的命令行工具来管理项目。执行以下命令django-admin startproject mywebsite这行命令做了什么呢它在当前目录下创建了一个名为mywebsite的文件夹这就是你的Django项目根目录。进入这个目录你会看到类似这样的结构mywebsite/ manage.py mywebsite/ __init__.py settings.py urls.py asgi.py wsgi.pymanage.py这是一个项目管理脚本你之后几乎所有的操作运行服务器、创建应用、数据库迁移都会通过它进行。你可以把它看作项目的“总控开关”。内层的mywebsite/目录这是你项目的Python包名字和你创建的项目名一致。settings.py项目的核心配置文件数据库、应用、中间件、模板等所有设置都在这里。urls.pyURL路由的声明文件它决定了哪个URL由哪个视图函数来处理是网站的“导航地图”。wsgi.py和asgi.py分别是WSGI和ASGI服务器的入口点用于部署你的项目到生产环境。我们本地开发暂时不用深究。2.2 启动开发服务器与初窥门径项目创建好了我们立刻让它跑起来。在项目根目录有manage.py的目录下运行python manage.py runserver你会看到类似这样的输出Watching for file changes with StatReloader Performing system checks... System check identified no issues (0 silenced). You have 18 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions. Run python manage.py migrate to apply them. March 28, 2024 - 10:00:00 Django version 4.2, using settings mywebsite.settings Starting development server at http://127.0.0.1:8000/ Quit the server with CONTROL-C.这里有几个关键信息未应用的迁移unapplied migration这是一个警告不是错误。Django内置了许多功能如用户认证、会话管理这些功能需要对应的数据库表。migrate命令就是用来创建这些表的。我们现在可以先忽略网站依然能运行。开发服务器地址http://127.0.0.1:8000/。这意味着Django已经启动了一个本地Web服务器监听在本机的8000端口。现在打开你的浏览器访问http://127.0.0.1:8000/。你应该会看到Django的默认欢迎页面一个火箭升空的动画并显示“The install worked successfully! Congratulations!”。注意这个runserver启动的是Django自带的、用于开发的轻量级服务器。它绝对不要用于任何生产环境因为它在性能和安全方面都没有为公开访问做优化。它的唯一用途就是本地开发和调试。至此不到5分钟一个完整的、可运行的Web服务器和项目骨架已经搭建完毕。你可能觉得这只是一个默认页面但请理解这背后Django已经帮你处理了HTTP请求的接收、路由、响应返回等一系列复杂操作。我们接下来的工作就是在这个骨架上添加我们自己的“血肉”。3. 核心组件速成模型、视图与模板的“三驾马车”Django遵循MVTModel-View-Template设计模式这与常见的MVCModel-View-Controller略有不同但思想相通。理解这三者如何协作是驾驭Django的关键。3.1 创建第一个应用App在Django中一个项目Project由多个应用App组成。每个应用是一个独立的模块负责一个特定的功能。例如博客功能可以是一个叫blog的应用用户认证可以是另一个叫users的应用。这种设计鼓励代码的复用和模块化。让我们为个人网站创建一个核心应用比如叫home或core。在项目根目录下执行python manage.py startapp home这会在项目目录下创建一个新的home文件夹结构如下home/ __init__.py admin.py apps.py migrations/ __init__.py models.py tests.py views.pymodels.py定义数据模型的地方对应MVT中的Model。views.py编写视图函数或视图类的地方对应MVT中的View负责处理业务逻辑。后续我们会创建templates文件夹存放HTML模板文件的地方对应MVT中的Template。创建完应用后必须将它注册到项目中。打开mywebsite/settings.py文件找到INSTALLED_APPS列表在末尾添加我们新创建的应用INSTALLED_APPS [ django.contrib.admin, django.contrib.auth, ... # 其他内置应用 home, # 添加这一行 ]3.2 定义数据模型Model假设我们的个人网站需要一个简单的“文章”功能。我们在home/models.py中定义它from django.db import models class Article(models.Model): title models.CharField(max_length200, verbose_name标题) content models.TextField(verbose_name内容) created_at models.DateTimeField(auto_now_addTrue, verbose_name创建时间) updated_at models.DateTimeField(auto_nowTrue, verbose_name更新时间) def __str__(self): return self.titleclass Article(models.Model)定义一个继承自models.Model的类Django就会知道这是一个数据模型。CharField,TextField,DateTimeField这些都是Django ORM提供的字段类型分别对应数据库中的字符串、长文本和日期时间类型。max_length字段约束表示标题最大长度。auto_now_addTrue在对象首次创建时自动设置为当前时间。auto_nowTrue在对象每次保存时自动更新为当前时间。__str__方法定义对象的字符串表示这在Django管理后台和Shell中查看对象时非常有用。verbose_name字段的可读名称用于在管理后台显示。定义好模型后我们需要告诉Django去创建对应的数据库表。这分为两步生成迁移文件Django会比较模型定义和当前数据库状态的差异并生成一个描述这个差异的Python脚本迁移文件。python manage.py makemigrations home执行后你会在home/migrations/目录下看到一个以时间戳开头的.py文件这就是迁移文件。执行迁移将迁移文件中描述的变化真正应用到数据库中。python manage.py migrate这个命令会执行所有未应用的迁移包括我们刚刚为Article生成的以及之前警告中提到的Django内置应用的迁移。3.3 创建超级用户与体验管理后台AdminDjango的管理后台Admin是一个极其强大的功能几乎不用写前端代码就能获得一个功能完备的数据管理界面。要使用它首先需要创建一个超级用户Superuserpython manage.py createsuperuser按照提示输入用户名、邮箱和密码。完成后再次确保开发服务器正在运行 (python manage.py runserver)然后在浏览器中访问http://127.0.0.1:8000/admin/。用刚才创建的超级用户登录。你会看到默认的管理后台界面有“Groups”和“Users”管理。但是我们的Article模型还没有注册进来。我们需要在home/admin.py中注册它from django.contrib import admin from .models import Article admin.site.register(Article)保存文件刷新管理后台页面。现在你应该能看到一个名为 “HOME” 的区块下面有 “Articles”。点击进入你可以进行文章的增、删、改、查操作。这就是Django ORM和Admin联手带来的威力用几行代码定义模型再注册一下一个功能完整的CRUD后台就诞生了。3.4 编写第一个视图View与模板Template管理后台是给自己用的我们还需要一个给访客看的页面。这就轮到视图和模板出场了。第一步编写视图View在home/views.py中我们编写一个简单的视图函数用来列出所有文章from django.shortcuts import render from .models import Article def article_list(request): # 从数据库中获取所有的文章按创建时间倒序排列 articles Article.objects.all().order_by(-created_at) # 准备要传递给模板的数据上下文 context { articles: articles } # 渲染模板并将上下文数据传递过去 return render(request, home/article_list.html, context)Article.objects.all()这是Django ORM的查询语句获取Article表中的所有记录。.order_by(-created_at)表示按created_at字段降序排列最新的在前。render函数它接收请求对象、模板路径和一个上下文字典然后返回一个渲染好的HTTP响应。第二步创建模板Template在home应用目录下新建一个名为templates的文件夹再在templates里新建一个home文件夹这是Django的约定为了避免不同应用的模板文件命名冲突。最后在templates/home/下创建article_list.html文件。!DOCTYPE html html langzh-CN head meta charsetUTF-8 title我的个人网站 - 文章列表/title /head body h1我的文章/h1 ul {% for article in articles %} li h2{{ article.title }}/h2 psmall发布于{{ article.created_at|date:Y-m-d H:i }}/small/p p{{ article.content|truncatechars:100 }}/p !-- 只显示前100个字符 -- /li {% empty %} li暂无文章。/li {% endfor %} /ul /body /html{% ... %}这是Django模板标签Template Tags用于执行逻辑如循环、条件判断。{{ ... }}这是模板变量用于输出上下文context中传递过来的数据。|date:Y-m-d H:i和|truncatechars:100这是模板过滤器Filters用于格式化变量。date过滤器格式化日期truncatechars用于截断文本。第三步配置URL路由现在我们需要告诉Django当用户访问某个URL时应该调用哪个视图函数。这需要修改两个地方的urls.py。首先在项目根目录的mywebsite/urls.py中将请求分发到我们的home应用from django.contrib import admin from django.urls import path, include # 引入 include 函数 urlpatterns [ path(admin/, admin.site.urls), path(, include(home.urls)), # 将根路径的请求交给 home 应用的 urls.py 处理 ]然后在home应用目录下创建一个新的urls.py文件from django.urls import path from . import views urlpatterns [ path(, views.article_list, namearticle_list), # 根路径对应 article_list 视图 ]第四步查看成果保存所有文件确保开发服务器在运行。访问http://127.0.0.1:8000/不再是/admin/。你应该能看到一个简单的文章列表页面显示你在管理后台创建的文章标题、时间和部分内容。至此MVT的完整流程走通了用户访问URL → Django根据urls.py找到对应的视图函数 → 视图函数从数据库Model获取数据 → 将数据放入上下文传递给模板Template渲染 → 生成最终的HTML页面返回给用户。4. 从“能跑”到“好用”关键配置与实用技巧基础功能跑通后我们还需要进行一些关键配置让网站更规范、更易用。4.1 静态文件与媒体文件处理个人网站通常需要展示图片、CSS样式、JavaScript脚本等这些统称为静态文件Static Files。用户上传的头像、文章配图等则属于媒体文件Media Files。Django对这两者的处理方式不同。配置静态文件在home应用目录下创建static/home/文件夹同样是为了避免命名冲突。在mywebsite/settings.py中确保STATIC_URL已设置默认是/static/。在模板中加载和使用静态文件{% load static %} !-- 在模板顶部加载static标签库 -- !DOCTYPE html html head link relstylesheet href{% static home/css/style.css %} /head body img src{% static home/images/logo.png %} altLogo /body /html在开发环境 (DEBUG True) 下Django会自动处理/static/路径的请求。在生产环境你需要使用python manage.py collectstatic命令收集所有静态文件到一个目录并通过Nginx等Web服务器来提供。配置媒体文件在mywebsite/settings.py末尾添加# 媒体文件配置 MEDIA_URL /media/ MEDIA_ROOT BASE_DIR / media # 媒体文件存储的根目录BASE_DIR是项目根目录的路径。在项目根目录的mywebsite/urls.py中添加开发环境下的媒体文件服务配置仅用于开发from django.conf import settings from django.conf.urls.static import static urlpatterns [ ... # 你之前的path配置 ] # 仅在开发模式下提供媒体文件服务 if settings.DEBUG: urlpatterns static(settings.MEDIA_URL, document_rootsettings.MEDIA_ROOT)在模型中可以使用FileField或ImageField需要安装Pillow库pip install Pillow来处理上传。class Article(models.Model): ... cover_image models.ImageField(upload_toarticles/covers/, blankTrue, verbose_name封面图)upload_to指定了文件上传到MEDIA_ROOT下的子目录。4.2 模板继承与项目结构优化当网站有多个页面时每个页面都有共同的头部、尾部、导航栏。复制粘贴代码是低效且难以维护的。Django模板的继承机制可以完美解决这个问题。创建基础模板在templates目录下可以在项目根目录创建全局的templates文件夹并在settings.py的TEMPLATES的DIRS中添加其路径或者就在home/templates/下创建base.html。!DOCTYPE html html langzh-CN head meta charsetUTF-8 title{% block title %}我的个人网站{% endblock %}/title link relstylesheet href{% static css/main.css %} {% block extra_head %}{% endblock %} /head body header.../header main {% block content %} !-- 子模板的内容将填充在这里 -- {% endblock %} /main footer.../footer script src{% static js/main.js %}/script {% block extra_scripts %}{% endblock %} /body /html{% block block_name %} ... {% endblock %}定义了一个可被替换的“块”。子模板继承修改article_list.html。{% extends base.html %} {% load static %} {% block title %}文章列表 - 我的个人网站{% endblock %} {% block content %} h1我的文章/h1 ul {% for article in articles %} li.../li {% endfor %} /ul {% endblock %}{% extends base.html %}声明此模板继承自base.html。然后只需要重写需要变化的block即可。4.3 数据库选择与基础性能考量Django默认使用轻量级的SQLite数据库这对于学习和初期开发非常方便因为它无需安装额外的数据库服务。但在项目稍微正式一点或者需要部署时通常会切换到更强大的数据库如PostgreSQL或MySQL。切换数据库以PostgreSQL为例安装数据库适配器pip install psycopg2-binary修改mywebsite/settings.py中的DATABASES配置DATABASES { default: { ENGINE: django.db.backends.postgresql, NAME: mydatabase, # 数据库名 USER: mydatabaseuser, # 用户名 PASSWORD: mypassword, # 密码 HOST: localhost, # 数据库服务器地址 PORT: 5432, # 端口 } }重新运行迁移命令Django会在新的数据库中创建表python manage.py migrate关于“Django怎么解决高并发”的思考对于个人网站初期完全无需担心。如果流量增长可以从以下几点入手缓存Django内置了强大的缓存框架可以将整个页面或部分耗时查询的结果缓存起来如使用Memcached或Redis。数据库优化使用select_related和prefetch_related来减少数据库查询次数解决N1查询问题为常用查询字段建立索引。静态文件服务分离使用Nginx或CDN来服务静态文件和媒体文件减轻Django应用服务器的压力。异步任务对于发送邮件、处理图片等耗时操作使用Celery等工具异步执行避免阻塞Web请求。Django 3.1 也原生支持异步视图。架构升级当单机性能成为瓶颈时可以考虑将应用无状态化通过负载均衡部署多个实例数据库进行读写分离。Django的生态非常成熟社区有大量应对各种场景的解决方案。对于个人网站而言在遇到真正的性能瓶颈之前优先考虑的是功能的快速实现和代码的清晰可维护。5. 十分钟后的道路下一步做什么通过以上步骤你已经在十分钟内如果操作熟练的话搭建起了一个具备后台管理、前端展示、数据持久化功能的个人网站雏形。这只是一个起点。接下来你可以根据自己的需求像搭积木一样丰富这个网站完善博客功能为Article模型添加分类Category、标签Tag字段并建立关联。实现文章详情页Detail View。添加用户系统Django内置了强大的django.contrib.auth应用你可以轻松实现用户注册、登录、退出、权限管理。可以结合django-allauth这样的第三方库实现社交账号登录。构建“关于我”页面创建一个简单的静态页面视图和模板。集成前端框架如果你喜欢React、Vue等现代前端框架可以让Django只提供API通过Django REST framework前端通过AJAX调用构建前后端分离的应用。部署上线选择一家云服务商如阿里云、腾讯云、Heroku、PythonAnywhere将代码部署到生产环境。这涉及到设置生产环境的数据库、静态文件收集、设置DEBUGFalse、配置域名和HTTPS等。这是一个相对独立且重要的技能树。我个人在多次搭建类似项目的经验是初期不要过度设计优先实现核心功能MVP。Django的“全栈”特性允许你快速验证想法。当某个功能用原生Django实现起来变得笨重时再去寻找专门的第三方包Django有海量的可复用应用在Django Packages网站上可以找到。记住完成比完美更重要先让网站跑起来再让它跑得更好、更漂亮。这个从零到一的过程本身就是一次宝贵的学习和创造体验。
返回列表