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

算法边缘人
2025-12-19 13:43
阅读 209

上周五晚上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_relatedprefetch_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

最热最新
暂无评论
匿名用户Lv.1
0
影响力
0
文章
0
粉丝