本文目录导读:
使用Django快速搭建企业级网站,核心在于利用其“电池内置”的特性,并结合一些成熟的架构模式和第三方库,企业级网站通常涉及用户认证、权限管理、后台管理、API接口、缓存、日志、测试和部署等。
下面是一套从零到一、可快速上手的完整方案,分为“项目初始化”、“核心功能实现”和“生产环境配置”三个阶段。
第一阶段:项目初始化与基础架构 (30分钟)
-
环境准备与项目创建
# 1. 创建虚拟环境 python -m venv venv source venv/bin/activate # Windows: venv\Scripts\activate # 2. 安装核心依赖 pip install django djangorestframework django-cors-headers django-extensions # 3. 创建项目和应用 django-admin startproject mycompany . python manage.py startapp accounts python manage.py startapp core python manage.py startapp blog # 示例业务模块
-
配置
settings.py(关键步骤) 使用一个环境变量管理库(如python-decouple或django-environ)来分离配置。# settings.py (核心部分) from pathlib import Path import os from decouple import config, Csv # pip install python-decouple # ... 基础配置 ... # 安全密钥隐式存储 SECRET_KEY = config('SECRET_KEY', default='django-insecure-...') # 生产环境必须关闭调试 DEBUG = config('DEBUG', default=False, cast=bool) # 允许的主机 ALLOWED_HOSTS = config('ALLOWED_HOSTS', default='localhost,127.0.0.1', cast=Csv()) # 已安装应用 (按顺序) INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', # 第三方库 'rest_framework', 'corsheaders', 'django_extensions', # 自定义应用 'accounts', 'core', 'blog', ] # 中间件 (CORS 中间件放最前面) MIDDLEWARE = [ 'corsheaders.middleware.CorsMiddleware', # ... 其他默认中间件 ... ] # 数据库 (默认SQLite, 生产建议PostgreSQL) DATABASES = { 'default': { 'ENGINE': config('DB_ENGINE', default='django.db.backends.sqlite3'), 'NAME': config('DB_NAME', default=os.path.join(BASE_DIR, 'db.sqlite3')), # 生产环境添加 USER, PASSWORD, HOST, PORT } } # 静态文件 (CSS, JS, Images) STATIC_URL = '/static/' STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')] # 开发时存放 STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles') # 收集命令用 # 媒体文件 (用户上传) MEDIA_URL = '/media/' MEDIA_ROOT = os.path.join(BASE_DIR, 'media') # CORS 配置 (允许API跨域) CORS_ALLOW_ALL_ORIGINS = DEBUG # 生产环境替换为具体域名 -
创建
.env文件 (放在项目根目录,不提交到Git)SECRET_KEY=your-strong-secret-key DEBUG=True ALLOWED_HOSTS=localhost,127.0.0.1
第二阶段:核心功能快速搭建 (2小时)
-
用户认证 (Accounts App)
- 扩展Django自带的User模型 (使用
AbstractUser) - 添加邮箱注册、手机号登录
- 集成
django-allauth(社交登录、邮箱验证) 或simplejwt(API Token认证)
# accounts/models.py from django.contrib.auth.models import AbstractUser from django.db import models class User(AbstractUser): phone = models.CharField(max_length=15, blank=True) avatar = models.ImageField(upload_to='avatars/', blank=True) # 添加企业需要的其他字段# settings.py 中指定自定义用户模型 AUTH_USER_MODEL = 'accounts.User'
- 扩展Django自带的User模型 (使用
-
后台管理 (Admin)
- 快速生成可操作的数据管理界面。
- 使用
django-grappelli或django-suit美化界面。
# core/admin.py from django.contrib import admin from .models import Article, Category # 假设的数据模型 @admin.register(Article) class ArticleAdmin(admin.ModelAdmin): list_display = ('title', 'category', 'status', 'created_at') list_filter = ('status', 'category') search_fields = ('title', 'content') actions = ['make_published'] def make_published(self, request, queryset): queryset.update(status='published') make_published.short_description = "标记为已发布" -
RESTful API (使用DRF)
- 为企业移动端或前端SPA提供数据接口。
# blog/views.py from rest_framework import viewsets from .models import Article from .serializers import ArticleSerializer from rest_framework.permissions import IsAuthenticatedOrReadOnly class ArticleViewSet(viewsets.ModelViewSet): queryset = Article.objects.filter(status='published') serializer_class = ArticleSerializer permission_classes = [IsAuthenticatedOrReadOnly] def perform_create(self, serializer): serializer.save(author=self.request.user)# blog/serializers.py from rest_framework import serializers from .models import Article class ArticleSerializer(serializers.ModelSerializer): author_name = serializers.CharField(source='author.username', read_only=True) class Meta: model = Article fields = '__all__' # 或指定字段 ['id', 'title', ...]# mycompany/urls.py from rest_framework.routers import DefaultRouter router = DefaultRouter() router.register(r'articles', ArticleViewSet, basename='article') urlpatterns = [ path('admin/', admin.site.urls), path('api/', include(router.urls)), path('api-auth/', include('rest_framework.urls')), # 可浏览API的登录界面 ] -
权限与分组
- 利用Django自带的
Permission和Group模型。 - 创建
admin,editor,viewer等组,分别赋予不同应用权限。 - 在Admin或API中使用
@permission_required或DjangoGuardian实现对象级权限。
- 利用Django自带的
第三阶段:生产环境配置与优化 (1小时)
-
使用纯PostgreSQL
# settings.py DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql', 'NAME': config('DB_NAME'), 'USER': config('DB_USER'), 'PASSWORD': config('DB_PASSWORD'), 'HOST': config('DB_HOST', default='localhost'), 'PORT': config('DB_PORT', default='5432'), } } -
静态文件与媒体文件托管
- 使用
whitenoise中间件托管静态文件(适用于小型站点,大型建议上CDN)。 - 媒体文件使用云存储(如AWS S3, 阿里云OSS)。
# settings.py MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'whitenoise.middleware.WhiteNoiseMiddleware', # 紧接SecurityMiddleware ... ] # 静态文件压缩和缓存 STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage' - 使用
-
安全配置 (必须)
# settings.py SECURE_SSL_REDIRECT = True # 强制HTTPS SESSION_COOKIE_SECURE = True CSRF_COOKIE_SECURE = True SECURE_HSTS_SECONDS = 31536000 # HTTP Strict Transport Security SECURE_HSTS_INCLUDE_SUBDOMAINS = True SECURE_CONTENT_TYPE_NOSNIFF = True X_FRAME_OPTIONS = 'DENY'
-
性能优化
- 缓存: 使用
django-redis配置Redis。CACHES = { 'default': { 'BACKEND': 'django_redis.cache.RedisCache', 'LOCATION': config('REDIS_URL', default='redis://localhost:6379/1'), 'OPTIONS': {'CLIENT_CLASS': 'django_redis.client.DefaultClient'}, } } # 在视图中使用: from django.core.cache import cache - 数据库查询优化: 使用
select_related和prefetch_related减少N+1问题。 - GZip压缩: 启用
django.middleware.gzip.GZipMiddleware。
- 缓存: 使用
-
日志与监控
# settings.py LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'file': { 'level': 'ERROR', 'class': 'logging.FileHandler', 'filename': os.path.join(BASE_DIR, 'logs/django.log'), }, }, 'loggers': { 'django': { 'handlers': ['file'], 'level': 'ERROR', 'propagate': True, }, }, }生产环境建议对接
Sentry进行错误追踪。 -
部署脚本 (Docker化 - 推荐) 创建
Dockerfile和docker-compose.yml:# docker-compose.yml version: '3.8' services: db: image: postgres:15 environment: POSTGRES_DB: mydb POSTGRES_USER: user POSTGRES_PASSWORD: password web: build: . command: > sh -c "python manage.py migrate && python manage.py collectstatic --noinput && gunicorn mycompany.wsgi:application --bind 0.0.0.0:8000 --workers 4" volumes: - .:/app - static_volume:/app/staticfiles - media_volume:/app/media ports: - "8000:8000" environment: - SECRET_KEY=${SECRET_KEY} - DEBUG=False - DB_NAME=mydb - DB_USER=user - DB_PASSWORD=password - DB_HOST=db depends_on: - db nginx: image: nginx:latest volumes: - ./nginx.conf:/etc/nginx/nginx.conf - static_volume:/static - media_volume:/media ports: - "80:80" depends_on: - web volumes: static_volume: media_volume:
关键技巧与总结
- 不要重复造轮子: 用户认证用
django-allauth, API用DRF, 后台用django-admin, 任务队列用Celery, 搜索用Elasticsearch-dsl-py。 - 代码结构:
project/ ├── mycompany/ # 项目配置 ├── accounts/ # 用户模块 ├── core/ # 公共模型、工具、中间件 ├── blog/ # 业务模块1 ├── ecommerce/ # 业务模块2 ├── static/ # 全局静态文件 ├── templates/ # 全局模板 (base.html) ├── media/ # 上传文件 (gitignore) ├── docker-compose.yml ├── manage.py └── requirements.txt
- 命令速查:
python manage.py createsuperuser # 创建管理员 python manage.py makemigrations && migrate # 数据库迁移 python manage.py collectstatic # 收集静态文件 python manage.py shell_plus --print-sql # 带SQL的Shell
按照这个流程,你可以在 3-4小时 内搭建出一个包含用户认证、后台管理、RESTful API、初步安全配置和生产部署方案的企业级网站骨架,后续只需要根据具体业务填充 models 和 views 即可。