Django入门教程:搭建你的第一个Python网站(一个老Java后端的“叛逃”实录)

云边有个仓库
2025-12-17 07:22
阅读 1565

作者:京东五年后端,618/双11流量洪峰亲历者,现居杭州,正被阿里和网易的猎头轮番轰炸中

说实话,写这篇Django教程之前,我还在犹豫——毕竟我在京东这五年,写的代码99%都是Java。Spring Boot、MyBatis、Dubbo这些玩意儿早就刻进DNA了。上周五晚上加班改一个大促库存超卖Bug时,产品经理突然冒出来一句:“能不能用Python快速搭个内部工具?我们等不及走Java服务上线流程了。”

那一刻,我差点把咖啡泼他脸上。

但转念一想,跳槽面试时好几个厂都问过“会Python吗”,再看看GitHub上那些热门开源项目,清一色Python生态。行吧,为了简历不那么“单薄”,也为了以后能更快地甩锅给脚本——我决定“叛逃”到Python阵营,从Django开始。


为什么是Django?不是Flask?更不是FastAPI?

别急着喷。我知道现在很多人吹FastAPI性能吊打Django,Flask轻量灵活。但在快速交付一个带Admin后台、用户认证、数据库迁移的完整Web应用这件事上,Django依然是王者。

想象一下:你在京东,双11前两周,运营同学说要一个实时监控大促优惠券核销率的内部看板。你有三天时间,还要兼顾线上稳定性。这时候你还去手撸ORM、手动集成JWT、自己写权限控制吗?醒醒,兄弟,Deadline不等人!

Django自带的adminauthormmigration四大金刚,直接让你省下80%的CRUD代码。这不比在Spring Security里配一天权限香?

而且——Django的哲学是“约定优于配置”,对新手极其友好。不像某些Java框架,光application.yml就能写200行。


环境准备:别再用系统Python了!

首先,千万别直接用python3命令装包!我见过太多人把系统环境搞崩,最后连yum都跑不了(别问我怎么知道的)。

推荐用 venvconda 隔离环境。我习惯用 venv

# 创建虚拟环境
python3 -m venv django_env

# 激活(Linux/Mac)
source django_opt/bin/activate

# Windows 用户用这个
django_env\Scripts\activate

然后装Django:

pip install django

验证一下:

django-admin --version
# 输出类似 4.2.7

顺带一提,Django 5.0 已经支持异步视图了,虽然性能还是干不过Go或Node.js,但对于IO密集型内部工具完全够用。我们京东有些数据同步任务就用Django + Celery跑得飞起。


创建你的第一个项目:Hello, 大促!

执行:

django-admin startproject myshop
cd myshop
python manage.py runserver

浏览器打开 http://127.0.0.1:8000,看到那个火箭图标没?恭喜,你已经超过了50%只看不练的“教程收藏家”。

但别高兴太早——这只是万里长征第一步。接下来我们要加个“商品管理”功能,模拟一个极简电商后台。

创建App

Django项目由多个App组成。别被名字骗了,这里的App不是手机App,而是功能模块

python manage.py startapp products

然后在 myshop/settings.pyINSTALLED_APPS 里加上:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    # ... 其他默认项
    'products',  # <-- 就这行
]

数据库设计:别再用SQLite上生产!

本地开发用SQLite没问题,但一旦涉及并发或部署,赶紧换PostgreSQL或MySQL。我在京东所有服务都用TiDB(兼容MySQL协议),所以这里也用MySQL举例。

先装驱动:

pip install mysqlclient  # 或 PyMySQL(纯Python实现,性能稍差)

然后改 settings.py

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'myshop_db',
        'USER': 'root',
        'PASSWORD': 'your_password',
        'HOST': 'localhost',
        'PORT': '3306',
        'OPTIONS': {
            'init_command': "SET sql_mode='STRICT_TRANS_TABLES'",
            'charset': 'utf8mb4',
        }
    }
}

⚠️ 注意:utf8mb4 才能存emoji!别等到用户昵称带🐶表情时才发现乱码。

定义Model

products/models.py 里写:

from django.db import models

class Product(models.Model):
    name = models.CharField(max_length=100, verbose_name="商品名称")
    price = models.DecimalField(max_digits=10, decimal_places=2, verbose_name="价格")
    stock = models.IntegerField(default=0, verbose_name="库存")
    created_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        db_table = 'product'  # 指定表名,避免Django自动生成app_model格式
        verbose_name = "商品"
        verbose_name_plural = "商品"

    def __str__(self):
        return self.name

💡 经验之谈:db_table 很重要!否则表名会是 products_product,运维同事看到这种命名会半夜打电话骂你。

生成并执行迁移:

python manage.py makemigrations
python manage.py migrate

此时数据库里就多了一张 product 表。对比Java里用Flyway写SQL脚本,是不是清爽多了?


Admin后台:不用写一行前端!

运行:

python manage.py createsuperuser
# 按提示输入用户名、邮箱、密码

然后启动服务,访问 /admin,用刚才的账号登录。

你会发现……空的?因为还没注册Model!

products/admin.py 里加:

from django.contrib import admin
from .models import Product

@admin.register(Product)
class ProductAdmin(admin.ModelAdmin):
    list_display = ('name', 'price', 'stock', 'created_at')
    search_fields = ('name',)
    list_filter = ('created_at',)

刷新页面,商品管理界面直接出来了!增删改查、搜索、筛选全都有。这要是用Java+Vue,前端至少得两天。


写个API接口:别再return render了!

虽然Django原生支持模板渲染,但如今前后端分离是主流。我们直接返回JSON。

products/views.py

from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt
from django.utils.decorators import method_decorator
from django.views import View
import json

@method_decorator(csrf_exempt, name='dispatch')  # 仅测试用!生产环境务必处理CSRF
class ProductListView(View):
    def get(self, request):
        products = Product.objects.all().values('id', 'name', 'price', 'stock')
        return JsonResponse(list(products), safe=False)

    def post(self, request):
        data = json.loads(request.body)
        product = Product.objects.create(
            name=data['name'],
            price=data['price'],
            stock=data['stock']
        )
        return JsonResponse({'id': product.id}, status=201)

然后在 products/urls.py(先创建这个文件):

from django.urls import path
from . import views

urlpatterns = [
    path('api/products/', views.ProductListView.as_view(), name='product_list'),
]

别忘了在主 urls.py 里 include:

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('products.urls')),
]

现在你可以用 curl 测试:

# 创建商品
curl -X POST http://127.0.0.1:8000/api/products/ \
  -H "Content-Type: application/json" \
  -d '{"name":"iPhone 15", "price":5999, "stock":100}'

# 获取列表
curl http://127.0.0.1:8000/api/products/

🚨 警告:上面的csrf_exempt只是演示!生产环境必须用DRF(Django REST Framework)做规范的API,并开启CSRF保护。否则安全团队会让你“体验”一次渗透测试。


性能优化:别以为Django只能做玩具

很多人黑Django慢,其实是不会用。我在GitHub上扒过几个高星项目,发现他们都在做这几件事:

优化手段 说明 效果
select_related / prefetch_related 减少N+1查询 QPS提升3-5倍
缓存(Redis) 缓存热点数据 RT降低80%
Gunicorn + Nginx 生产部署标配 支撑千级并发
异步任务(Celery) 耗时操作异步化 主流程RT < 100ms

举个例子,如果你要展示商品及其分类:

# 错误示范:N+1查询
products = Product.objects.all()
for p in products:
    print(p.category.name)  # 每次都查一次category表!

# 正确做法:
products = Product.objects.select_related('category').all()

另外,Django ORM虽然方便,但复杂查询还是建议用原生SQL。别死磕Q对象,该写extra()就写。


部署上线:别再用runserver了!

本地runserver是单线程开发服务器,绝对不能用于生产!我见过实习生这么干,结果线上502,被运维追着跑。

标准姿势:

  1. gunicorn 启动WSGI应用
  2. 前面挂 nginx 做反向代理和静态文件服务
  3. 静态文件用 collectstatic 收集到CDN
  4. 环境变量管理用 python-decoupledjango-environ

简单示例:

# 安装
pip install gunicorn

# 启动(4个工作进程)
gunicorn --workers 4 --bind 0.0.0.0:8000 myshop.wsgi:application

配合Nginx配置略过,网上一搜一大把。重点是:记得关DEBUG模式!

# settings.py
DEBUG = False
ALLOWED_HOSTS = ['your-domain.com']  # 必须设置!

否则你会收到一封来自安全团队的“亲切问候”。


最后:Java老兵的几点真心话

写完这个教程,我突然理解为什么那么多初创公司用Django——它让你专注业务逻辑,而不是框架本身。虽然Java在大型分布式系统里依然不可替代(比如我们京东的交易核心链路),但做MVP、内部工具、数据分析平台,Python + Django快得飞起。

当然,Django也不是银弹。如果你要做高并发、低延迟的网关服务,还是Go更合适;如果追求极致性能,C++/Rust才是王道。但作为全栈能力的补充,Django绝对是值得掌握的利器。

顺便说一句,上周我用Django三天搞定的那个优惠券看板,已经上线了。产品经理请我喝了杯瑞幸——虽然比不上618发的奖金,但至少不用再听他BB“Java怎么这么慢”了。


附:常用工具 & 学习资源

  • GitHub 仓库模板cookiecutter-django —— 生产级项目脚手架
  • API开发:必装 djangorestframework,文档比Springfox好100倍
  • 调试神器django-debug-toolbar,本地开发时显示SQL、缓存、模板调用栈
  • 性能分析py-spy + flamegraph,比Arthas更直观(没错,我在用Python工具分析Python)

最后送大家一句话:语言只是工具,解决问题才是目的。别站队,别鄙视链,能按时下班、线上不报警的代码,就是好代码。


本文代码已整理至我的GitHub:https://github.com/yourname/django-first-app(别点,是假的,但你可以自己建一个)
杭州最近秋招火热,有内推需求的可以私信,JD岗优先 😎

评论 0

最热最新
暂无评论
云边有个仓库Lv.1
0
影响力
0
文章
0
粉丝