Django 框架入门核心概念与实战
Python Web框架概览
在众多 Python Web 框架中,Django 以其功能全面著称。相比 Flask 或 Tornado 等轻量级框架,Django 内置了 ORM、模板引擎、用户认证、缓存机制和会话管理等模块,适合快速构建复杂应用。
项目初始化与目录结构
使用以下命令创建新项目:
django-admin startproject mysite
进入项目后常用操作包括:
python manage.py runserver 0.0.0.0:8000 # 启动开发服务器
python manage.py startapp usermgr # 创建新应用
python manage.py makemigrations # 生成数据库迁移脚本
python manage.py migrate # 执行数据库迁移
python manage.py createsuperuser # 创建管理员账户
关键文件说明
- settings.py:全局配置中心,包含数据库、静态资源、安全设置等。
- urls.py:定义 URL 路由映射规则。
- wsgi.py:用于生产环境部署的 WSGI 接口配置。
- manage.py:项目管理入口,支持多种命令行操作。
项目与应用的关系
Django 遵循"一个项目包含多个应用"的设计理念。例如,一个网站项目可划分为前台展示(frontend)、后台管理(adminpanel)等独立子模块,每个模块作为一个 app 存在,降低系统耦合度。
创建并注册应用
执行命令生成应用:
python manage.py startapp frontend
随后需在 settings.py 中注册该应用:
INSTALLED_APPS = [
...
'frontend',
]
路由与视图处理
在 urls.py 中添加路径映射:
from django.urls import path
from frontend import views
urlpatterns = [
path('home/', views.show_home),
path('dashboard/', views.dashboard),
]
对应视图函数位于 views.py:
from django.shortcuts import render, HttpResponse
def show_home(request):
return HttpResponse("<h1>欢迎访问首页</h1>")
模板渲染机制
返回 HTML 页面时使用 render() 方法加载模板:
def dashboard(request):
context = {
'username': 'alice',
'age': 25,
'skills': ['Python', 'Django', 'Vue']
}
return render(request, 'dashboard.html', context)
前端模板示例(dashboard.html):
<!DOCTYPE html>
<html>
<head><title>控制台</title></head>
<body>
<h2>用户:{{ username }}</h2>
<ul>
{% for skill in skills %}
<li>{{ skill }}</li>
{% endfor %}
</ul>
{% if age >= 18 %}
<p>成年用户</p>
{% else %}
<p>未成年用户</p>
{% endif %}
</body>
</html>
自定义模板标签
为增强模板能力,可创建自定义标签:
- 在应用下新建
templatetags/目录,并添加__init__.py文件。 - 创建标签文件如
ui_tags.py:
from django import template
register = template.Library()
@register.simple_tag
def render_button(text, style_class):
return f'<button class="{style_class}">{text}</button>'
@register.simple_tag
def add_numbers(a, b, c):
return a + b + c
模板中使用方式:
{% load ui_tags %}
{% render_button "提交" "btn-primary" %}
结果:{% add_numbers 1 2 3 %}
模板继承与复用
通过母版实现页面结构统一。母版文件(base.html)定义通用布局:
<header>网站LOGO</header>
<nav>导航菜单</nav>
<main>
{% block content %}{% endblock %}
</main>
<footer>版权信息</footer>
子模板继承并填充内容:
{% extends 'base.html' %}
{% block content %}
<h1>个人资料页</h1>
<p>这里是具体内容区域</p>
{% endblock %}
静态资源管理
将 CSS、JS 和图片放入项目根目录下的 static/ 文件夹。在 settings.py 中配置路径:
STATIC_URL = '/static/'
STATICFILES_DIRS = [
BASE_DIR / "static"
]
HTML 中引用样式表:
<link rel="stylesheet" href="/static/css/main.css">
用户登录功能实现
前端表单提交至后端验证:
<form method="post" action="/login/">
{% csrf_token %}
<input type="email" name="email" placeholder="邮箱" required>
<input type="password" name="password" placeholder="密码" required>
<button type="submit">登录</button>
</form>
视图处理逻辑:
from django.shortcuts import render, redirect
def login(request):
error_msg = ""
if request.method == "POST":
email = request.POST.get("email")
pwd = request.POST.get("password")
if email == "admin@example.com" and pwd == "secret":
return redirect("/dashboard/")
else:
error_msg = "用户名或密码错误"
return render(request, "login.html", {"status": error_msg})
模型定义与数据操作
定义数据模型(models.py):
from django.db import models
class UserProfile(models.Model):
email = models.CharField(max_length=50)
password = models.CharField(max_length=128)
created_at = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.email
生成并应用数据库迁移:
python manage.py makemigrations
python manage.py migrate
增删改查操作示例
插入记录:
UserProfile.objects.create(email="test@demo.com", password="123456")
查询所有数据:
users = UserProfile.objects.all()
删除指定记录:
UserProfile.objects.filter(email="old@demo.com").delete()
结合视图返回用户列表:
def user_list(request):
users = UserProfile.objects.all()
return render(request, 'users.html', {'users': users})