文档
Django Hello World —— 你的第一个 Django 项目
目标
创建 Django 项目与第一个应用,理解:
- Django 项目 vs 应用的区别
urls.py路由与views.py视图的关系- 模板渲染与动态数据传递
manage.py命令行工具
完整步骤
步骤 1:创建项目
django-admin startproject mysite
cd mysite
生成的结构:
mysite/
├── manage.py # Django 命令行工具
└── mysite/
├── __init__.py
├── settings.py # 全局配置
├── urls.py # 根 URL 路由
├── asgi.py # ASGI 入口
└── wsgi.py # WSGI 入口
步骤 2:创建应用
python manage.py startapp hello
hello/
├── __init__.py
├── admin.py # 管理后台注册
├── apps.py # 应用配置
├── models.py # 数据库模型
├── views.py # 视图函数/类
├── urls.py # 应用路由(需手动创建)
├── tests.py # 测试
└── migrations/ # 数据库迁移
步骤 3:编写视图
# hello/views.py
from django.shortcuts import render
from django.http import HttpResponse, JsonResponse
from django.views import View
from datetime import datetime
# 方式一:函数视图(最简单)
def index(request):
"""首页 —— 返回纯文本"""
return HttpResponse("""
<h1>🚀 Hello, Django!</h1>
<ul>
<li><a href='/hello/'>/hello/</a> — 问候</li>
<li><a href='/hello/?name=Vibe'>/hello/?name=Vibe</a> — 带参数</li>
<li><a href='/api/status/'>/api/status/</a> — JSON 接口</li>
</ul>
""")
def hello(request):
"""查询参数问候"""
name = request.GET.get("name", "World")
return HttpResponse(f"Hello, {name}!")
def status(request):
"""JSON 响应"""
return JsonResponse({
"status": "ok",
"framework": "Django",
"version": "5.0",
"server_time": datetime.now().isoformat(),
})
# 方式二:类视图(适合 RESTful)
class HelloView(View):
def get(self, request):
name = request.GET.get("name", "World")
return JsonResponse({"message": f"Hello, {name}!", "method": "GET"})
def post(self, request):
import json
try:
data = json.loads(request.body)
name = data.get("name", "World")
except json.JSONDecodeError:
name = "World"
return JsonResponse({"message": f"Hello, {name}!", "method": "POST"}, status=201)
步骤 4:配置路由
# hello/urls.py(新建此文件)
from django.urls import path
from . import views
urlpatterns = [
path("", views.index, name="index"),
path("hello/", views.hello, name="hello"),
path("api/status/", views.status, name="status"),
# 类视图用 as_view()
path("api/hello/", views.HelloView.as_view(), name="hello_api"),
]
# mysite/urls.py(修改根路由,include 应用路由)
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path("admin/", admin.site.urls),
path("", include("hello.urls")), # 引入应用路由
]
步骤 5:注册应用
# mysite/settings.py
INSTALLED_APPS = [
"django.contrib.admin",
"django.contrib.auth",
"django.contrib.contenttypes",
"django.contrib.sessions",
"django.contrib.messages",
"django.contrib.staticfiles",
"hello", # ← 添加此行
]
步骤 6:运行
python manage.py runserver
# 访问以下 URL:
# http://127.0.0.1:8000/
# http://127.0.0.1:8000/hello/?name=Vibe
# http://127.0.0.1:8000/api/status/
# http://127.0.0.1:8000/api/hello/
# curl -X POST http://127.0.0.1:8000/api/hello/ -H "Content-Type: application/json" -d '{"name":"Django"}'
预期输出
GET /api/status/ 返回:
{
"status": "ok",
"framework": "Django",
"version": "5.0",
"server_time": "2025-01-15T10:30:00.123456"
}
POST /api/hello/ 返回:
{"message": "Hello, Django!", "method": "POST"}
Django 请求处理流程
浏览器请求
↓
URL Dispatcher(urls.py)—— 匹配路由
↓
View(views.py) —— 处理业务逻辑
↓
Model(models.py)—— 操作数据库(可选)
↓
Template(templates/)—— 渲染 HTML(可选)
↓
HttpResponse —— 返回给浏览器
关键要点
| 概念 | 说明 |
|---|---|
| 项目 vs 应用 | 项目 = 整个网站;应用 = 一个功能模块(如博客、用户) |
urlpatterns |
URL 路由列表,从上到下匹配,先匹配先服务 |
path(str, view, name) |
路由定义:URL模式 → 视图 → 命名(用于反向解析) |
include() |
将子路由表插入到当前路由,实现模块化 |
request.GET |
查询参数字典(QueryDict) |
JsonResponse |
自动 JSON 序列化 + Content-Type: application/json |