Skip to content

第1章:初见Django

1.3 第一个Django项目

创建项目:django-admin startproject

确保虚拟环境已激活,然后创建你的第一个Django项目。

基本项目创建

bash
# 创建名为 mysite 的Django项目
django-admin startproject mysite

# 进入项目目录
cd mysite

# 查看项目结构
tree mysite  # Windows/Linux
# 或
ls -la       # 查看文件列表

项目创建最佳实践

推荐的项目创建方式,避免嵌套目录:

bash
# 在当前目录创建项目(注意最后的点)
django-admin startproject mysite 

# 或者指定项目目录
mkdir my_django_project
cd my_django_project
django-admin startproject mysite

项目结构解析

创建项目后,你会看到以下目录结构:

mysite/
├── manage.py
└── mysite/
    ├── __init__.py
    ├── settings.py
    ├── urls.py
    ├── wsgi.py
    └── asgi.py

让我们详细了解每个文件的作用:

manage.py

项目管理脚本,用于执行各种Django命令。 常用的manage.py命令:

bash
python manage.py runserver      # 启动开发服务器
python manage.py migrate        # 执行数据库迁移
python manage.py createsuperuser # 创建超级用户
python manage.py shell          # 启动Django shell
python manage.py collectstatic  # 收集静态文件

mysite/__init__.py

空文件,告诉Python这是一个包目录。在Django 5.x中通常保持为空。

mysite/settings.py

项目的核心配置文件:

python
 
from pathlib import Path

# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'django-insecure-your-secret-key-here'

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True

ALLOWED_HOSTS = []

# Application definition
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

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',
]

ROOT_URLCONF = 'mysite.urls'

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        '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_APPLICATION = 'mysite.wsgi.application'

# Database
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}

# Password validation
AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    },
]

# Internationalization
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_TZ = True

# Static files (CSS, JavaScript, Images)
STATIC_URL = 'static/'

# Default primary key field type
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'

主要配置项说明:

  • SECRET_KEY:用于加密的密钥,生产环境必须保密
  • DEBUG:调试模式,生产环境必须设为False
  • ALLOWED_HOSTS:允许访问的主机列表
  • INSTALLED_APPS:已安装的应用列表
  • DATABASES:数据库配置
  • LANGUAGE_CODE:语言设置
  • TIME_ZONE:时区设置

mysite/urls.py

主URL配置文件:

python
"""
URL configuration for mysite project.
"""
from django.contrib import admin
from django.urls import path

urlpatterns = [
    path('admin/', admin.site.urls),
]

mysite/wsgi.py

WSGI(Web Server Gateway Interface)配置,用于部署:

python
"""
WSGI config for mysite project.
"""

import os
from django.core.wsgi import get_wsgi_application

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'mysite.settings')
application = get_wsgi_application()

mysite/asgi.py

ASGI(Asynchronous Server Gateway Interface)配置,支持异步和WebSocket:

python
"""
ASGI config for mysite project.
"""

import os
from django.core.asgi import get_asgi_application

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'mysite.settings')
application = get_asgi_application()

运行开发服务器

启动服务器

bash
# 启动开发服务器(默认端口8000)
python manage.py runserver
 
# Starting development server at http://127.0.0.1:8000/
# Quit the server with CONTROL-C.

自定义端口和IP

bash
# 指定端口
python manage.py runserver 8080

# 指定IP和端口
python manage.py runserver 0.0.0.0:8000

# 只监听本地回环地址
python manage.py runserver 127.0.0.1:8000

访问网站

打开浏览器,访问 http://127.0.0.1:8000/,你会看到Django的欢迎页面:

The install worked successfully! Congratulations!

You are seeing this message because this Django installation is working correctly.

Hello World 示例

让我们创建一个简单的"Hello World"页面。

1. 创建视图函数

mysite/mysite/ 目录下创建 views.py 文件:

python
# mysite/views.py
from django.http import HttpResponse
from django.shortcuts import render
import datetime

def hello_world(request):
    """简单的Hello World视图"""
    return HttpResponse("Hello, World! 欢迎来到Django世界!")

def hello_time(request):
    """显示当前时间的视图"""
    now = datetime.datetime.now()
    html = f"""
    <html>
    <head>
        <title>Django Hello World</title>
        <style>
            body {{ font-family: Arial, sans-serif; text-align: center; margin-top: 100px; }}
            h1 {{ color: #0c4b33; }}
            p {{ color: #666; font-size: 18px; }}
        </style>
    </head>
    <body>
        <h1>Hello, Django World!</h1>
        <p>当前时间:{now.strftime('%Y-%m-%d %H:%M:%S')}</p>
        <p>这是你的第一个Django页面!</p>
    </body>
    </html>
    """
    return HttpResponse(html)

def hello_user(request):
    """个性化问候视图"""
    user_name = request.GET.get('name', '访客')
    return HttpResponse(f"<h1>Hello, {user_name}!</h1><p>欢迎使用Django!</p>")

2. 配置URL路由

修改 mysite/urls.py 文件:

python
# mysite/urls.py
from django.contrib import admin
from django.urls import path
from . import views  # 导入我们创建的视图

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', views.hello_world, name='hello_world'),           # 首页
    path('time/', views.hello_time, name='hello_time'),        # 时间页面
    path('user/', views.hello_user, name='hello_user'),        # 用户页面
]

3. 测试页面

重新启动开发服务器(如果已经在运行,它会自动重载):

bash
python manage.py runserver

访问以下URL测试:

  • http://127.0.0.1:8000/ - Hello World页面
  • http://127.0.0.1:8000/time/ - 显示当前时间
  • http://127.0.0.1:8000/user/?name=张三 - 个性化问候

4. 使用模板(进阶示例)

创建模板目录和文件:

bash
# 在项目根目录创建模板目录
mkdir templates

templates/ 目录下创建 hello.html

html
<!-- templates/hello.html -->
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Django Hello World</title>
    <style>
        body {
            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
            color: white;
            text-align: center;
            padding: 50px;
            margin: 0;
        }
        .container {
            background: rgba(255, 255, 255, 0.1);
            border-radius: 15px;
            padding: 40px;
            max-width: 600px;
            margin: 0 auto;
            backdrop-filter: blur(10px);
        }
        h1 {
            font-size: 3em;
            margin-bottom: 20px;
            text-shadow: 2px 2px 4px rgba(0,0,0,0.3);
        }
        p {
            font-size: 1.2em;
            line-height: 1.6;
        }
        .highlight {
            color: #ffd700;
            font-weight: bold;
        }
    </style>
</head>
<body>
    <div class="container">
        <h1>🎉 Hello, Django World!</h1>
        <p>欢迎来到 <span class="highlight">Django 5.x</span> 的世界!</p>
        <p>当前时间:<span class="highlight">{{ current_time }}</span></p>
        <p>你好,<span class="highlight">{{ user_name }}</span>!</p>
        <p>这是使用Django模板系统创建的页面。</p>
    </div>
</body>
</html>

更新 settings.py,配置模板路径:

python
# 在 settings.py 中找到 TEMPLATES 配置,修改 DIRS
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [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',
            ],
        },
    },
]

添加使用模板的视图:

python
# 在 mysite/views.py 中添加
def hello_template(request):
    """使用模板的视图"""
    context = {
        'current_time': datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'),
        'user_name': request.GET.get('name', '朋友'),
    }
    return render(request, 'hello.html', context)

更新URL配置:

python
# 在 mysite/urls.py 中添加
urlpatterns = [
    path('admin/', admin.site.urls),
    path('', views.hello_world, name='hello_world'),
    path('time/', views.hello_time, name='hello_time'),
    path('user/', views.hello_user, name='hello_user'),
    path('template/', views.hello_template, name='hello_template'),  # 新增
]

访问 http://127.0.0.1:8000/template/?name=Django学习者 查看效果。

项目管理命令

常用管理命令

bash
# 检查项目配置
python manage.py check

# 查看所有可用命令
python manage.py help

# 查看特定命令的帮助
python manage.py help runserver

# 启动Django shell
python manage.py shell

# 收集静态文件
python manage.py collectstatic

# 创建数据库迁移
python manage.py makemigrations

# 执行数据库迁移
python manage.py migrate

在Django shell中测试

bash
python manage.py shell

在shell中:

python
# 导入Django设置
from django.conf import settings
print(settings.SECRET_KEY)

# 测试视图
from django.test import Client
client = Client()
response = client.get('/')
print(response.status_code)
print(response.content)

# 查看URL配置
from django.urls import reverse
print(reverse('hello_world'))

项目配置优化

中文本地化设置

修改 settings.py

python
# 语言设置
LANGUAGE_CODE = 'zh-hans'  # 简体中文

# 时区设置
TIME_ZONE = 'Asia/Shanghai'  # 中国时区

# 国际化
USE_I18N = True
USE_TZ = True

开发环境优化

settings.py 中添加:

python
# 开发环境配置
if DEBUG:
    # 允许所有主机(仅开发环境)
    ALLOWED_HOSTS = ['*']
    
    # 添加调试工具栏(需要单独安装)
    # pip install django-debug-toolbar
    # INSTALLED_APPS += ['debug_toolbar']
    # MIDDLEWARE += ['debug_toolbar.middleware.DebugToolbarMiddleware']

小结

恭喜!你已经成功创建并运行了第一个Django项目。在这一节中,你学会了:

  1. ✅ 使用 django-admin startproject 创建项目
  2. ✅ 理解Django项目的目录结构
  3. ✅ 启动开发服务器
  4. ✅ 创建简单的视图和URL配置
  5. ✅ 使用模板系统创建动态页面
  6. ✅ 基本的项目配置和优化

关键概念回顾:

  • 项目(Project):整个Web应用
  • 视图(View):处理请求并返回响应的函数
  • URL配置:将URL路径映射到视图函数
  • 模板(Template):用于生成HTML的文件

下一篇

我们将深入学习Django的核心概念:MTV架构模式,以及如何创建和管理Django应用(App)。

2.1 Django MTV架构模式 →

目录

返回课程目录

Released under the Apache 2.0 License.