Django入门教程:搭建你的第一个Python网站

数据Tech
2025-12-18 15:07
阅读 3460

凌晨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 是开发服务器,绝对不能用于生产!它单线程、没静态文件处理、性能极差。

正确姿势:

  1. 用 Gunicorn 做WSGI服务器
  2. Nginx 做反向代理 + 静态文件服务
  3. 数据库换成 PostgreSQL 或 MySQL
  4. 文件上传对接云存储

简单示例(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

最热最新
暂无评论
数据TechLv.1
0
影响力
0
文章
0
粉丝