Django 配置与安装完整指南
目录
环境准备
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 AppConfigclass 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 reverseclass 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.nameclass 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.titledef 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, Categoryclass ArticleListView(ListView):model = Articletemplate_name = 'myapp/article_list.html'context_object_name = 'articles'paginate_by = 10def get_queryset(self):return Article.objects.filter(is_published=True)class ArticleDetailView(DetailView):model = Articletemplate_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 viewsapp_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 staticurlpatterns = [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 = TrueSESSION_COOKIE_SECURE = TrueCSRF_COOKIE_SECURE = TrueSECURE_BROWSER_XSS_FILTER = TrueSECURE_CONTENT_TYPE_NOSNIFF = True# HSTS 设置SECURE_HSTS_SECONDS = 31536000 # 1年SECURE_HSTS_INCLUDE_SUBDOMAINS = TrueSECURE_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 项目,并根据需要进行自定义设置。记得根据实际项目需求调整配置参数。