Django入门教程:搭建你的第一个Python网站
凌晨2点47分,我刚把一个线上支付回调的Bug修完,顺手点了杯冰美式续命。这时候钉钉突然弹出一条消息——“明早10点,产品要演示新活动页面”。我盯着屏幕愣了三秒,心里默默问候了产品经理全家。
这不是第一次了。去年双11前夜,我们组也是这样被临时拉去搞一个“紧急但重要”的营销页。问题是,我们后端全是Java栈(Spring Boot + MyBatis),写个简单页面也得走完整MVC流程,还得配合前端联调、走发布流程、压测……等页面上线,活动都快结束了。
于是那晚我偷偷用Django搭了个临时后台,3小时搞定。结果第二天产品直接说:“就用这个吧,比我们Java项目快多了!”——当然,后来被架构师骂了一顿,说不符合技术规范。但这也让我意识到:有时候,工具没有好坏,只有合不合适。
最近团队来了几个实习生,简历上清一色写着“熟悉Java”、“了解Spring”,但问起快速原型开发,一脸懵。我想,是时候写篇接地气的Django入门教程了。不讲理论,直接上手,让你今晚就能跑起来一个能用的网站——就像我当年在凌晨三点救火那样。
为什么选Django?和Java比到底香在哪?
先说清楚,我不是要贬低Java。我们主业务系统全靠Java撑着,高并发、强一致性、完善的监控体系,稳如老狗。但如果你只是想:
- 快速验证一个产品想法
- 搭个内部管理后台
- 写个爬虫+展示页面
- 或者……像我一样,临时救个火
那Django真香。它自带ORM、Admin后台、用户认证、路由系统,甚至还有CSRF防护——开箱即用,不用像Java那样配一堆XML或注解。
| 维度 | Java (Spring Boot) | Django |
|---|---|---|
| 启动速度 | 较慢(需编译) | 极快(解释执行) |
| 配置复杂度 | 高(application.yml + 注解) | 低(settings.py 直接改) |
| ORM体验 | MyBatis需手写SQL / JPA较重 | 自带ORM,链式查询超爽 |
| 快速原型 | 不适合 | 天生为快速开发而生 |
| 生产部署 | 成熟(JAR + Nginx) | 需配合Gunicorn + Nginx |
所以,别看有些公司招聘写“精通Java优先”,会Python+Django,简历上也能加分——尤其是中小厂或创业团队,他们要的是“今天提需求,明天能上线”的人。
动手!10分钟搭一个“简历管理系统”
假设你现在要帮HR部门搞个内部简历收集站。需求很简单:
- 用户提交姓名、邮箱、简历文件
- 管理员能在后台查看所有提交记录
第一步:装环境(别卡在这)
# 建议用虚拟环境,别污染全局
python -m venv django_env
source django_env/bin/activate # Linux/Mac
# django_env\Scripts\activate # Windows
pip install django
💡 血泪教训:千万别直接
pip install到系统Python!上次我这么干,结果把系统包搞崩了,运维大哥差点把我从工位上拎出去。
第二步:创建项目 & App
django-admin startproject resume_site
cd resume_site
python manage.py startapp resumes # 这个App专门管简历
项目结构长这样:
resume_site/
├── manage.py
├ritable
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
└── resumes/
├── migrations/
├── models.py
├── views.py
└── ...
第三步:设计模型(数据库表)
在 resumes/models.py 里写:
from django.db import models
class ResumeSubmission(models.Model):
name = models.CharField("姓名", max_length=100)
email = models.EmailField("邮箱")
resume_file = models.FileField("简历文件", upload_to="resumes/")
submitted_at = models.DateTimeField("提交时间", auto_now_add=True)
class Meta:
verbose_name = "简历提交"
verbose_name_plural = "简历提交"
🔥 架构思考:这里用了
FileField,实际生产中千万别存本地!应该配成上传到OSS/S3。但我们先跑通逻辑,后面再优化。
然后生成迁移文件并执行:
python manage.py makemigrations
python manage.py migrate
Django自动给你建了表,连外键、索引都帮你考虑好了。对比Java里要手动写DDL或者依赖Flyway,这效率简直了。
第四步:写个表单页面
在 resumes/views.py:
from django.shortcuts import render, redirect
from .models import ResumeSubmission
from django import forms
class ResumeForm(forms.ModelForm):
class Meta:
model = ResumeSubmission
fields = ['name', 'email', 'resume_file']
def submit_resume(request):
if request.method == 'POST':
form = ResumeForm(request.POST, request.FILES)
if form.is_valid():
form.save()
return redirect('success') # 提交成功跳转
else:
form = ResumeForm()
return render(request, 'submit.html', {'form': form})
def success(request):
return render(request, 'success.html')
模板文件放 resumes/templates/ 下(记得在 settings.py 里加 'resumes' 到 INSTALLED_APPS):
<!-- submit.html -->
<form method="post" enctype="multipart/form-data">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">提交简历</button>
</form>
⚠️ 注意
enctype="multipart/form-data",不然文件传不上来!我第一次忘加,调试到凌晨1点,以为是Nginx配置问题……
第五步:配置URL路由
resume_site/urls.py:
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('resumes.urls')),
]
resumes/urls.py(自己新建):
from django.urls import path
from . import views
urlpatterns = [
path('', views.submit_resume, name='submit'),
path('success/', views.success, name='success'),
]
第六步:启用超级管理员(看后台用)
python manage.py createsuperuser
# 按提示输用户名、邮箱、密码
然后启动服务:
python manage.py runserver
访问 http://127.0.0.1:8000/admin,用刚才的账号登录——Boom!自动生成的管理后台,连增删改查都不用写!
生产环境怎么搞?别真拿runserver上线!
我知道你兴奋,但 runserver 是开发服务器,绝对不能用于生产!它单线程、没静态文件处理、性能极差。
正确姿势:
- 用 Gunicorn 做WSGI服务器
- Nginx 做反向代理 + 静态文件服务
- 数据库换成 PostgreSQL 或 MySQL
- 文件上传对接云存储
简单示例(Dockerfile 伪代码):
FROM python:3.9
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt gunicorn
COPY . .
EXPOSE 8000
CMD ["gunicorn", "--bind", "0.0.0.0:8000", "resume_site.wsgi:application"]
然后 Nginx 配置:
location / {
proxy_pass http://django_app:8000;
}
location /static/ {
alias /app/static/;
}
location /media/ {
alias /app/media/; # 实际应指向OSS域名
}
📌 运维经验:我们有一次把
DEBUG=True上线了,结果Django把所有SQL语句打印在网页上……被安全团队通报批评。记住:生产环境DEBUG=False,且配好ALLOWED_HOSTS!
总结:Django不是玩具,而是利器
回过头看,Django帮我解决了太多“小而急”的需求。虽然主业务还是Java扛大旗,但快速验证、内部工具、数据看板这些场景,Django效率高到离谱。
而且学Django对职业发展也有帮助。我上个月面试一个候选人,简历上写着“用Django做过数据分析平台”,聊下来发现他不仅会写代码,还懂部署、调优、安全——这种人,比只会背Spring八股文的香多了。
所以,别被“我们公司用Java”限制住。技术人的核心能力,是解决问题,而不是死守某个语言。
最后送大家一句我工位贴的纸条:
“Deadline面前,能跑就行;但跑起来之后,记得重构。”
好了,咖啡喝完了,我去改下一个Bug了。希望这篇教程能帮你少熬几个夜。
—— 一个经常凌晨还在debug的后端开发

评论 0