当前位置:首页 > 技术 > 正文内容

Django 框架入门核心概念与实战

访客 技术 2026年6月7日 1

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>

自定义模板标签

为增强模板能力,可创建自定义标签:

  1. 在应用下新建 templatetags/ 目录,并添加 __init__.py 文件。
  2. 创建标签文件如 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})

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。