目录
-
环境准备
-
Django 安装
-
创建 Django 项目
-
项目配置详解
-
数据库配置
-
静态文件配置
-
应用配置
-
完整示例
环境准备
Python 环境检查
bash
# 检查 Python 版本
python --version
# 或
python3 --version
# 检查 pip 版本
pip --version
创建虚拟环境(推荐)
bash
# 安装 virtualenv(如果尚未安装)
pip install virtualenv
# 创建虚拟环境
virtualenv django_env
# 激活虚拟环境
# Windows
django_env\Scripts\activate
# Linux/Mac
source django_env/bin/activate
Django 安装
使用 pip 安装
bash
# 安装最新版本
pip install django
# 安装指定版本
pip install django==4.2.0
# 验证安装
python -m django --version
使用 requirements.txt(推荐)
创建 requirements.txt
文件:
txt
Django==4.2.0
psycopg2-binary==2.9.6
Pillow==9.5.0
python-decouple==3.8
安装依赖:
bash
pip install -r requirements.txt
创建 Django 项目
初始化项目
bash
# 创建项目
django-admin startproject myproject
# 进入项目目录
cd myproject
# 创建应用
python manage.py startapp myapp
项目结构
text
myproject/
├── manage.py
├── myproject/
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ ├── asgi.py
│ └── wsgi.py
└── myapp/
├── __init__.py
├── admin.py
├── apps.py
├── models.py
├── tests.py
├── views.py
└── migrations/
└── __init__.py
项目配置详解
基本设置 (settings.py)
python
"""
Django settings for myproject project.
"""
import os
from pathlib import Path
from decouple import config # 用于环境变量管理
# 构建项目根目录路径
BASE_DIR = Path(__file__).resolve().parent.parent
# 安全设置
SECRET_KEY = config('SECRET_KEY', default='your-secret-key-here')
# 调试模式
DEBUG = config('DEBUG', default=True, cast=bool)
# 允许的主机
ALLOWED_HOSTS = config('ALLOWED_HOSTS', default='localhost,127.0.0.1', cast=lambda v: [s.strip() for s in v.split(',')])
# 应用定义
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
# 第三方应用
'rest_framework',
# 本地应用
'myapp',
]
# 中间件
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
# URL 配置
ROOT_URLCONF = 'myproject.urls'
# 模板配置
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [
os.path.join(BASE_DIR, 'templates'),
],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
# WSGI 配置
WSGI_APPLICATION = 'myproject.wsgi.application'
数据库配置
SQLite 配置(默认)
python
# settings.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
PostgreSQL 配置
python
# settings.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': config('DB_NAME', default='mydatabase'),
'USER': config('DB_USER', default='myuser'),
'PASSWORD': config('DB_PASSWORD', default='mypassword'),
'HOST': config('DB_HOST', default='localhost'),
'PORT': config('DB_PORT', default='5432'),
}
}
MySQL 配置
python
# settings.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': config('DB_NAME', default='mydatabase'),
'USER': config('DB_USER', default='myuser'),
'PASSWORD': config('DB_PASSWORD', default='mypassword'),
'HOST': config('DB_HOST', default='localhost'),
'PORT': config('DB_PORT', default='3306'),
'OPTIONS': {
'charset': 'utf8mb4',
},
}
}
静态文件配置
python
# settings.py
# 静态文件 URL
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')
# 静态文件查找器
STATICFILES_FINDERS = [
'django.contrib.staticfiles.finders.FileSystemFinder',
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
]
应用配置
创建应用配置
python
# myapp/apps.py
from django.apps import AppConfig
class MyappConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'myapp'
verbose_name = '我的应用'
模型示例
python
# myapp/models.py
from django.db import models
from django.urls import reverse
class Category(models.Model):
name = models.CharField(max_length=100, verbose_name='分类名称')
created_at = models.DateTimeField(auto_now_add=True)
class Meta:
verbose_name = '分类'
verbose_name_plural = '分类'
def __str__(self):
return self.name
class Article(models.Model):
title = models.CharField(max_length=200, verbose_name='标题')
content = models.TextField(verbose_name='内容')
category = models.ForeignKey(Category, on_delete=models.CASCADE, verbose_name='分类')
is_published = models.BooleanField(default=True, verbose_name='是否发布')
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
class Meta:
verbose_name = '文章'
verbose_name_plural = '文章'
ordering = ['-created_at']
def __str__(self):
return self.title
def get_absolute_url(self):
return reverse('article_detail', kwargs={'pk': self.pk})
视图示例
python
# myapp/views.py
from django.shortcuts import render, get_object_or_404
from django.views.generic import ListView, DetailView
from .models import Article, Category
class ArticleListView(ListView):
model = Article
template_name = 'myapp/article_list.html'
context_object_name = 'articles'
paginate_by = 10
def get_queryset(self):
return Article.objects.filter(is_published=True)
class ArticleDetailView(DetailView):
model = Article
template_name = 'myapp/article_detail.html'
context_object_name = 'article'
def category_articles(request, category_id):
category = get_object_or_404(Category, id=category_id)
articles = Article.objects.filter(category=category, is_published=True)
return render(request, 'myapp/category_articles.html', {
'category': category,
'articles': articles
})
URL 配置
python
# myapp/urls.py
from django.urls import path
from . import views
app_name = 'myapp'
urlpatterns = [
path('', views.ArticleListView.as_view(), name='article_list'),
path('article/<int:pk>/', views.ArticleDetailView.as_view(), name='article_detail'),
path('category/<int:category_id>/', views.category_articles, name='category_articles'),
]
# myproject/urls.py
from django.contrib import admin
from django.urls import path, include
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('myapp.urls')),
]
# 开发环境下的媒体文件服务
if settings.DEBUG:
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
完整示例
环境变量配置 (.env)
bash
# .env 文件
DEBUG=True
SECRET_KEY=your-secret-key-here
ALLOWED_HOSTS=localhost,127.0.0.1
# 数据库配置
DB_NAME=mydatabase
DB_USER=myuser
DB_PASSWORD=mypassword
DB_HOST=localhost
DB_PORT=5432
管理界面配置
python
# myapp/admin.py
from django.contrib import admin
from .models import Category, Article
@admin.register(Category)
class CategoryAdmin(admin.ModelAdmin):
list_display = ['name', 'created_at']
search_fields = ['name']
@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
list_display = ['title', 'category', 'is_published', 'created_at']
list_filter = ['category', 'is_published', 'created_at']
search_fields = ['title', 'content']
list_editable = ['is_published']
date_hierarchy = 'created_at'
数据库迁移
bash
# 创建迁移文件
python manage.py makemigrations
# 应用迁移
python manage.py migrate
# 创建超级用户
python manage.py createsuperuser
运行开发服务器
bash
# 运行开发服务器
python manage.py runserver
# 指定端口运行
python manage.py runserver 8080
# 允许外部访问
python manage.py runserver 0.0.0.0:8000
生产环境配置
安全设置
python
# settings.py
# 生产环境设置
if not DEBUG:
# 安全设置
SECURE_SSL_REDIRECT = True
SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True
SECURE_BROWSER_XSS_FILTER = True
SECURE_CONTENT_TYPE_NOSNIFF = True
# HSTS 设置
SECURE_HSTS_SECONDS = 31536000 # 1年
SECURE_HSTS_INCLUDE_SUBDOMAINS = True
SECURE_HSTS_PRELOAD = True
日志配置
python
# settings.py
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'file': {
'level': 'DEBUG',
'class': 'logging.FileHandler',
'filename': os.path.join(BASE_DIR, 'debug.log'),
},
},
'loggers': {
'django': {
'handlers': ['file'],
'level': 'DEBUG',
'propagate': True,
},
},
}
通过以上完整的配置指南,您可以成功安装和配置 Django 项目,并根据需要进行自定义设置。记得根据实际项目需求调整配置参数。