用Django搭个网站,真有那么难吗?

深度学习小白
2025-12-24 00:25
阅读 310

上周五晚上十一点半,我还在工位上对着终端发呆。产品经理刚甩过来一个需求:“下周三上线一个内部工具页面,就展示点数据,很简单吧?”
简单?呵。

我是阿里云这边的一个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.pymodels.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后台。只需三步:

  1. 注册模型:

    # hello/admin.py
    from django.contrib import admin
    from .models import Message
    
    admin.site.register(Message)
    
  2. 创建超级用户:

    python manage.py createsuperuser
    # 按提示输入用户名、邮箱、密码
    
  3. 访问 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部署。

简单流程:

  1. 安装Gunicorn:pip install gunicorn
  2. 启动:gunicorn mysite.wsgi:application --bind 0.0.0.0:8000
  3. 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

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