Python后端 -- 万字长文全面解析Django框架

自从2005年诞生以来,Django因其"开发速度快、安全性高"的特点迅速成为许多开发者的首选。无论是小型的个人项目,还是大型的企业应用,Django都能游刃有余地满足需求。我们将从Django的基础知识带你全面掌握Django,从基础知识到高级特性,让你在项目开发中得心应手。

目录

Django简介与安装

[1. Django是什么?](#1. Django是什么?)

Django适合的场景

[2. Django的特点](#2. Django的特点)

[3. 环境搭建](#3. 环境搭建)

步骤一:检查或安装Python

步骤二:创建虚拟环境

步骤三:安装Django

[4. 创建第一个Django项目](#4. 创建第一个Django项目)

创建一个新项目

启动开发服务器

Django项目结构解析

[1. 项目与应用的区别](#1. 项目与应用的区别)

类比示例:

[2. Django项目目录结构](#2. Django项目目录结构)

manage.py

init.py

settings.py

urls.py

asgi.py

wsgi.py

[3. Django应用的基本构造](#3. Django应用的基本构造)

admin.py

apps.py

models.py

tests.py

views.py

migrations/

[4. 注册应用](#4. 注册应用)

[5. Django中的重要文件总结](#5. Django中的重要文件总结)

Django模型层(Models)

[1. ORM概述](#1. ORM概述)

优点

[2. 模型的定义](#2. 模型的定义)

基本模型定义

字段类型

字段选项

[3. 模型的关系](#3. 模型的关系)

一对一关系

一对多关系

多对多关系

[4. 迁移与数据库操作](#4. 迁移与数据库操作)

创建迁移文件

应用迁移

[5. 数据库操作](#5. 数据库操作)

[6. 模型管理器(Manager)](#6. 模型管理器(Manager))

Django视图层(Views)

[1. 视图的基本概念](#1. 视图的基本概念)

视图的职责

[2. 函数视图(Function-Based Views, FBV)](#2. 函数视图(Function-Based Views, FBV))

示例:简单的函数视图

视图绑定URL

视图中的逻辑处理

[3. 类视图(Class-Based Views, CBV)](#3. 类视图(Class-Based Views, CBV))

基本类视图

[通用类视图(Generic Views)](#通用类视图(Generic Views))

[DetailView: 显示单个对象的详细信息。](#DetailView: 显示单个对象的详细信息。)

[4. 视图中的请求与响应](#4. 视图中的请求与响应)

HttpRequest对象

HttpResponse对象

[5. 视图与模板结合](#5. 视图与模板结合)

使用render渲染模板

在模板中使用上下文数据

[6. 处理错误和异常](#6. 处理错误和异常)

[自定义404页面 是的404!](#自定义404页面 是的404!)

[7. 中间件与视图](#7. 中间件与视图)

Django模板层(Templates)

[1. 模板语言语法](#1. 模板语言语法)

[1.1 变量](#1.1 变量)

[2. 模板的使用](#2. 模板的使用)

[3. 模板继承与模块化](#3. 模板继承与模块化)

[3.1 定义父模板](#3.1 定义父模板)

[3.2 定义子模板](#3.2 定义子模板)

[3.3 使用模板继承的页面渲染](#3.3 使用模板继承的页面渲染)

[4. 模板中的静态文件](#4. 模板中的静态文件)

配置静态文件

[5. 模板的自定义标签和过滤器](#5. 模板的自定义标签和过滤器)

[Django URL解析](#Django URL解析)

[1. URL配置的基础](#1. URL配置的基础)

[2. 动态URL](#2. 动态URL)

[3. 命名空间与反向解析](#3. 命名空间与反向解析)

[4. 命名空间](#4. 命名空间)

[5. 正则表达式URL](#5. 正则表达式URL)

[6. URL优化](#6. URL优化)


Django简介与安装

1. Django是什么?

Django是一款开源的Web框架,基于Python语言开发,旨在帮助开发者快速构建高质量的Web应用程序。它采用了MVT(Model-View-Template)设计模式,与经典的MVC模式类似但更加灵活。Django的宗旨是"Don't Repeat Yourself"(别重复造轮子),通过封装常见的Web开发任务,减少开发者的工作量。

Django适合的场景
  • 内容管理系统(CMS)
  • 电商网站
  • REST API后端
  • 数据驱动的动态网站

2. Django的特点

  • 快速开发: 提供大量开箱即用的功能模块,如用户认证、管理后台、ORM等。
  • 安全性高: 内置常见的安全机制,防止SQL注入、跨站脚本(XSS)和跨站请求伪造(CSRF)。
  • 可扩展性强: 丰富的插件生态系统,支持自定义开发。
  • 强大的社区支持: 丰富的文档和活跃的开发者社区。

3. 环境搭建

在开始学习Django之前,需要准备开发环境,包括Python解释器和Django框架本身。

步骤一:检查或安装Python
python 复制代码
# 检查是否已安装Python

python --version

如果未安装,前往Python官网下载最新版本并安装。

步骤二:创建虚拟环境

为避免依赖冲突,推荐在虚拟环境中安装Django:

python 复制代码
python -m venv myenv
source myenv/bin/activate  # macOS/Linux
myenv\Scripts\activate     # Windows
步骤三:安装Django

使用pip安装Django:

python 复制代码
pip install django

#检查
django-admin --version

4. 创建第一个Django项目

创建一个新项目
python 复制代码
django-admin startproject myproject
cd myproject

项目目录结构如下:

python 复制代码
myproject/
    manage.py
    myproject/
        __init__.py
        settings.py
        urls.py
        asgi.py
        wsgi.py
启动开发服务器
python 复制代码
python manage.py runserver



#打开浏览器访问http://127.0.0.1:8000/,可以看到默认的欢迎页面。

Django项目结构解析

在上一部分,我们成功安装了Django,并创建了第一个Django项目。接下来,我们将深入了解Django项目的结构,搞清楚每个文件和目录的作用,从而为后续的开发工作奠定扎实的基础。

1. 项目与应用的区别

Django中的"项目"和"应用"是两个核心概念,理解它们的区别对项目组织非常重要。

  • 项目(Project): 一个Django项目是一个整体的Web服务或网站,包含一系列设置和配置文件,用于定义网站的全局行为。
  • 应用(App): 应用是项目中的一个子模块,负责实现某一特定功能,例如博客、论坛、用户管理等。一个项目可以包含多个应用。
类比示例:

将项目比作一本书,书中每一章就是一个应用。项目定义了书的标题、封面和大纲,而应用则实现了具体的内容。

2. Django项目目录结构

创建项目时生成的默认目录结构如下:

python 复制代码
myproject/
    manage.py
    myproject/
        __init__.py
        settings.py
        urls.py
        asgi.py
        wsgi.py
manage.py

一个命令行工具,用于与Django项目进行交互。例如启动服务器、执行数据库迁移等。

python 复制代码
python manage.py runserver    # 启动开发服务器
python manage.py makemigrations  # 创建数据库迁移文件
python manage.py migrate     # 应用数据库迁移
python manage.py createsuperuser  # 创建管理员账号
__init__.py

一个空文件,表明该目录是一个Python包。

settings.py

全局配置文件,包括数据库设置、已安装的应用、静态文件路径等。

python 复制代码
INSTALLED_APPS = [  # 已安装的应用
    'django.contrib.admin',
    'django.contrib.auth',
    ...
]

DATABASES = {  # 数据库配置
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}
urls.py

全局URL配置文件,用于定义项目的路由规则。

python 复制代码
from django.contrib import admin
from django.urls import path

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

异步服务器网关接口配置,用于支持异步请求处理。

wsgi.py

Web服务器网关接口配置,用于生产环境部署。

3. Django应用的基本构造

在Django中,应用是实现具体功能的基本单位。我们可以通过以下命令创建一个应用:

python 复制代码
python manage.py startapp myapp

生成的应用目录结构如下:

python 复制代码
myapp/
    admin.py
    apps.py
    models.py
    tests.py
    views.py
    migrations/
        __init__.py
admin.py

配置Django管理后台中的数据展示。

python 复制代码
from django.contrib import admin
from .models import MyModel

admin.site.register(MyModel)
apps.py

配置应用的元信息。

models.py

定义数据库模型。

tests.py

用于编写单元测试。

views.py

定义视图逻辑,用于处理用户请求并返回响应。

migrations/

用于存储数据库迁移文件。

4. 注册应用

在创建应用后,需将其注册到项目中,使Django识别该应用。步骤如下:

  1. 打开settings.py文件。
  2. INSTALLED_APPS中添加应用名称:
python 复制代码
INSTALLED_APPS = [
    ...
    'myapp',
]

5. Django中的重要文件总结

Django项目和应用中的核心文件共同构成了项目的开发框架:

  • settings.py 全局配置中心。
  • urls.py 路由管理。
  • models.py 数据库模型设计。
  • views.py 处理请求并返回响应。
  • admin.py 管理后台配置。

Django模型层(Models)

Django模型(Models)是框架的重要组成部分,用于处理与数据库的交互。通过Django的ORM(Object-Relational Mapping,对象关系映射),开发者可以直接使用Python代码操作数据库,而无需编写繁琐的SQL语句。本部分将从模型的定义、关系设计到数据库操作,带你全面了解Django的模型层。

1. ORM概述

Django的ORM是一种将Python对象与数据库表对应起来的技术。通过ORM,开发者可以:

  • 定义数据库表结构。
  • 使用Python代码进行增删改查操作。
  • 轻松切换数据库(如SQLite、PostgreSQL、MySQL)。
优点
  • 简化了数据库操作的复杂度。
  • 提高了代码的可读性和可维护性。
  • 提供了一致的API接口,支持多种数据库。

2. 模型的定义

在Django中,模型是Python类,每个类对应一个数据库表,类中的属性对应表中的字段。

基本模型定义

创建一个名为models.py的文件,并定义模型:

python 复制代码
from django.db import models

class Author(models.Model):
    name = models.CharField(max_length=100)  # 字符串字段
    email = models.EmailField()             # 邮箱字段
    bio = models.TextField(blank=True, null=True)  # 可选字段

    def __str__(self):
        return self.name
字段类型

Django提供了多种字段类型,常用字段包括:

  • CharField: 用于存储短文本,需指定max_length
  • TextField: 用于存储长文本。
  • IntegerField: 存储整数。
  • FloatField: 存储浮点数。
  • DateField/DateTimeField: 存储日期或日期时间。
  • BooleanField: 存储布尔值。
  • EmailField: 用于存储并验证邮箱格式。
  • FileField/ImageField: 用于存储文件或图片。
字段选项

字段支持多个选项,用于控制数据库行为:

  • null=True 数据库中该字段可以为空。
  • blank=True 表单中该字段可以为空。
  • default=value 设置字段的默认值。
  • choices= 定义字段的枚举值。
python 复制代码
class Book(models.Model):
    GENRE_CHOICES = [
        ('FIC', 'Fiction'),
        ('NF', 'Non-Fiction'),
        ('SF', 'Science Fiction'),
    ]

    title = models.CharField(max_length=200)
    genre = models.CharField(max_length=3, choices=GENRE_CHOICES)
    published_date = models.DateField()

3. 模型的关系

Django支持一对一、一对多和多对多关系。

一对一关系

使用OneToOneField定义一对一关系:

python 复制代码
class Profile(models.Model):
    user = models.OneToOneField('auth.User', on_delete=models.CASCADE)
    bio = models.TextField()
一对多关系

使用ForeignKey定义一对多关系:

python 复制代码
class Article(models.Model):
    title = models.CharField(max_length=100)
    author = models.ForeignKey(Author, on_delete=models.CASCADE)
多对多关系

使用ManyToManyField定义多对多关系:

python 复制代码
class Student(models.Model):
    name = models.CharField(max_length=100)

class Course(models.Model):
    name = models.CharField(max_length=100)
    students = models.ManyToManyField(Student)

4. 迁移与数据库操作

定义模型后,需要将其同步到数据库中。Django提供了迁移工具来完成这一任务。

创建迁移文件

运行以下命令生成迁移文件:

python 复制代码
python manage.py makemigrations

生成的迁移文件描述了数据库的变更。

应用迁移

运行以下命令将迁移应用到数据库:

python 复制代码
python manage.py migrate

5. 数据库操作

Django提供了对模型的增删改查操作的API。

python 复制代码
创建记录
author = Author(name="John Doe", email="john@example.com")
author.save()

查询所有记录
Author.objects.all()
条件查询:
Author.objects.filter(name="John Doe")
获取单个对象:
Author.objects.get(id=1)

更新记录
author = Author.objects.get(id=1)
author.email = "new_email@example.com"
author.save()

删除记录
author = Author.objects.get(id=1)
author.delete()

排序:
Author.objects.order_by('name')

分页:
Author.objects.all()[:10]

6. 模型管理器(Manager)

Django的objects是模型的默认管理器,可以通过自定义管理器扩展其功能:

python 复制代码
class AuthorManager(models.Manager):
    def active_authors(self):
        return self.filter(is_active=True)

class Author(models.Model):
    name = models.CharField(max_length=100)
    is_active = models.BooleanField(default=True)

    objects = AuthorManager()



#调用自定义方法
active_authors = Author.objects.active_authors()

Django视图层(Views)

在Django中,视图(Views)是处理用户请求并返回响应的核心部分。通过视图,我们可以定义应用的业务逻辑,将模型数据传递给模板,最终生成动态的网页内容。本部分将详细讲解视图的基本概念、类型及其在项目中的实际应用。

1. 视图的基本概念

Django视图是一个Python函数或类,接收HTTP请求对象(HttpRequest),处理逻辑后返回HTTP响应对象(HttpResponse)。

视图的职责
  1. 处理用户请求。
  2. 执行业务逻辑(如查询数据库)。
  3. 渲染模板并返回响应。

2. 函数视图(Function-Based Views, FBV)

Django的函数视图是最基本的视图形式,定义为普通的Python函数。

示例:简单的函数视图
python 复制代码
from django.http import HttpResponse

def hello_world(request):
    return HttpResponse("Hello, World!")
视图绑定URL

urls.py中绑定视图函数到特定的URL:

python 复制代码
from django.urls import path
from . import views

urlpatterns = [
    path('hello/', views.hello_world),
]

访问http://127.0.0.1:8000/hello/时,将返回Hello, World!

视图中的逻辑处理

视图可以包含复杂的逻辑,例如查询数据库并动态生成响应:

python 复制代码
from django.shortcuts import render
from .models import Article

def article_list(request):
    articles = Article.objects.all()
    return render(request, 'articles.html', {'articles': articles})
  • render:用于渲染模板。
  • 'articles.html':模板文件的名称。
  • {'articles': articles}:上下文数据传递给模板。

3. 类视图(Class-Based Views, CBV)

Django提供了类视图,便于处理复杂的逻辑。类视图将请求处理拆分为多个方法,增强了代码的可复用性。

基本类视图

定义一个简单的类视图:

python 复制代码
from django.http import HttpResponse
from django.views import View

class HelloWorldView(View):
    def get(self, request):
        return HttpResponse("Hello, World from Class-Based View!")

绑定URL

python 复制代码
from django.urls import path
from .views import HelloWorldView

urlpatterns = [
    path('hello/', HelloWorldView.as_view()),
]
通用类视图(Generic Views)

Django内置了一些通用类视图,用于处理常见任务,如显示列表或详细信息。

  • ListView: 显示对象列表。
DetailView: 显示单个对象的详细信息。
python 复制代码
from django.views.generic import ListView
from .models import Article

class ArticleListView(ListView):
    model = Article
    template_name = 'articles.html'
    context_object_name = 'articles'

绑定URL

python 复制代码
urlpatterns = [
    path('articles/', ArticleListView.as_view(), name='article_list'),
]

4. 视图中的请求与响应

视图需要处理用户的请求,并生成适当的响应。

HttpRequest对象

request对象包含了与用户请求相关的所有信息:

  • request.method 请求方法(GET、POST等)。
  • request.GET 获取查询参数。
  • request.POST 获取表单提交数据。

示例:

python 复制代码
def search(request):
    query = request.GET.get('q')
    return HttpResponse(f"Search query: {query}")
HttpResponse对象

HttpResponse用于返回自定义的响应:

  • HttpResponse(content) 返回纯文本内容。
  • HttpResponseRedirect(url) 重定向到指定URL。
  • JsonResponse(data) 返回JSON数据。

5. 视图与模板结合

通常,视图通过模板引擎生成动态网页。

使用render渲染模板

render函数简化了模板渲染的过程:

python 复制代码
from django.shortcuts import render

def home(request):
    context = {'title': 'Welcome to Django'}
    return render(request, 'home.html', context)
在模板中使用上下文数据

模板文件home.html示例:

python 复制代码
<!DOCTYPE html>
<html>
<head>
    <title>{{ title }}</title>
</head>
<body>
    <h1>{{ title }}</h1>
</body>
</html>

6. 处理错误和异常

Django视图可以通过内置方法处理错误或异常,提供更友好的用户体验。

自定义404页面 是的404!

views.py中定义404视图:

python 复制代码
from django.http import HttpResponseNotFound

def custom_404_view(request, exception):
    return HttpResponseNotFound("Page not found!")



# 在settings.py中配置:
handler404 = 'myapp.views.custom_404_view'

7. 中间件与视图

中间件可以在请求到达视图之前或响应返回用户之前,处理一些通用任务。例如,认证、日志记录等。

示例:记录请求路径的中间件:

python 复制代码
class LogMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        print(f"Request path: {request.path}")
        return self.get_response(request)

settings.py中注册:

python 复制代码
MIDDLEWARE = [
    ...,
    'myapp.middleware.LogMiddleware',
]

Django模板层(Templates)

Django模板层(Templates)负责将动态数据渲染为HTML页面,向用户呈现最终的内容。模板系统采用一种简洁的语法,让开发者专注于页面结构,而将复杂的逻辑留在视图层。本部分将详细介绍Django模板语言的语法、模板继承机制以及静态文件的管理。

1. 模板语言语法

Django模板语言(Django Template Language,DTL)是一种简洁的标记语言,用于动态渲染HTML内容。其语法由变量标签过滤器组成。

1.1 变量

模板中的变量使用双花括号包裹:

python 复制代码
<p>{{ variable_name }}</p>

标签是控制模板逻辑的核心,使用{% ... %}表示。常见标签包括:

  • **{% if %}:条件语句。
  • **{% for %}:循环语句。
  • **{% include %}:包含其他模板。

示例:

python 复制代码
{% if user_name %}
    <p>Hello, {{ user_name }}!</p>
{% else %}
    <p>Hello, Guest!</p>
{% endif %}

过滤器用于格式化变量,语法为{``{ variable|filter_name }}。 常见过滤器:

  • date:格式化日期。
  • lower:将字符串转为小写。
  • length:获取列表长度。

示例:

python 复制代码
<p>{{ current_date|date:"Y-m-d" }}</p>
<p>{{ user_name|lower }}</p>
2. 模板的使用

模板文件通常存放在项目的templates目录下,需在settings.py中配置模板路径:

python 复制代码
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [BASE_DIR / 'templates'],  # 自定义模板目录
        'APP_DIRS': True,
        ...
    },
]

创建模板文件: 项目目录结构:

python 复制代码
myproject/
    templates/
        home.html

渲染模板: 在视图中调用render

python 复制代码
def home(request):
    return render(request, 'home.html', {'title': 'Welcome to Django'})

模板内容:

python 复制代码
<!DOCTYPE html>
<html>
<head>
    <title>{{ title }}</title>
</head>
<body>
    <h1>{{ title }}</h1>
</body>
</html>

3. 模板继承与模块化

模板继承机制允许定义通用的页面结构,并通过子模板进行扩展,从而减少重复代码。

3.1 定义父模板

父模板通常定义页面的通用结构:

python 复制代码
<!-- templates/base.html -->
<!DOCTYPE html>
<html>
<head>
    <title>{% block title %}My Site{% endblock %}</title>
</head>
<body>
    <header>
        <h1>My Website Header</h1>
    </header>
    <main>
        {% block content %}{% endblock %}
    </main>
    <footer>
        <p>My Website Footer</p>
    </footer>
</body>
</html>
3.2 定义子模板

子模板继承父模板,并重写指定的块内容:

python 复制代码
<!-- templates/home.html -->
{% extends 'base.html' %}

{% block title %}Home Page{% endblock %}

{% block content %}
    <p>Welcome to the home page!</p>
{% endblock %}
3.3 使用模板继承的页面渲染

视图调用子模板:

python 复制代码
def home(request):
    return render(request, 'home.html')

4. 模板中的静态文件

静态文件(CSS、JavaScript、图片等)用于增强页面的视觉和交互效果。Django提供了一套机制来管理静态文件。

配置静态文件

settings.py中配置静态文件路径:

python 复制代码
STATIC_URL = '/static/'
STATICFILES_DIRS = [BASE_DIR / 'static']



# 确保在模板文件中加载静态文件标签:
{% load static %}


# 引用静态文件:
<link rel="stylesheet" href="{% static 'css/styles.css' %}">
<img src="{% static 'images/logo.png' %}" alt="Logo">

5. 模板的自定义标签和过滤器

当Django内置的标签和过滤器无法满足需求时,可以自定义。

python 复制代码
# 在应用目录下创建一个templatetags目录,添加自定义过滤
# myapp/templatetags/custom_filters.py
from django import template

register = template.Library()

@register.filter
def add_prefix(value, prefix):
    return f"{prefix}{value}"
python 复制代码
# 在模板中加载并使用:


{% load custom_filters %}
<p>{{ 'World'|add_prefix:'Hello, ' }}</p>

Django URL解析

在一个Web应用中,URL是用户与应用交互的入口。Django通过URL解析将用户请求与视图关联起来,并根据URL模式决定调用哪个视图处理请求。本部分将深入讲解Django的URL解析机制、动态URL配置以及命名空间和反向解析的使用。

1. URL配置的基础

Django通过urls.py文件将URL模式映射到视图。

python 复制代码
# 项目的urls.py文件
from django.contrib import admin
from django.urls import path
from myapp import views  # 引入应用视图

# 定义URL模式列表
urlpatterns = [
    path('admin/', admin.site.urls),  # 管理后台
    path('home/', views.home, name='home'),  # 静态路径绑定到视图
]

# 示例视图:返回简单的响应
# myapp/views.py
from django.http import HttpResponse

def home(request):
    return HttpResponse("Welcome to the Home Page!")

访问路径 /home/ 将调用 home 视图,返回 "Welcome to the Home Page!"。

2. 动态URL

动态URL允许捕获路径参数并传递到视图中。

python 复制代码
# 定义动态URL
urlpatterns = [
    path('article/<int:article_id>/', views.article_detail, name='article_detail'),
]

# 视图函数处理动态参数
def article_detail(request, article_id):
    return HttpResponse(f"Article ID: {article_id}")
  • 访问 /article/42/,将显示 Article ID: 42
  • <int:article_id> 捕获整数类型的路径参数。

支持的动态参数类型:

  • <str>:字符串(默认)。
  • <int>:整数。
  • <slug>:短字符串。
  • <path>:带斜杠的字符串。
  • <uuid>:UUID格式。

3. 命名空间与反向解析

为提高可维护性,可以为URL模式命名,并通过反向解析动态生成URL。

python 复制代码
# 定义带名称的URL
urlpatterns = [
    path('home/', views.home, name='home'),  # 给URL模式命名为 'home'
]

# 视图中使用反向解析生成URL
from django.urls import reverse

def redirect_to_home(request):
    home_url = reverse('home')  # 根据名称动态生成URL
    return HttpResponse(f"The URL for 'home' is: {home_url}")

# 模板中反向解析URL
# home.html
<a href="{% url 'home' %}">Go to Home</a>
  • reverse('home') 返回 /home/
  • 模板中的 {% url 'home' %} 动态生成链接。

4. 命名空间

在大型项目中,可以为每个应用的URL配置添加命名空间。

python 复制代码
# 应用的urls.py文件
from django.urls import path

app_name = 'myapp'  # 定义命名空间

urlpatterns = [
    path('home/', views.home, name='home'),  # 定义命名URL
]

# 主urls.py文件
from django.urls import include

urlpatterns = [
    path('myapp/', include('myapp.urls')),  # 引入应用URL
]

# 模板中使用命名空间的反向解析
<a href="{% url 'myapp:home' %}">Go to MyApp Home</a>

使用 myapp:home 指定命名空间和URL名称,避免冲突。

5. 正则表达式URL

对于复杂的路径需求,可以使用re_path结合正则表达式定义URL。

python 复制代码
from django.urls import re_path

# 定义正则表达式URL模式
urlpatterns = [
    re_path(r'^article/(?P<year>\d{4})/$', views.article_by_year, name='article_by_year'),
]

# 视图中接收正则表达式参数
def article_by_year(request, year):
    return HttpResponse(f"Articles from year: {year}")
  • URL /article/2024/ 将返回 Articles from year: 2024
  • (?P<year>\d{4}) 捕获名为 year 的四位数字参数。

6. URL优化

Django提供了工具和技巧优化URL设计:

  • 使用include组织URL: 将每个应用的URL配置拆分到独立文件中。
python 复制代码
# 主urls.py
from django.urls import include
urlpatterns = [
    path('blog/', include('blog.urls')),  # 引入博客应用URL配置
]
  • 规范设计URL: 避免嵌套过深的路径,遵循RESTful设计原则,例如:
    • /users/:用户列表。
    • /users/<id>/:单个用户详情。


从初识Django,到逐步掌握模型、视图、模板,再到URL解析,如果你问我,Django最大的魅力是什么,我会说它的"有条不紊"。从后台逻辑到前端显示,从简单的Hello World到复杂的数据库查询,Django用一种条理清晰的方式让我们既能快速上手,又能应对复杂场景。就像一个好用的工具箱,拿出来就是各种好用的工具,一切都那么顺理成章。

你可能已经开始计划用Django做点什么了。是一个简单的博客,还是一个功能复杂的电商网站?无论如何,Django的学习远不止于此。它还有更多的高级特性等待你去探索,Enjoy coding,and keep building!

相关推荐
烂蜻蜓35 分钟前
前端已死?什么是前端
开发语言·前端·javascript·vue.js·uni-app
老猿讲编程37 分钟前
安全C语言编码规范概述
c语言·开发语言·安全
web135085886352 小时前
Python大数据可视化:基于python的电影天堂数据可视化_django+hive
python·信息可视化·django
东方芷兰2 小时前
伯克利 CS61A 课堂笔记 11 —— Mutability
笔记·python
Biomamba生信基地4 小时前
两天入门R语言,周末开讲
开发语言·r语言·生信
RAN_PAND4 小时前
STL介绍1:vector、pair、string、queue、map
开发语言·c++·算法
Bio Coder4 小时前
R语言安装生物信息数据库包
开发语言·数据库·r语言
Tiger Z4 小时前
R 语言科研绘图第 27 期 --- 密度图-分组
开发语言·程序人生·r语言·贴图
不会Hello World的小苗4 小时前
Java——列表(List)
java·python·list