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

链表断了
2025-12-19 14:43
阅读 2110

凌晨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.pyINSTALLED_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有几个神级功能:

  1. 自动重载:改代码保存后,开发服务器自动重启(不用像Java那样等Maven编译30秒)
  2. 调试页面:出错时显示详细堆栈+可交互的调试控制台(比Java的500错误页面友好多了)
  3. 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原生支持。

资源推荐:少走弯路

自学过程中我踩过不少坑,这些资源真心帮了大忙:

特别提醒:别一上来就学DRF(Django REST Framework)!先把基础Web搞明白。我见过太多人直接跳REST API,结果连模板渲染都没弄懂,后期维护一脸懵。

开发心得:为什么我觉得Django适合跳槽党

  1. 学习曲线平缓:相比Spring Boot的“配置地狱”,Django约定大于配置,新手友好
  2. 全栈能力:前后端一体开发,面试时能展示完整项目
  3. 社区活跃:遇到问题Stack Overflow基本都有答案
  4. 部署简单:配合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

最热最新
暂无评论
链表断了Lv.1
0
影响力
0
文章
0
粉丝