Django入门教程:搭建你的第一个Python网站(一个老Java后端的“叛逃”实录)
作者:京东五年后端,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自带的admin、auth、orm、migration四大金刚,直接让你省下80%的CRUD代码。这不比在Spring Security里配一天权限香?
而且——Django的哲学是“约定优于配置”,对新手极其友好。不像某些Java框架,光application.yml就能写200行。
环境准备:别再用系统Python了!
首先,千万别直接用python3命令装包!我见过太多人把系统环境搞崩,最后连yum都跑不了(别问我怎么知道的)。
推荐用 venv 或 conda 隔离环境。我习惯用 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.py 的 INSTALLED_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,被运维追着跑。
标准姿势:
- 用
gunicorn启动WSGI应用 - 前面挂
nginx做反向代理和静态文件服务 - 静态文件用
collectstatic收集到CDN - 环境变量管理用
python-decouple或django-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