用Django搭个网站,真有那么难吗?
上周五晚上十一点半,我还在工位上对着终端发呆。产品经理刚甩过来一个需求:“下周三上线一个内部工具页面,就展示点数据,很简单吧?”
简单?呵。
我是阿里云这边的一个AI算法工程师,日常任务不是调参就是炼丹,但不知道从哪天起,团队里“全栈化”的口号越来越响。领导说:“光会PyTorch不够,得能端到端交付。”于是,写后端、配Nginx、甚至改前端CSS都成了我的活儿。
最近在杭州面试了几家,发现网易那边连算法岗都要问RESTful API设计。没办法,只能逼自己学点Web开发。好在Python生态友好,Django这个“大而全”的框架,对新手特别宽容——至少比让我去写Go服务或者React组件舒服多了(虽然我也在偷偷啃React文档)。
今天这篇,就手把手带你用Django搭出第一个能跑的网站。不整虚的,全是实战踩坑后的干货。
为什么选Django?而不是Flask、Go或者直接上React?
先说清楚:我不是Web开发专家,只是个被业务逼着写接口的算法狗。所以选框架的标准很朴素:快、稳、少踩坑。
- Flask?轻量是轻量,但啥都要自己配,对新手反而更累。
- Go?性能确实猛,可我连goroutine还没搞明白,贸然上生产环境怕半夜被PagerDuty叫醒。
- React?前端的事前端管!但如果你像我一样,既要写模型又要暴露API,那Django自带的Admin + ORM + 模板系统,简直救命。
而且Django遵循“约定优于配置”,很多安全、用户认证、数据库迁移这些脏活累活,它都给你封装好了。对我们这种“兼职后端”来说,省下的时间够多调两轮学习率了。
环境准备:别再用系统Python了!
第一步永远是最容易翻车的。我见过太多人直接 pip install django,结果污染了全局环境,最后连Jupyter都打不开。
正确姿势:
# 创建虚拟环境(Python 3.8+ 推荐)
python -m venv mysite_env
# 激活(Linux/Mac)
source mysite_prototype/bin/activate
# Windows 用户用这个
mysite_env\Scripts\activate
# 安装Django(当前最新稳定版 5.x)
pip install django
确认安装成功:
django-admin --version
# 输出类似:5.0.3
🙋♂️ 小贴士:别用root权限装包!上次我同事sudo pip install,结果把系统包管理器搞崩了,运维大哥差点把他拉黑。
起手式:创建你的第一个项目
Django把“项目”和“应用”分开设计,一开始有点绕,但理解后会觉得很清晰:
- 项目(Project):整个网站的容器,包含配置、路由等。
- 应用(App):具体功能模块,比如用户系统、博客、商品管理。
创建项目:
django-admin startproject mysite
cd mysite
目录结构长这样:
mysite/
manage.py
mysite/
__init__.py
settings.py # 核心配置文件
urls.py # 总路由
asgi.py
wsgi.py
启动开发服务器:
python manage.py runserver
打开浏览器访问 http://127.0.0.1:8000,看到那只可爱的火箭图标——恭喜,你已经跑起来一个Web服务了!
💡 注意:默认只监听本地。如果想让局域网其他人访问(比如给产品经理演示),加个参数:
python manage.py runserver 0.0.0.0:8000
但记得别在公网裸奔,Django开发服务器不能用于生产环境!
加个功能:写个“Hello World”页面
现在我们来创建一个真正的应用。假设我们要做个简单的“问候服务”。
python manage.py startapp hello
Django会生成 hello/ 目录,里面包含 views.py、models.py 等文件。
第一步:写视图(View)
编辑 hello/views.py:
from django.http import HttpResponse
def greet(request):
return HttpResponse("Hello, Django! 这可是我亲手写的第一个页面!")
第二步:配置URL路由
Django的路由是分层的。先在 hello/ 下创建 urls.py:
from django.urls import path
from . import views
urlpatterns = [
path('', views.greet, name='greet'),
]
然后在项目的总路由 mysite/urls.py 中引入:
from django.contrib import admin
from django.urls import path, include # 别忘了import include
urlpatterns = [
path('admin/', admin.site.urls),
path('hello/', include('hello.urls')), # 新增这一行
]
现在访问 http://127.0.0.1:8000/hello/,就能看到你的问候语了!
数据库?别慌,Django帮你搞定
作为算法工程师,我对SQL又爱又恨。Django的ORM简直是救星——你只需要定义Python类,它自动转成数据库表。
比如,我想存用户的留言:
# hello/models.py
from django.db import models
class Message(models.Model):
content = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.content[:20] # 方便Admin后台显示
然后执行两步:
# 1. 生成迁移文件
python manage.py makemigrations
# 2. 应用到数据库(默认是SQLite,开箱即用)
python manage.py migrate
Django会自动创建 db.sqlite3 文件,并建好表。你甚至不用装MySQL!
⚠️ 生产环境当然要用PostgreSQL或MySQL,但本地开发用SQLite完全够用,还能直接提交到Git(虽然不推荐)。
试试Django Admin:不用写前端也能管理数据!
最让我震惊的是Django自带的Admin后台。只需三步:
注册模型:
# hello/admin.py from django.contrib import admin from .models import Message admin.site.register(Message)创建超级用户:
python manage.py createsuperuser # 按提示输入用户名、邮箱、密码访问
http://127.0.0.1:8000/admin,登录后就能增删改查Message了!
这功能太适合内部工具了。上周我给算法团队搭了个模型指标看板,产品经理想自己改阈值,我就开了个Admin账号给他——他高兴坏了,再也不催我改前端了。
关于前后端分离:Django + React 可行吗?
当然可以!虽然Django擅长服务端渲染,但它也能当纯API后端用。
思路很简单:
- 用Django REST framework(DRF)暴露JSON API
- 前端用React/Vue单独开发,通过AJAX请求数据
举个例子,把Message变成API:
# 先装DRF
pip install djangorestframework
# settings.py 中添加
INSTALLED_APPS = [
...
'rest_framework',
'hello',
]
# views.py 改成
from rest_framework.decorators import api_view
from rest_framework.response import Response
from .models import Message
@api_view(['GET'])
def message_list(request):
messages = Message.objects.all().values('id', 'content', 'created_at')
return Response(list(messages))
前端React组件就可以这样调:
useEffect(() => {
fetch('/api/messages/')
.then(res => res.json())
.then(data => setMessageList(data));
}, []);
不过要注意CORS问题。开发时可以用 django-cors-headers 包解决。
🤔 个人建议:如果是内部工具、MVP原型,直接用Django模板更快;如果是复杂交互产品,再考虑前后端分离。别为了“技术先进”而增加复杂度。
部署上线?小心这些坑!
Django开发服务器不能上生产,这是常识。但在阿里,我们通常用Gunicorn + Nginx部署。
简单流程:
- 安装Gunicorn:
pip install gunicorn - 启动:
gunicorn mysite.wsgi:application --bind 0.0.0.0:8000 - Nginx反向代理静态文件和请求
但最头疼的是静态文件(CSS/JS/图片)。Django默认不处理,需要:
# settings.py
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
# 然后运行
python manage.py collectstatic
这一步会把所有app的static文件收集到staticfiles目录,Nginx再指向这里。
🚨 血泪教训:去年双11前,我们有个服务没配STATIC_ROOT,线上CSS全挂了,页面变纯文本。测试同学截图发群里:“你们的‘极简风’挺前卫啊?” 我当场社死。
最后说两句:Django适合你吗?
如果你是:
- Python使用者
- 需要快速交付原型
- 不想深陷Webpack/Go并发模型的泥潭
那Django绝对值得一试。它可能不够“酷”,但足够可靠。
我在杭州面了几家公司,发现不管是阿里还是网易,内部工具链大量使用Django。它不像Go那样追求极致性能,也不像React生态那样日新月异,但胜在稳定、文档全、社区大。
写完这篇文章,我的内部工具也终于上线了。产品经理回了句:“不错,下次加个导出Excel功能。”
唉,程序员的命,就是不断“下次”。
不过,至少这次我没砸电脑。
附:常用命令速查表
| 功能 | 命令 |
|---|---|
| 创建项目 | django-admin startproject xxx |
| 创建应用 | python manage.py startapp xxx |
| 数据库迁移 | makemigrations + migrate |
| 启动开发服务器 | python manage.py runserver |
| 创建超级用户 | python manage.py createsuperuser |
| 收集静态文件 | python manage.py collectstatic |
共勉。

评论 0