Django入门教程:搭建你的第一个Python网站
上周五晚上11点,我正戴着AirPods听着《Bohemian Rhapsody》死磕一个司机端调度接口的性能瓶颈,突然收到前同事的消息:“兄弟,帮我看个Django问题,我这页面500了。”
我一愣——自从在滴滴搞Java微服务搞了四年,我已经快忘了Python长啥样了。但转念一想,最近不是在研究Rust吗?语言这东西,学一门通十门,况且……杭州这边跳槽面试老被问“你会Python吗?”(阿里网易都爱问)。行吧,那就借这个机会,重新拾掇拾掇Django,顺便写篇教程,给和我一样从Java转过来的后端兄弟们铺个路。
为啥一个Java老狗要碰Django?
先说清楚背景:我在滴滴负责司机端核心业务,日常打交道的是Spring Boot + Dubbo + MySQL + Redis 这一套“祖传”架构。Java稳如老狗,但也重得像头牛。上周我们组新来的实习生用Flask三天搭了个内部工具,而我用Spring Boot写了两天还在配Maven依赖……那一刻我悟了:小项目真没必要上重型武器。
产品经理上周还提了个需求:“能不能做个简单的司机反馈收集页?就一个表单加个列表展示。”
我第一反应是:“又要开新服务?走CI/CD?申请K8s资源?”
测试同学一听直接翻白眼:“就这?你用Django半小时搞定不行吗?”
行,你说得对。于是,我决定用Django撸一个最简版的司机反馈系统——就叫 driver-feedback 吧。
环境搭起来,别整那些虚的
我是macOS用户,习惯用 pyenv 管理Python版本(别用系统自带的!血泪教训)。先装个干净的3.11:
pyenv install 3.11.6
pyenv virtualenv 3.11.6 django-demo
pyenv activate django-demo
然后装Django(最新LTS版):
pip install django==4.2.7
接着,一行命令创建项目:
django-admin startproject driver_feedback
cd driver_feedback
python manage.py startapp feedback
看到没?比Spring Initializr点半天快多了。Javaer第一次用Django,最大的冲击就是:它把“约定优于配置”玩到了极致。目录结构、URL路由、ORM映射,全给你安排明白了,不用写一堆XML或者YAML。
写个Model,感受下Python的优雅
我们这个反馈系统很简单:司机提交手机号、问题类型、描述。建个Model:
# feedback/models.py
from django.db import models
class DriverFeedback(models.Model):
PHONE_CHOICES = [
('ANDROID', 'Android'),
('IOS', 'iOS'),
]
phone_type = models.CharField(max_length=10, choices=PHONE_CHOICES)
issue_type = models.CharField(max_length=50)
description = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
class Meta:
db_table = 'driver_feedback'
indexes = [
models.Index(fields=['created_at']),
]
对比一下Java里用JPA写Entity,那堆 @Entity, @Table, @Column 注解……Python这简洁度,简直像开了挂。而且Django ORM的QuerySet API 链式调用特别顺手,比如查最近一天的反馈:
DriverFeedback.objects.filter(created_at__gte=timezone.now() - timedelta(days=1))
Java里你得写个Repository接口再实现,或者用MyBatis写XML……算了,不说了,都是泪。
路由 + View,十分钟搞定CRUD
Django的路由配置清晰到感人:
# driver_feedback/urls.py
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('feedback/', include('feedback.urls')),
]
# feedback/urls.py
from django.urls import path
from . import views
urlpatterns = [
path('', views.create_feedback, name='create'),
path('list/', views.feedback_list, name='list'),
]
View函数也简单粗暴(先不用Class-Based View,新手友好):
# feedback/views.py
from django.shortcuts import render, redirect
from .models import DriverFeedback
from .forms import FeedbackForm
def create_feedback(request):
if request.method == 'POST':
form = FeedbackForm(request.POST)
if form.is_valid():
form.save()
return redirect('list')
else:
form = FeedbackForm()
return render(request, 'feedback/form.html', {'form': form})
def feedback_list(request):
feedbacks = DriverFeedback.objects.all().order_by('-created_at')[:20]
return render(request, 'feedback/list.html', {'feedbacks': feedbacks})
注意这里用了Django自带的 Form,自动处理校验和渲染,比手写JS验证+后端二次校验省事多了。而且模板继承、过滤器这些功能,写前端页面也不至于太痛苦。
数据库 & 性能:别以为玩具框架就不讲武德
虽然Django常被喷“慢”,但那是你不会调。我们生产环境(即使是内部工具)也得考虑性能。
首先,数据库迁移别乱来:
python manage.py makemigrations
python manage.py migrate
上线前一定要检查SQL:
python manage.py sqlmigrate feedback 0001
确保索引、字段类型都符合预期。我们给 created_at 加了索引,避免全表扫描。
其次,N+1问题在Django里一样存在!比如在模板里遍历 feedbacks 并访问外键,会疯狂查DB。解决方案?用 select_related 或 prefetch_related:
# 假如有外键关联
DriverFeedback.objects.select_related('driver').all()
另外,Django自带的Admin后台简直是运维神器。注册一下Model:
# feedback/admin.py
from django.contrib import admin
from .models import DriverFeedback
@admin.register(DriverFeedback)
class FeedbackAdmin(admin.ModelAdmin):
list_display = ('phone_type', 'issue_type', 'created_at')
list_filter = ('phone_type', 'created_at')
跑起来就能直接管理数据,连前端都不用写。上次我们线上有个司机投诉数据异常,我5分钟进Admin查出来是某个渠道传错了 phone_type,救了半夜oncall的命。
Java vs Python:不是替代,是互补
我知道很多Java老炮看不起Python,觉得“动态语言不安全”、“性能差”。但现实是:选型要看场景。
| 场景 | 推荐技术栈 |
|---|---|
| 高并发核心交易系统(如司机派单) | Java + Spring Cloud |
| 内部工具 / MVP原型 / 数据分析脚本 | Python + Django/Flask |
| 系统编程 / 高性能网关 | Rust(我正在啃) |
在滴滴,我们核心链路必须用Java保证稳定性和可观测性;但像司机调研、运营活动页、数据看板这类“一次性”需求,用Django一天上线,谁还愿意等一周走发布流程?
最后一点真心话
写这篇文章的时候,我刚在本地跑通了 driver-feedback,顺手部署到公司内网(用Gunicorn + Nginx,别用开发服务器!)。整个过程不到两小时,包括写模板、调样式、加日志。
如果你是个Java后端,别排斥Python。它不是来取代你的,而是让你在合适的战场用合适的武器。就像我司SRE常说的:“别拿AK47去打蚊子。”
对了,刚收到消息,那个500错误是因为他没 run migrate……唉,程序员的宿命啊。
小贴士:想深入?建议看官方文档《Writing your first Django app》,比任何中文教程都靠谱。别信CSDN上那些2016年的过时教程!
现在,戴上耳机,打开终端,敲下 django-admin startproject hello_world —— 你的第一个Python网站,就从这一行开始。

评论 0