Django 配置与安装完整指南

目录

  1. 环境准备

  2. Django 安装

  3. 创建 Django 项目

  4. 项目配置详解

  5. 数据库配置

  6. 静态文件配置

  7. 应用配置

  8. 完整示例

环境准备

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 项目,并根据需要进行自定义设置。记得根据实际项目需求调整配置参数。

相关推荐
Archie_IT4 小时前
「深入浅出」嵌入式八股文—P2 内存篇
c语言·开发语言·数据结构·数据库·c++·算法
奥尔特星云大使4 小时前
mysql逻辑备份跟物理备份的区别
数据库·mysql·逻辑备份·物理备份·逻辑备份呢
程序定小飞4 小时前
基于springboot的蜗牛兼职网的设计与实现
java·数据库·vue.js·spring boot·后端·spring
Go高并发架构_王工4 小时前
NoSQL与MySQL混合架构设计:从理论到实践(二)
数据库·mysql·nosql
jingfeng5145 小时前
MySQL数据类型
数据库·mysql
matlab的学徒5 小时前
PostgreSQL 安装与操作指南
数据库·postgresql
sweethhheart5 小时前
【typora激活使用】mac操作方式
前端·数据库·macos
启明真纳7 小时前
PostgreSQL 单库备份
数据库·postgresql
Amd7947 小时前
PostgreSQL备份不是复制文件?物理vs逻辑咋选?误删还能精准恢复到1分钟前?
数据库·postgresql