Django作为Python生态中最成熟的Web框架之一,从2005年诞生至今已经服务了Instagram、Pinterest等顶级互联网产品。我使用Django开发过电商平台、内容管理系统和API服务,最深刻的体会就是它"开箱即用"的设计哲学——当你需要用户认证系统时,django.contrib.auth已经准备好了;当你需要后台管理界面时,admin.site.register()三行代码就能生成功能完备的数据管理后台。这种高度的封装性让开发者能专注于业务逻辑而非重复造轮子。
框架的核心优势体现在三个方面:首先是MTV(Model-Template-View)架构的清晰分离,模型定义数据层,模板处理展示层,视图控制业务逻辑,这种模式比传统的MVC更符合Web开发的实际场景;其次是自带ORM系统,用Python类定义数据模型就能自动生成数据库表结构,还支持跨数据库迁移;最后是完善的安全防护,默认开启CSRF保护、XSS过滤和SQL注入防御,这对新手尤其友好。
提示:Django最新LTS版本(4.2.x)已原生支持异步视图和中间件,在处理高并发请求时性能提升显著
推荐使用Python 3.10+和虚拟环境隔离依赖,这是避免包冲突的最佳实践。我的常用配置组合是:
bash复制python -m venv venv # 创建虚拟环境
source venv/bin/activate # 激活环境(Linux/Mac)
pip install django==4.2.3 # 安装指定版本
验证安装成功后,用django-admin命令行工具创建项目骨架:
bash复制django-admin startproject mysite
cd mysite
python manage.py startapp blog # 示例博客应用
项目目录结构解析:
mysite/settings.py:全局配置(数据库、中间件、应用注册等)mysite/urls.py:URL路由入口blog/models.py:应用数据模型定义blog/views.py:业务逻辑处理修改settings.py时这几个参数需要特别注意:
python复制# 安全配置
SECRET_KEY = os.environ.get('SECRET_KEY') # 禁止硬编码在代码中!
DEBUG = False # 生产环境必须关闭
ALLOWED_HOSTS = ['yourdomain.com'] # 白名单控制
# 数据库配置(SQLite示例)
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
# 静态文件配置
STATIC_URL = 'static/'
STATIC_ROOT = BASE_DIR / 'staticfiles' # collectstatic目标目录
踩坑记录:开发时用
python manage.py runserver启动测试服务器,但生产环境必须配合Nginx+Gunicorn等WSGI服务器
Django的ORM系统让数据库操作变得异常简单。假设我们要构建博客系统的文章模型:
python复制from django.db import models
from django.contrib.auth.models import User
class Article(models.Model):
STATUS_CHOICES = [
('draft', '草稿'),
('published', '已发布'),
]
title = models.CharField(max_length=200, verbose_name="标题")
slug = models.SlugField(unique_for_date='publish')
author = models.ForeignKey(User, on_delete=models.CASCADE)
body = models.TextField()
publish = models.DateTimeField(default=timezone.now)
status = models.CharField(max_length=10, choices=STATUS_CHOICES)
class Meta:
ordering = ['-publish']
indexes = [models.Index(fields=['-publish'])]
def __str__(self):
return self.title
模型设计要点:
ForeignKey定义多对一关系,ManyToManyField处理多对多verbose_name设置管理员界面显示名称,choices限定可选值ordering指定默认排序,indexes优化查询性能生成并应用迁移:
bash复制python manage.py makemigrations
python manage.py migrate
Django支持函数视图和类视图两种范式。以文章列表展示为例:
函数视图写法:
python复制from django.shortcuts import render
from .models import Article
def article_list(request):
articles = Article.objects.filter(status='published')
return render(request, 'blog/list.html', {'articles': articles})
类视图写法(推荐):
python复制from django.views.generic import ListView
from .models import Article
class ArticleListView(ListView):
queryset = Article.published.all()
context_object_name = 'articles'
template_name = 'blog/list.html'
paginate_by = 5 # 自动分页
类视图的优势在于内置了常见功能(分页、权限检查等),通过继承django.views.generic中的基类可以快速实现CRUD操作。我常用的几个通用视图类:
ListView:数据列表展示DetailView:单条数据详情CreateView/UpdateView:数据创建/编辑DeleteView:数据删除Django模板语言(DTL)在保持简洁的同时提供了强大的功能。基础模板base.html示例:
html复制<!DOCTYPE html>
<html>
<head>
<title>{% block title %}默认标题{% endblock %}</title>
{% load static %}
<link rel="stylesheet" href="{% static 'css/bootstrap.min.css' %}">
</head>
<body>
{% include "navbar.html" %}
<div class="container">
{% block content %}
{% endblock %}
</div>
{% block javascript %}{% endblock %}
</body>
</html>
关键模板标签:
{% extends "base.html" %}:模板继承{% include "partial.html" %}:片段复用{% for item in list %}:循环控制{% if condition %}:条件判断{{ variable|filter }}:变量输出与过滤器性能技巧:使用
{% static %}标签管理静态文件,生产环境需运行collectstatic命令集中处理
Django内置的认证系统几乎覆盖了所有常见需求。快速实现登录功能:
python复制# urls.py
from django.contrib.auth import views as auth_views
urlpatterns = [
path('accounts/login/', auth_views.LoginView.as_view(), name='login'),
path('accounts/logout/', auth_views.LogoutView.as_view(), name='logout'),
]
自定义用户模型(建议项目初期就设置):
python复制from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
bio = models.TextField(max_length=500, blank=True)
location = models.CharField(max_length=30, blank=True)
birth_date = models.DateField(null=True, blank=True)
# settings.py
AUTH_USER_MODEL = 'myapp.User'
Django REST Framework是构建API的首选工具。安装后快速创建序列化器:
bash复制pip install djangorestframework
python复制# serializers.py
from rest_framework import serializers
from .models import Article
class ArticleSerializer(serializers.ModelSerializer):
author = serializers.StringRelatedField()
class Meta:
model = Article
fields = ['id', 'title', 'slug', 'author', 'body', 'publish']
# views.py
from rest_framework import generics
from .models import Article
from .serializers import ArticleSerializer
class ArticleListAPIView(generics.ListCreateAPIView):
queryset = Article.objects.all()
serializer_class = ArticleSerializer
Nginx + Gunicorn典型配置:
bash复制# 安装Gunicorn
pip install gunicorn
# 启动命令(生产环境应用进程管理器如systemd)
gunicorn --bind 0.0.0.0:8000 mysite.wsgi:application
Nginx配置片段:
nginx复制server {
listen 80;
server_name example.com;
location /static/ {
alias /path/to/staticfiles;
}
location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
}
}
关键安全措施:
SECURE_HSTS_SECONDS强制HTTPSSESSION_COOKIE_SECURE和CSRF_COOKIE_SECUREdjango-environ管理敏感配置症状:OperationalError: could not connect to server
settings.py中的数据库凭据psycopg2-binary包排查步骤:
STATIC_URL和STATIC_ROOT配置正确urls.py中添加:python复制from django.conf import settings
from django.conf.urls.static import static
urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
实测有效的优化手段:
select_related和prefetch_related减少数据库查询@cache_page装饰器django-debug-toolbar分析性能瓶颈python复制# 优化查询示例
articles = Article.objects.select_related('author').prefetch_related('tags')
经过多个项目实践,我总结出这样的分层结构最利于维护:
code复制project/
├── apps/
│ ├── blog/
│ ├── users/
│ └── api/
├── config/
│ ├── settings/
│ │ ├── base.py
│ │ ├── dev.py
│ │ └── prod.py
│ └── urls.py
├── static/
├── templates/
├── manage.py
└── requirements/
├── base.txt
├── dev.txt
└── prod.txt
关键改进点:
apps目录激活这个结构需要在manage.py同级目录创建apps包,并添加__init__.py,然后在settings.py中设置:
python复制import sys
sys.path.insert(0, os.path.join(BASE_DIR, 'apps'))