Django入门教程:搭建你的第一个Python网站
凌晨2点17分,我第N次刷新LeetCode页面,看着那道“设计一个高并发短链系统”的题目发呆。咖啡已经凉了,但脑子还在高速运转——毕竟下周就要面试了,得把Python后端这块补上。作为一个常年混迹Java生态的后端老油条(别问,问就是被前公司技术栈绑架了五年),最近为了跳槽硬着头皮开始学Django。结果没想到,一入Python深似海,从此Java是路人。
说真的,在Java的世界里写个Hello World都得先搭Spring Boot全家桶,配一堆application.yml,还要祈祷Maven别抽风。而Django?一行命令就能跑起来一个完整的Web站点,简直是对我们这些被Java“折磨”多年的老程序员的一种救赎。
为什么突然从Java转投Django怀抱?
事情得从上周五说起。那天晚上刚改完一个线上紧急Bug(又是产品经理临时改需求,说好的“这个功能很简单”最后搞到凌晨三点),我瘫在椅子上刷招聘网站,发现几乎所有Python后端岗都写着“熟悉Django优先”。而我自己呢?除了在学校用Flask写过一个TODO List,对Django几乎一无所知。
更扎心的是,隔壁组那个95后小哥用Django三天就搭了个内部管理后台,还顺手加了RBAC权限控制和审计日志。而我们组还在用老旧的Spring MVC + JSP,每次改个页面都要重启Tomcat,运维大哥看我们的眼神都带着怜悯。
于是我痛下决心:必须拿下Django!
别被“框架”吓到,Django其实很温柔
很多人一听“Web框架”就想到复杂配置、陡峭学习曲线。但Django的设计哲学是“开箱即用”(Batteries included)。它不像Flask那样“极简到骨子里”,而是直接给你一套完整的工具箱——ORM、Admin后台、用户认证、模板引擎、静态文件处理……甚至连CSRF防护都默认开了。
小插曲:第一次跑
python manage.py runserver看到那个绿色的启动日志时,我真的愣住了——这玩意儿居然自带开发服务器?不用配Nginx?不用打WAR包?Javaer表示世界观受到了冲击。
第一步:装环境(别翻车)
我用的是Python 3.10(别用3.12,某些依赖还没适配),虚拟环境走起:
python -m venv django_env
source django_env/bin/activate # Linux/Mac
# django_env\Scripts\activate # Windows
pip install django
验证安装:
django-admin --version
# 输出类似 4.2.7
踩坑提醒:千万别在全局Python环境装!我上次不小心把Django装到系统Python里,结果和另一个项目的依赖冲突,差点重装系统。血泪教训!
第二步:创建你的第一个项目
django-admin startproject mysite
cd mysite
python manage.py runserver
打开浏览器访问 http://127.0.0.1:8000,看到那只可爱的火箭图标没?恭喜你,已经比当年的我领先一步了!
理解Django的核心:MTV架构
Django用的是MTV(Model-Template-View),对应Java里的MVC:
| Django | Java (Spring MVC) |
|---|---|
| Model | Entity / DAO |
| Template | Thymeleaf / JSP |
| View | Controller |
简单说:
- Model:定义数据结构(对应数据库表)
- Template:HTML模板(带变量和逻辑)
- View:处理请求,返回响应(业务逻辑层)
这种分层让代码结构清晰,特别适合快速开发。对比我们以前在Java项目里,Controller里塞满业务逻辑、Service层又调DAO又拼SQL的混乱场面,Django的约束反而是一种解放。
实战:做一个简单的博客系统
光说不练假把式。咱们来实现一个最简博客——能展示文章列表、查看详情就行。
1. 创建App
Django项目由多个App组成(类似微服务模块):
python manage.py startapp blog
然后在 mysite/settings.py 的 INSTALLED_APPS 里注册它:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
# ... 其他默认项
'blog', # <-- 加这一行
]
2. 定义Model(数据层)
在 blog/models.py 中:
from django.db import models
from django.contrib.auth.models import User
class Post(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
author = models.ForeignKey(User, on_delete=models.CASCADE) # 外键关联Django内置用户
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
return self.title
注意这里用了Django自带的User模型,省去了自己实现登录注册的麻烦——这对赶Deadline的打工人简直是福音!
3. 数据库迁移(告别手动建表)
Django的ORM会根据Model自动生成SQL。执行:
python manage.py makemigrations
python manage.py migrate
搞定!数据库(默认SQLite)里已经有blog_post表了。再也不用像Java项目那样,既要写Entity又要写MyBatis XML还要手动改数据库结构,改一次字段能累死人。
性能提示:生产环境别用SQLite!换成PostgreSQL或MySQL。不过本地开发用SQLite完全够用,轻量又方便。
4. 写View(业务逻辑)
在 blog/views.py:
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/list.html', {'posts': posts})
def post_detail(request, post_id):
post = Post.objects.get(id=post_id)
return render(request, 'blog/detail.html', {'post': post})
是不是超简洁?对比Spring里要写@RestController、@GetMapping、各种DTO转换……这里直接查数据+渲染模板,三行搞定。
5. 配置URL路由
在 blog/urls.py(没有就新建):
from django.urls import path
from . import views
urlpatterns = [
path('', views.post_list, name='post_list'),
path('post/<int:post_id>/', views.post_detail, name='post_detail'),
]
再在主项目 mysite/urls.py 中包含它:
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('blog.urls')), # 包含blog的路由
]
6. 写模板(前端界面)
Django模板语法简单直观。创建目录 blog/templates/blog/,然后:
list.html:
<h1>我的博客</h1>
<ul>
{% for post in posts %}
<li>
<a href="{% url 'post_detail' post.id %}">{{ post.title }}</a>
<small>by {{ post.author.username }} at {{ post.created_at }}</small>
</li>
{% endfor %}
</ul>
detail.html:
<h1>{{ post.title }}</h1>
<p>作者: {{ post.author.username }}</p>
<div>{{ post.content }}</div>
<a href="{% url 'post_list' %}">← 返回列表</a>
模板里用{{ }}插值,{% %}写逻辑,对前端小白极其友好。而且Django自动转义HTML防止XSS,安全做得比很多手写Java模板强多了。
调试与开发效率:Django的隐藏福利
作为深夜码农,我最看重开发体验。Django有几个神级功能:
- 自动重载:改代码保存后,开发服务器自动重启(不用像Java那样等Maven编译30秒)
- 调试页面:出错时显示详细堆栈+可交互的调试控制台(比Java的500错误页面友好多了)
- Admin后台:一行命令生成完整CRUD界面
试试这个:
python manage.py createsuperuser # 按提示创建管理员账号
然后访问 http://127.0.0.1:8000/admin,用刚创建的账号登录。你会发现Post模型已经可以增删改查了!不用写一行前端代码。
真实场景:上周我用这个功能给测试同学临时加了个数据配置后台,他们感动得差点请我喝奶茶。而在Java项目里,光是搭个Vue+Axios的管理界面就得两天。
性能优化初探:别以为Django只是玩具
很多人吐槽Django慢,其实那是用法问题。作为性能优化爱好者,我发现只要注意几点,Django完全可以扛住高并发:
| 优化点 | 做法 | 效果 |
|---|---|---|
| 数据库查询 | 用select_related/prefetch_related避免N+1 |
减少80% SQL查询 |
| 缓存 | 集成Redis缓存热点数据 | QPS提升3-5倍 |
| 静态文件 | 用WhiteNoise或CDN | 页面加载快2倍 |
| 异步任务 | 用Celery处理耗时操作 | 避免阻塞请求 |
举个例子,刚才的post_list如果有很多作者,会触发N+1查询问题。优化后:
# views.py
posts = Post.objects.select_related('author').all()
这样就把作者信息一次性查出来,而不是每篇文章单独查一次。这种细节在Java里可能要用MyBatis的<collection>标签折腾半天,Django ORM原生支持。
资源推荐:少走弯路
自学过程中我踩过不少坑,这些资源真心帮了大忙:
- 官方文档:https://docs.djangoproject.com/ (写得比大多数商业框架文档都清晰)
- 《Django for Beginners》:免费在线书,实战导向
- Django Packages:https://djangopackages.org/ (找轮子首选)
- Real Python教程:深入浅出讲原理
特别提醒:别一上来就学DRF(Django REST Framework)!先把基础Web搞明白。我见过太多人直接跳REST API,结果连模板渲染都没弄懂,后期维护一脸懵。
开发心得:为什么我觉得Django适合跳槽党
- 学习曲线平缓:相比Spring Boot的“配置地狱”,Django约定大于配置,新手友好
- 全栈能力:前后端一体开发,面试时能展示完整项目
- 社区活跃:遇到问题Stack Overflow基本都有答案
- 部署简单:配合Gunicorn+Nginx,比Java应用少操心JVM调优
当然,Django不是银弹。超大规模系统可能还是Java+微服务更稳,但对于中小项目、MVP验证、个人作品集,Django的开发速度碾压Java。
上周我把这个博客demo部署到Heroku(免费!),加上GitHub Actions自动部署,整个过程不到1小时。而同样功能用Spring Boot,光是Dockerfile和Jenkins配置就得折腾一天。
最后:别怕尝试新东西
写这篇文章的时候,我已经用Django重写了之前用Java写的两个内部工具,代码量减少60%,bug也少了。虽然短期内可能还得在Java项目里搬砖,但掌握Django让我在面试时多了不少谈资——毕竟现在大厂都在招Python后端,懂Django绝对是加分项。
如果你也和我一样,厌倦了Java的繁文缛节,想找个高效工具快速产出,不妨试试Django。它可能不会让你立刻涨薪,但至少能让你在深夜加班时,少砸一台电脑。
彩蛋:刚写完这篇,LeetCode那道短链题我用Django+Redis十分钟就搞定了原型。而用Java?估计还在配Spring Data Redis……

评论 0