【Python3】Django 学习之路

news2025/4/19 13:28:16

第一章:Django 简介

1.1 什么是 Django?

Django 是一个高级的 Python Web 框架,旨在让 Web 开发变得更加快速和简便。它鼓励遵循“不要重复自己”(DRY,Don’t Repeat Yourself)的原则,并提供了一套完善的工具和库来快速构建 Web 应用。Django 提供了很多内置的功能,包括:

  • ORM(Object-Relational Mapping):简化数据库操作。
  • 模板引擎:用来生成 HTML 页面。
  • 自动化管理界面:Django 自动生成一个管理后台界面。
  • 路由系统:URL 路由匹配。
  • 安全性:防止常见的 Web 安全问题(如 SQL 注入、XSS 攻击等)。
1.2 Django 的开发哲学

Django 强调“快速开发”和“可重用性”。它内置了很多功能,帮助开发者少写代码,同时保持代码的清晰和可维护性。Django 项目结构清晰,规范性强,适合团队开发。

第二章:Django 项目结构

2.1 创建一个 Django 项目

Django 的项目是一个包含了多个应用(App)的结构,每个应用都是一个相对独立的模块,通常代表一个功能或领域。你可以通过以下命令来创建一个新的 Django 项目:

django-admin startproject myproject

执行后,会在当前目录下生成一个名为 myproject 的文件夹,里面包含一些默认的文件和目录:

myproject/
    manage.py         # 用于管理项目的命令行工具
    myproject/
        __init__.py   # 标识这个目录是一个 Python 包
        settings.py   # 项目的配置文件
        urls.py       # 项目的 URL 路由配置
        wsgi.py       # 用于部署应用的 WSGI 配置
  • settings.py 是项目的核心配置文件。
  • urls.py 用来定义项目级别的路由。
  • wsgi.py 是部署用的文件,帮助将你的应用与服务器连接。
2.2 创建 Django 应用

在 Django 中,一个项目包含多个应用,每个应用是一个相对独立的功能模块。你可以通过以下命令来创建一个新的应用:

python manage.py startapp myapp

这将在项目目录下创建一个新的应用,目录结构大概如下:

myapp/
    __init__.py
    admin.py         # 管理后台配置
    apps.py          # 应用配置
    models.py        # 数据库模型
    tests.py         # 测试文件
    views.py         # 视图函数
    migrations/      # 数据库迁移文件
2.3 项目和应用之间的关系
  • 项目(Project): 一个 Django 项目是一个整体,包含了多个应用、配置文件以及数据库等内容。
  • 应用(App): 每个应用都是一个独立的模块,通常实现项目中的某个功能。

第三章:Django 的开发规范

3.1 遵循 Django 的项目结构

在 Django 中,项目和应用的结构是非常重要的。虽然你可以按照自己的需求调整项目和应用的组织方式,但通常建议保持 Django 的默认结构,这样会更容易与其他开发者协作,并且方便日后的维护。

3.2 遵循 Python 的 PEP 8

Django 是用 Python 编写的,所以在编写 Django 代码时,遵循 Python 的编码规范(PEP 8)非常重要。PEP 8 是 Python 官方的编码风格指南,涵盖了代码缩进、命名约定、空格的使用等方面。

  • 类名使用驼峰式命名法(如 MyModel)。
  • 变量名函数名使用小写字母加下划线命名法(如 get_user_profile)。
  • 代码缩进使用 4 个空格。
3.3 遵循 Django 的约定

Django 提供了一些约定,遵循这些约定可以让你写出更简洁、规范的代码。比如:

  • 模型命名:模型类的名称应该采用单数形式,比如 Book(表示一本书),而不是 Books
  • 视图命名:视图函数一般应该使用动词短语,表示动作,比如 create_articleview_article
3.4 使用 Django 提供的功能

Django 提供了许多开箱即用的功能,尽量不要重新发明轮子。例如,Django 已经实现了身份认证、权限控制、表单处理等常用功能,尽量使用它们而不是从头开始编写。

第四章:Django 的 URL 路由

4.1 URL 路由基础

Django 的 URL 路由系统将 URL 与视图函数绑定。你需要在 urls.py 文件中定义 URL 模式(patterns),并将它们映射到视图函数。

示例:

# myproject/urls.py
from django.contrib import admin
from django.urls import path
from myapp import views

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

在这个例子中,当访问 /hello/ 时,Django 会调用 views.hello_world 这个视图函数。

4.2 动态 URL 参数

你还可以在 URL 中定义动态参数,并将其传递给视图函数。例如,下面的路由会捕捉 URL 中的 id 参数,并传递给视图:

# myproject/urls.py
urlpatterns = [
    path('article/<int:id>/', views.article_detail),
]

视图函数接收该参数:

# myapp/views.py
from django.http import HttpResponse

def article_detail(request, id):
    return HttpResponse(f"Article ID is {id}")

好的,我们接着往下讲解,深入一些 Django 的开发要点和常见的功能模块。

第五章:Django 模型(Models)

5.1 什么是模型(Model)?

在 Django 中,模型是用来定义数据结构的类,通常与数据库中的表一一对应。通过模型,你可以方便地定义、查询和操作数据库中的数据。Django 提供了一个 ORM(对象关系映射)系统,使得你可以用 Python 代码来代替 SQL 查询,简化了数据库操作。

5.2 创建模型

一个模型是继承自 django.db.models.Model 的类。每个模型的属性对应数据库表中的字段。

例如,定义一个 Book 模型来表示书籍:

# myapp/models.py
from django.db import models

class Book(models.Model):
    title = models.CharField(max_length=100)
    author = models.CharField(max_length=100)
    published_date = models.DateField()
    isbn = models.CharField(max_length=13)
    pages = models.IntegerField()

    def __str__(self):
        return self.title

这里的 Book 类有几个字段:

  • CharField:用于存储字符数据,通常用于短文本。
  • DateField:用于存储日期。
  • IntegerField:用于存储整数。
5.3 创建和应用数据库迁移

在创建或修改模型后,需要执行迁移(migration),这是 Django 管理数据库的方式。

  1. 生成迁移文件

    python manage.py makemigrations
    
  2. 应用迁移

    python manage.py migrate
    

这两个命令会同步数据库的结构,使其与模型保持一致。

5.4 查询数据库

Django 提供了一个强大的查询 API,允许你以 Python 的方式进行数据库操作。

  • 查询所有书籍

    books = Book.objects.all()
    
  • 过滤书籍

    books_by_author = Book.objects.filter(author='J.K. Rowling')
    
  • 获取单本书籍

    book = Book.objects.get(id=1)
    
  • 添加新书籍

    new_book = Book(title="New Book", author="Author Name", published_date="2025-04-18", isbn="1234567890123", pages=300)
    new_book.save()
    
  • 更新书籍信息

    book = Book.objects.get(id=1)
    book.title = "Updated Title"
    book.save()
    
  • 删除书籍

    book = Book.objects.get(id=1)
    book.delete()
    
5.5 模型的高级功能
  • 字段选项:每个模型字段都有一些选项来控制字段的行为,比如 null=Trueblank=Truedefault=value 等。
  • 关系字段:Django 支持模型之间的关系,例如一对多、多对多关系等。

例如,一对多关系:

class Author(models.Model):
    name = models.CharField(max_length=100)

class Book(models.Model):
    title = models.CharField(max_length=100)
    author = models.ForeignKey(Author, on_delete=models.CASCADE)

第六章:Django 视图(Views)

6.1 什么是视图?

视图是处理 HTTP 请求并返回 HTTP 响应的函数或类。Django 支持两种类型的视图:函数视图和类视图。

6.2 函数视图

函数视图是最简单的视图形式,它是一个普通的 Python 函数,接收一个 request 参数并返回一个 HttpResponse 对象。

例如,定义一个简单的视图返回欢迎消息:

# myapp/views.py
from django.http import HttpResponse

def welcome(request):
    return HttpResponse("Welcome to Django!")
6.3 类视图

类视图是基于 Python 类的视图,它使得视图逻辑更加结构化和可重用。Django 提供了许多内置的类视图,简化了常见任务(如显示列表、显示单个对象等)。

例如,定义一个基于类的视图来显示书籍的列表:

# myapp/views.py
from django.views import View
from django.http import HttpResponse
from .models import Book

class BookListView(View):
    def get(self, request):
        books = Book.objects.all()
        books_list = "\n".join([book.title for book in books])
        return HttpResponse(books_list)
6.4 使用视图函数和类视图的选择
  • 函数视图适合简单的场景和快速的开发。
  • 类视图适合处理复杂的请求逻辑,并且可以利用 Django 提供的通用视图(如 ListViewDetailView)来加速开发。

第七章:Django 模板(Templates)

7.1 什么是模板?

模板用于呈现动态生成的 HTML 内容。Django 使用模板引擎来将数据渲染到 HTML 页面中,分离了应用的逻辑和显示内容。模板通常包含占位符,这些占位符在视图中会被实际的数据替代。

7.2 渲染模板

要在视图中使用模板,你需要使用 Django 的 render 函数来渲染模板并返回响应。

# myapp/views.py
from django.shortcuts import render
from .models import Book

def book_list(request):
    books = Book.objects.all()
    return render(request, 'book_list.html', {'books': books})

在上面的代码中,render 函数将模板 book_list.htmlbooks 数据传递给模板。

7.3 模板语言

Django 模板语言(DTL)允许你在模板中使用变量、控制结构和过滤器。

  • 变量:模板中可以嵌入 Python 变量,例如:

    <h1>{{ book.title }}</h1>
    
  • 控制结构:如循环和条件判断:

    {% for book in books %}
        <p>{{ book.title }}</p>
    {% endfor %}
    
  • 过滤器:过滤器用于修改变量的输出,例如:

    <p>{{ book.published_date|date:"Y-m-d" }}</p>
    

第八章:Django 管理后台

8.1 使用 Django Admin

Django 提供了一个功能强大的自动化管理后台,你可以用它来管理模型数据。要启用 Django Admin,你需要在 models.py 中注册你的模型。

例如,注册 Book 模型:

# myapp/admin.py
from django.contrib import admin
from .models import Book

admin.site.register(Book)

之后,你可以在浏览器中访问 /admin/ 来登录并管理你的数据。

8.2 创建超级用户

要访问 Django 的管理后台,你需要先创建一个超级用户:

python manage.py createsuperuser

然后按照提示设置用户名、电子邮件和密码。


继续深入,我们将探讨 Django 的一些更高级功能和应用开发中的常见需求。

第九章:Django 表单(Forms)

9.1 什么是 Django 表单?

Django 提供了一个强大的表单系统,使得处理用户提交的表单变得简单。表单不仅可以用来处理 HTML 表单数据,还可以用于验证用户输入、自动生成表单控件等。

9.2 创建表单

你可以使用 forms.Form 来定义表单类。在表单类中,你可以定义字段(如 CharFieldEmailField 等)并指定验证规则。

例如,创建一个简单的用户注册表单:

# myapp/forms.py
from django import forms

class UserRegistrationForm(forms.Form):
    username = forms.CharField(max_length=100)
    email = forms.EmailField()
    password = forms.CharField(widget=forms.PasswordInput)

在这个表单中,我们有三个字段:

  • CharField:用于文本输入。
  • EmailField:用于电子邮件输入,并且会自动验证输入是否合法。
  • PasswordInput:密码输入框。
9.3 处理表单提交

在视图中,我们可以处理表单提交并验证用户输入。例如:

# myapp/views.py
from django.shortcuts import render
from .forms import UserRegistrationForm

def register(request):
    if request.method == 'POST':
        form = UserRegistrationForm(request.POST)
        if form.is_valid():
            # 处理表单数据
            username = form.cleaned_data['username']
            email = form.cleaned_data['email']
            password = form.cleaned_data['password']
            # 假设这里有保存用户逻辑
            return render(request, 'registration_success.html')
    else:
        form = UserRegistrationForm()

    return render(request, 'register.html', {'form': form})

在这个视图中:

  • 我们首先判断请求方法是否为 POST,即表单是否被提交。
  • 如果表单有效,form.is_valid() 返回 True,则可以通过 form.cleaned_data 访问用户输入的数据。
  • 否则,显示一个新的空表单。
9.4 渲染表单

模板文件 register.html 中,我们可以使用 Django 模板语言来渲染表单:

<form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">Register</button>
</form>

在模板中:

  • {% csrf_token %} 是 CSRF(跨站请求伪造)保护令牌,用于防止 CSRF 攻击。
  • {{ form.as_p }} 会将表单的每个字段渲染成一个 <p> 标签的形式。
9.5 表单验证和错误处理

当表单无效时,Django 会自动处理错误,并将错误信息传递到模板中。例如,你可以在模板中这样展示错误信息:

{% if form.errors %}
    <ul>
        {% for field in form %}
            {% for error in field.errors %}
                <li>{{ error }}</li>
            {% endfor %}
        {% endfor %}
    </ul>
{% endif %}
9.6 使用模型表单

模型表单(ModelForm)是 Django 提供的一种便捷方式,用于自动生成与模型字段对应的表单字段。例如,我们可以为 Book 模型创建一个表单:

# myapp/forms.py
from django import forms
from .models import Book

class BookForm(forms.ModelForm):
    class Meta:
        model = Book
        fields = ['title', 'author', 'published_date']

然后在视图中使用该表单进行处理:

# myapp/views.py
from django.shortcuts import render, redirect
from .forms import BookForm

def create_book(request):
    if request.method == 'POST':
        form = BookForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect('book_list')
    else:
        form = BookForm()

    return render(request, 'create_book.html', {'form': form})

第十章:Django 中的用户认证(Authentication)

10.1 用户认证概述

Django 内置了一个强大的认证系统,提供了用户注册、登录、登出、密码管理等功能。你可以轻松地使用这些功能来构建安全的 Web 应用。

10.2 用户登录和登出

Django 提供了一个视图和表单来处理用户登录。你可以使用 Django 内置的 LoginViewLogoutView 来处理登录和登出操作。

  • 登录视图

    from django.contrib.auth.views import LoginView
    
    urlpatterns = [
        path('login/', LoginView.as_view(), name='login'),
    ]
    
  • 登出视图

    from django.contrib.auth.views import LogoutView
    
    urlpatterns = [
        path('logout/', LogoutView.as_view(), name='logout'),
    ]
    

Django 会自动为你处理认证过程。如果登录成功,用户将被重定向到 LOGIN_REDIRECT_URL 配置的 URL,通常是主页。

10.3 用户注册

Django 没有提供内置的用户注册视图,但你可以通过编写自定义视图来处理用户注册。

例如,使用 UserCreationForm 来处理用户注册:

# myapp/forms.py
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.models import User

class CustomUserCreationForm(UserCreationForm):
    email = forms.EmailField()

    class Meta:
        model = User
        fields = ['username', 'email', 'password1', 'password2']

然后在视图中使用这个表单:

# myapp/views.py
from django.shortcuts import render, redirect
from .forms import CustomUserCreationForm

def register(request):
    if request.method == 'POST':
        form = CustomUserCreationForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect('login')
    else:
        form = CustomUserCreationForm()

    return render(request, 'register.html', {'form': form})
10.4 用户权限和组

Django 还提供了权限控制功能,可以为不同的用户赋予不同的访问权限。你可以定义 Group(组)和 Permission(权限),然后为用户分配。

  • 权限检查

    if request.user.has_perm('myapp.can_edit'):
        # 用户有权限
    
  • 组管理

    from django.contrib.auth.models import Group
    group = Group.objects.get(name='Editors')
    user.groups.add(group)
    

第十一章:Django 静态文件和媒体文件

11.1 静态文件

静态文件(如 CSS、JavaScript 和图片)通常是 Web 应用中的静态资源,Django 提供了一个机制来管理这些文件。

  • 配置静态文件:在 settings.py 中,你需要配置静态文件目录:

    STATIC_URL = '/static/'
    STATICFILES_DIRS = [
        BASE_DIR / 'static',
    ]
    
  • 使用静态文件:在模板中,你可以使用 {% static %} 标签引用静态文件:

    <link rel="stylesheet" type="text/css" href="{% static 'css/styles.css' %}">
    
  • 收集静态文件:在部署时,使用 collectstatic 命令将所有静态文件集中到一个目录:

    python manage.py collectstatic
    
11.2 媒体文件

媒体文件(如上传的文件)通常需要不同的配置。

  • 配置媒体文件

    MEDIA_URL = '/media/'
    MEDIA_ROOT = BASE_DIR / 'media'
    
  • 处理文件上传:在表单中使用 FileFieldImageField 来处理文件上传。

    class UserProfile(models.Model):
        user = models.OneToOneField(User, on_delete=models.CASCADE)
        avatar = models.ImageField(upload_to='avatars/')
    

在模板中,你可以通过 {{ userprofile.avatar.url }} 来显示上传的头像。


好的,接下来我们继续深入 Django,补充一些可能遗漏的重要知识点,并介绍一些在开发中非常常用的功能。Django 是一个功能丰富的框架,掌握更多的高级特性能够帮助你更加高效地开发应用。

第十二章:Django 中的中间件(Middleware)

12.1 什么是中间件?

中间件是一个处理请求和响应的钩子,它位于 Django 请求/响应生命周期的中间。中间件可以处理和修改请求,响应,或者执行一些额外的操作(如用户认证、跨域请求支持、请求日志等)。

中间件在每个请求和响应的生命周期中都会被执行,并且可以在视图函数执行之前或之后进行操作。

12.2 中间件的工作原理

中间件可以在以下环节处理请求或响应:

  • 请求阶段:在请求到达视图函数之前,执行相关操作(如用户认证、权限检查等)。
  • 响应阶段:在视图函数处理完请求后,响应返回给客户端之前,执行相应的操作(如响应压缩、添加头信息等)。

settings.py 文件中,你可以配置全局的中间件列表(MIDDLEWARE)。

12.3 创建自定义中间件

你可以通过创建一个 Python 类并实现其中的方法来创建自定义中间件。

# myapp/middleware.py
from django.http import HttpResponse

class SimpleMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        # 请求前的操作
        print("Request received")

        # 获取响应
        response = self.get_response(request)

        # 响应后的操作
        print("Response sent")
        return response

然后,在 settings.py 中添加这个中间件:

MIDDLEWARE = [
    # 其他中间件...
    'myapp.middleware.SimpleMiddleware',
]
12.4 常见的内置中间件

Django 提供了许多常用的中间件,例如:

  • AuthenticationMiddleware:处理用户认证。
  • SessionMiddleware:处理会话管理。
  • CSRFMiddleware:防止跨站请求伪造(CSRF)攻击。
  • CommonMiddleware:提供一些常见的功能,比如 URL 重定向、内容长度限制等。

第十三章:Django 的信号系统(Signals)

13.1 什么是信号?

信号是 Django 提供的一种通知机制,它允许一个部分的代码发送通知,其他部分的代码可以接收到这些通知并做出反应。信号的作用是解耦不同部分的代码,避免直接调用和相互依赖。

例如,你可以在用户注册成功后,通过信号发送通知,或者在数据库模型保存后自动做某些事情。

13.2 创建和使用信号

Django 提供了 django.db.models.signalsdjango.core.signals 这两个信号系统,最常见的信号之一是 post_save 信号,它会在模型实例被保存后触发。

首先,在 signals.py 中定义一个信号处理函数:

# myapp/signals.py
from django.db.models.signals import post_save
from django.dispatch import receiver
from .models import User

@receiver(post_save, sender=User)
def user_post_save(sender, instance, created, **kwargs):
    if created:
        print(f"New user created: {instance.username}")

然后,在 apps.py 文件中连接信号:

# myapp/apps.py
from django.apps import AppConfig

class MyAppConfig(AppConfig):
    name = 'myapp'

    def ready(self):
        import myapp.signals

这样,当 User 模型实例保存时,user_post_save 函数会自动被调用。

第十四章:Django 测试(Testing)

14.1 Django 测试框架

Django 内置了一个功能强大的测试框架,基于 Python 的 unittest,但对 Django 项目进行了适配。它可以帮助你在开发过程中测试视图、模型、表单和其他功能。

14.2 创建测试用例

你可以为应用中的视图、模型等编写测试用例,确保代码在不同场景下的正确性。

例如,创建一个针对 Book 模型的简单测试:

# myapp/tests.py
from django.test import TestCase
from .models import Book

class BookModelTest(TestCase):
    def test_book_creation(self):
        book = Book.objects.create(title="Test Book", author="Author", isbn="12345", pages=200)
        self.assertEqual(book.title, "Test Book")
        self.assertEqual(book.author, "Author")
14.3 测试视图

你还可以测试视图函数,确保它们返回正确的 HTTP 响应。

# myapp/tests.py
from django.test import TestCase
from django.urls import reverse

class BookViewTest(TestCase):
    def test_book_list_view(self):
        response = self.client.get(reverse('book_list'))
        self.assertEqual(response.status_code, 200)
        self.assertContains(response, "Books")
  • self.client.get():模拟一个 GET 请求。
  • self.assertEqual():断言响应状态码是否为 200。
  • self.assertContains():断言响应内容是否包含某些文本。
14.4 自动化测试

Django 支持自动化的测试运行。你可以通过以下命令来运行所有测试:

python manage.py test

第十五章:Django 缓存(Caching)

15.1 什么是缓存?

缓存是存储一些计算结果或资源的机制,用于减少对数据库的频繁访问,提高性能。Django 提供了多种缓存方法,如内存缓存、文件缓存、数据库缓存等。

15.2 配置缓存

Django 支持多种缓存后端,可以在 settings.py 中进行配置。例如,使用内存缓存:

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
    }
}
15.3 使用缓存

你可以通过 cache API 来缓存数据:

from django.core.cache import cache

# 设置缓存
cache.set('my_key', 'my_value', timeout=60)

# 获取缓存
value = cache.get('my_key')

# 删除缓存
cache.delete('my_key')
15.4 页面缓存和模板缓存

Django 还支持对整个视图或模板进行缓存。

  • 页面缓存:使用 cache_page 装饰器缓存视图的输出。

    from django.views.decorators.cache import cache_page
    
    @cache_page(60 * 15)  # 缓存 15 分钟
    def my_view(request):
        # 视图逻辑
    
  • 模板缓存:在模板中使用 {% cache %} 标签缓存部分模板内容。

第十六章:Django 部署

16.1 准备工作

在开发完成后,部署是将 Django 应用上线的关键步骤。部署 Django 应用通常涉及到以下内容:

  • 配置生产环境的数据库(通常是 PostgreSQL 或 MySQL)。
  • 配置 Web 服务器(如 Nginx 或 Apache)。
  • 配置 WSGI 服务器(如 Gunicorn)。
  • 配置静态文件和媒体文件。
16.2 配置数据库

settings.py 中,配置数据库为生产环境的数据库(例如 PostgreSQL):

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'mydb',
        'USER': 'myuser',
        'PASSWORD': 'mypassword',
        'HOST': 'localhost',
        'PORT': '5432',
    }
}
16.3 生产环境设置
  • 禁用调试模式:确保 DEBUG = False,并设置 ALLOWED_HOSTS
  • 收集静态文件
    python manage.py collectstatic
    
16.4 使用 WSGI 和 Gunicorn

Django 使用 WSGI 来与 Web 服务器通信。在生产环境中,通常会使用 Gunicorn 作为 WSGI 服务器。

安装 Gunicorn:

pip install gunicorn

运行 Gunicorn:

gunicorn myproject.wsgi:application
16.5 配置 Nginx

Nginx 常用作反向代理,帮助处理静态文件请求并将动态请求代理到 Gunicorn。

基本的 Nginx 配置:

server {
    listen 80;
    server_name mysite.com;

    location / {
        proxy_pass http://127.0.0.1:8000;
    }

    location /static/ {
        root /path/to/your/static/directory;
    }

    location /media/ {
        root /path/to/your

/media/directory;
    }
}

好的,接下来我们继续补充一些实际开发中常用的 Django 知识点和技术,帮助你在日常开发中更高效地使用 Django。

第十七章:Django 的 REST API 开发

随着 Web 应用的发展,许多项目需要开发 RESTful API,以便与前端或其他应用进行通信。Django 提供了一个非常强大的库——Django Rest Framework (DRF),用于快速构建 API。

17.1 安装 Django Rest Framework

首先,你需要安装 Django Rest Framework。

pip install djangorestframework

然后在 settings.py 中添加 rest_frameworkINSTALLED_APPS

INSTALLED_APPS = [
    # 其他应用...
    'rest_framework',
]
17.2 创建简单的 API 视图

使用 DRF,你可以通过视图类或函数轻松构建 API 视图。最常见的方式是使用 APIView 类。

例如,创建一个返回所有书籍的简单 API 视图:

# myapp/views.py
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from .models import Book
from .serializers import BookSerializer

class BookList(APIView):
    def get(self, request):
        books = Book.objects.all()
        serializer = BookSerializer(books, many=True)
        return Response(serializer.data, status=status.HTTP_200_OK)
17.3 创建 Serializer

在 DRF 中,Serializer 是将模型实例转化为 JSON 数据的工具。

# myapp/serializers.py
from rest_framework import serializers
from .models import Book

class BookSerializer(serializers.ModelSerializer):
    class Meta:
        model = Book
        fields = ['id', 'title', 'author', 'published_date', 'isbn']
17.4 配置 URL 路由

你需要将 API 视图与 URL 进行绑定。

# myapp/urls.py
from django.urls import path
from .views import BookList

urlpatterns = [
    path('api/books/', BookList.as_view(), name='book_list_api'),
]

现在,当你访问 /api/books/ 时,Django 将返回所有书籍的 JSON 数据。

17.5 使用 DRF 的认证和权限

Django Rest Framework 提供了多种认证和权限控制方式(如 Token 认证、OAuth 等)。

  • Token 认证:可以使用 rest_framework.authtoken 来实现 Token 认证。
    1. 安装 djangorestframework-authtoken
      pip install djangorestframework-authtoken
      
    2. INSTALLED_APPS 中添加:
      'rest_framework.authtoken',
      
    3. 在 URL 中添加 Token 认证视图:
      from rest_framework.authtoken.views import obtain_auth_token
      urlpatterns = [
          path('api-token-auth/', obtain_auth_token),
      ]
      
17.6 分页、过滤和排序

Django Rest Framework 提供了强大的分页、过滤和排序功能。

  • 分页:可以在 settings.py 中配置全局分页设置。

    REST_FRAMEWORK = {
        'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
        'PAGE_SIZE': 10,
    }
    
  • 过滤:可以使用 django_filters 来处理过滤功能。

    pip install django-filter
    

    然后在视图中使用:

    from rest_framework import viewsets
    from .models import Book
    from .serializers import BookSerializer
    from django_filters.rest_framework import DjangoFilterBackend
    
    class BookViewSet(viewsets.ModelViewSet):
        queryset = Book.objects.all()
        serializer_class = BookSerializer
        filter_backends = [DjangoFilterBackend]
        filterset_fields = ['author', 'published_date']
    
  • 排序:通过 ordering 可以添加排序功能。

    class BookViewSet(viewsets.ModelViewSet):
        queryset = Book.objects.all()
        serializer_class = BookSerializer
        ordering_fields = ['title', 'published_date']
    

第十八章:Django 中的异步支持

随着 Python 异步支持的增强,Django 也开始逐步支持异步功能,尤其在处理高并发请求时,异步操作显得尤为重要。

18.1 异步视图

从 Django 3.1 开始,Django 支持异步视图和中间件。异步视图可以在执行 I/O 密集型任务时避免阻塞,从而提高应用性能。

例如,创建一个异步视图来模拟网络请求:

# myapp/views.py
from django.http import JsonResponse
import asyncio

async def my_async_view(request):
    await asyncio.sleep(2)  # 模拟一些 I/O 密集型操作
    return JsonResponse({'message': 'Hello, Async World!'})
18.2 异步数据库查询

Django 目前(截至 2023)对数据库查询的支持仍然是同步的,无法直接执行异步数据库查询。但你可以使用 asgiref.sync.sync_to_async 将同步的数据库查询转为异步。

例如,异步调用一个同步的数据库查询:

from asgiref.sync import sync_to_async

@sync_to_async
def get_books():
    return Book.objects.all()

然后在异步视图中调用:

async def book_list(request):
    books = await get_books()
    return JsonResponse({'books': [book.title for book in books]})

第十九章:Django 的高级查询

19.1 聚合和注解

Django 的 ORM 提供了强大的聚合和注解功能,能够帮助你高效地进行数据汇总和分组。

  • 聚合:使用 aggregate 来进行聚合操作,如计数、求和、平均值等。

    from django.db.models import Count, Avg
    
    # 获取每个作者的书籍数量
    author_books_count = Book.objects.values('author').annotate(count=Count('id'))
    
  • 注解:通过 annotate 为查询结果中的每一行添加额外的计算字段。

    # 获取每个作者的平均页数
    author_avg_pages = Book.objects.values('author').annotate(avg_pages=Avg('pages'))
    
19.2 子查询和 Exists

Django ORM 允许你在查询中使用子查询和 Exists

  • 子查询:使用 Subquery 在查询中嵌套另一个查询。

    from django.db.models import Subquery, OuterRef
    
    # 获取作者的第一本书
    first_book = Book.objects.filter(author=OuterRef('author')).order_by('published_date')
    authors_books = Author.objects.annotate(first_book_title=Subquery(first_book.values('title')[:1]))
    
  • Exists:用于检查某个查询是否返回结果。

    from django.db.models import Exists
    
    authors_books = Author.objects.annotate(has_books=Exists(Book.objects.filter(author=OuterRef('pk'))))
    
19.3 复杂查询的性能优化
  • select_relatedprefetch_related:用于优化查询性能,减少数据库的查询次数。

    • select_related:用于一对一或外键关系的优化查询。
    books = Book.objects.select_related('author').all()
    
    • prefetch_related:用于多对多或反向外键关系的优化查询。
    books = Book.objects.prefetch_related('tags').all()
    
  • onlydefer:优化查询字段,限制加载的数据。

    • only:只加载指定字段,减少查询的数据量。
    books = Book.objects.only('title', 'author')
    
    • defer:加载除指定字段外的所有字段。
    books = Book.objects.defer('description')
    

第二十章:Django 与前端集成

20.1 Django 与 JavaScript 的集成

Django 通常会与前端框架(如 React、Vue.js)一起使用,或者与传统的 JavaScript 集成。

  • Django 模板与 JavaScript 配合使用:你可以将数据从 Django 模板传递到前端 JavaScript。

    <script>
        const books = {{ books | json_script:"books_data" }};
    </script>
    
  • 使用 AJAX 与 Django 后端通信:你可以通过 JavaScript 使用 AJAX 向 Django 后端发送请求并获取响应。

    fetch('/api/books/')
        .then(response => response.json())
        .then(data => console.log(data));
    
20.2 Django 与前端框架(React/Vue)的集成

在现代应用中

,Django 通常作为后端 API 服务,前端通过 React、Vue 或 Angular 来构建单页面应用(SPA)。

你可以使用 Django Rest Framework 构建 API,然后让前端通过 HTTP 请求(如 fetch 或 Axios)与 Django 后端交互。


好的,接下来我会详细讲解 Django 与前端框架 Vue.js 的集成。这种集成通常是在现代 Web 应用中广泛使用的一种模式,前端使用 Vue.js 来构建动态交互的界面,后端使用 Django 提供 API 支持,前后端通过 API 进行数据交互。

一、Django 与 Vue.js 集成的整体架构

Django 主要负责处理后端业务逻辑和提供数据 API,Vue.js 负责处理前端页面的渲染和交互,通常这种架构下,Django 会作为 RESTful API 后端,提供数据接口,而 Vue.js 会作为 前端 SPA(单页面应用),通过 API 与后端交互。

1. Django 作为后端 API(使用 Django Rest Framework)

在这种架构下,Django 通过 Django Rest Framework (DRF) 来提供 RESTful API,Vue.js 前端通过 HTTP 请求(比如使用 axiosfetch)向 Django 请求数据。

2. Vue.js 作为前端

Vue.js 会从 Django 后端获取数据并渲染到页面上。Vue.js 负责前端视图的更新和用户交互,Django 则专注于提供数据支持。

这种结构有助于前后端分离,可以让前端和后端独立开发,易于扩展和维护。

二、如何实现 Django 与 Vue.js 的集成?

2.1 创建 Django 项目并设置 API
  1. 创建 Django 项目
    首先,我们创建一个新的 Django 项目(如果你已经有一个现有项目,可以跳过这一步)。

    django-admin startproject myproject
    cd myproject
    
  2. 安装 Django Rest Framework
    安装 djangorestframework 库,它帮助我们构建 RESTful API。

    pip install djangorestframework
    

    然后在 settings.py 中添加 rest_framework

    INSTALLED_APPS = [
        ...
        'rest_framework',
    ]
    
  3. 创建一个 Django 应用
    现在我们创建一个名为 books 的 Django 应用来处理书籍的数据。

    python manage.py startapp books
    
  4. 定义模型 (Model)
    books/models.py 文件中定义一个简单的 Book 模型:

    from django.db import models
    
    class Book(models.Model):
        title = models.CharField(max_length=100)
        author = models.CharField(max_length=100)
        published_date = models.DateField()
    
        def __str__(self):
            return self.title
    
  5. 创建数据库迁移并应用迁移
    通过以下命令创建数据库表:

    python manage.py makemigrations
    python manage.py migrate
    
  6. 创建序列化器 (Serializer)
    books/serializers.py 中创建一个 BookSerializer 类,用于将 Book 模型转化为 JSON 格式:

    from rest_framework import serializers
    from .models import Book
    
    class BookSerializer(serializers.ModelSerializer):
        class Meta:
            model = Book
            fields = ['id', 'title', 'author', 'published_date']
    
  7. 创建 API 视图
    books/views.py 中创建一个 API 视图来提供书籍数据:

    from rest_framework.views import APIView
    from rest_framework.response import Response
    from .models import Book
    from .serializers import BookSerializer
    
    class BookList(APIView):
        def get(self, request):
            books = Book.objects.all()
            serializer = BookSerializer(books, many=True)
            return Response(serializer.data)
    
  8. 设置 URL 路由
    books/urls.py 中设置 API 路由:

    from django.urls import path
    from .views import BookList
    
    urlpatterns = [
        path('api/books/', BookList.as_view(), name='book_list_api'),
    ]
    

    myproject/urls.py 中包含 books 应用的 URL:

    from django.urls import path, include
    
    urlpatterns = [
        path('books/', include('books.urls')),
        # 其他路由...
    ]
    
  9. 运行 Django 服务器
    启动 Django 开发服务器:

    python manage.py runserver
    

    此时,http://127.0.0.1:8000/books/api/books/ 就可以返回书籍的 JSON 数据了。

2.2 创建 Vue.js 项目
  1. 安装 Node.js 和 Vue CLI
    如果没有安装 Node.jsVue CLI,可以从官网下载安装:

    • Node.js 下载
    • Vue CLI 下载
  2. 创建 Vue 项目
    在 Django 项目外部创建一个 Vue 项目:

    vue create vue-frontend
    

    选择默认配置,进入项目目录:

    cd vue-frontend
    
  3. 安装 Axios
    Vue.js 需要 axios 来向 Django 后端发送 HTTP 请求。可以通过以下命令安装 axios

    npm install axios
    
  4. 配置 Vue.js 与 Django 后端交互
    src/components 中创建一个新的 Vue 组件,例如 BookList.vue,用于展示从 Django 获取的数据。

    <template>
      <div>
        <h1>Books</h1>
        <ul>
          <li v-for="book in books" :key="book.id">{{ book.title }} by {{ book.author }}</li>
        </ul>
      </div>
    </template>
    
    <script>
    import axios from 'axios';
    
    export default {
      data() {
        return {
          books: [],
        };
      },
      created() {
        this.fetchBooks();
      },
      methods: {
        async fetchBooks() {
          try {
            const response = await axios.get('http://127.0.0.1:8000/books/api/books/');
            this.books = response.data;
          } catch (error) {
            console.error("There was an error fetching books:", error);
          }
        }
      }
    };
    </script>
    

    这里使用 axios.get 从 Django 后端的 /books/api/books/ 接口获取书籍数据,并将它们存储在 books 数组中。

  5. 运行 Vue 项目
    通过以下命令启动 Vue.js 开发服务器:

    npm run serve
    

    默认情况下,Vue.js 运行在 http://localhost:8080,你可以在浏览器中访问它。

  6. 跨域请求问题
    由于前端和后端的端口不同,Vue.js 发送的请求会受到跨域(CORS)的限制。你可以使用 Django 的 django-cors-headers 库来处理跨域问题。

    安装 django-cors-headers

    pip install django-cors-headers
    

    然后在 settings.py 中添加它:

    INSTALLED_APPS = [
        ...
        'corsheaders',
    ]
    
    MIDDLEWARE = [
        ...
        'corsheaders.middleware.CorsMiddleware',
    ]
    
    CORS_ALLOWED_ORIGINS = [
        'http://localhost:8080',  # 允许 Vue 前端的跨域请求
    ]
    

    现在,前端 Vue.js 可以顺利向 Django 后端发起请求。

三、前后端部署

  1. 部署 Django 后端

    • 将 Django 项目部署到生产环境(例如,使用 GunicornNginx)。
    • 配置数据库(如 PostgreSQL)并收集静态文件(python manage.py collectstatic)。
  2. 部署 Vue.js 前端

    • 构建 Vue.js 项目:npm run build
    • 将构建后的文件(通常在 dist 目录中)部署到 Web 服务器(例如,使用 NginxApache)。

四、总结

  • Django 提供后端 API:使用 Django 和 Django Rest Framework 构建 API,提供数据。
  • Vue.js 作为前端:使用 Vue.js 来构建前端视图,异步请求后端数据。
  • 跨域处理:使用 django-cors-headers 处理前后端的跨域问题。
  • 部署:分别部署 Django 后端和 Vue.js 前端,并通过 API 进行通信。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2337998.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

浏览器缩放后 element ui组件偏移

一、需求&#xff1a;当body的有了zoom值之后&#xff0c;element ui相关的popper弹框&#xff08;下拉框、日期选择框、分页组件&#xff09;位置都会出现偏移问题 二、问题来源 popper弹框都会需要根据屏幕x,y的坐标来设置位置&#xff0c;但是有了zoom值之后&#xff0c;x,y…

FPGA学习——DE2-115开发板上设计波形发生器

1. 实验目的 掌握直接数字频率合成&#xff08;DDS&#xff09;技术的基本原理和应用。使用DE2-115开发板实现正弦波和方波的生成。使用SignalTap II嵌入式逻辑分析仪测试输出波形的离散数据。 2. 实验原理 DDS技术&#xff1a;通过相位累加器生成相位信息&#xff0c;结合波…

【springsecurity oauth2授权中心】简单案例跑通流程

项目被拆分开&#xff0c;需要一个授权中心使得每个项目都去授权中心登录获取用户权限。而单一项目里权限使用的是spring-security来控制的&#xff0c;每个controller方法上都有 PreAuthorize("hasAuthority(hello)") 注解来控制权限&#xff0c;想以最小的改动来实…

2025TGCTF Web WP复现

AAA 偷渡阴平 <?php$tgctf2025$_GET[tgctf2025];if(!preg_match("/0|1|[3-9]|\~|\|\|\#|\\$|\%|\^|\&|\*|\&#xff08;|\&#xff09;|\-|\|\|\{|\[|\]|\}|\:|\|\"|\,|\<|\.|\>|\/|\?|\\\\/i", $tgctf2025)){//hint&#xff1a;你可以对着键盘…

「GitHub热榜」AIGC系统源码:AI问答+绘画+PPT+音乐生成一站式

—零门槛搭建私有化AI内容工厂&#xff0c;源码开放商业落地指南 为什么全栈AIGC系统成为企业刚需&#xff1f; 1. 传统方案的致命缺陷 痛点 使用ChatGPTMidjourneyCanva 本全栈方案 工具割裂 需切换5平台 一个系统全搞定 成本 年费50万 一次部署永久免费 数据安全 …

【C++】 —— 笔试刷题day_19

一、小易的升级之路 题目解析 小易现在要打游戏&#xff0c;现在游戏角色的初始能力值为a&#xff0c;我们会遇到n个怪&#xff0c;这些怪物的防御值为b1、b2、b3...&#xff0c;如果我们的能力值要高于或者等于怪物的防御值&#xff0c;那我们的能力值就会加bi&#xff1b;如…

Kubernetes》》K8S》》Pod的健康检查

K8s概念总结 》》》Pod的生命周期阶段 Pod的生命周期可以简单描述&#xff1a;首先Pod被创建&#xff0c;紧接着Pod被调度到Node节点进行部署。 Pod是非常忠诚的&#xff0c;一旦被分配到Node节点后&#xff0c;就不会离开这个Node节点&#xff0c;直到它被删除&#xff0c;删除…

计算机视觉——基于使用 OpenCV 与 Python 实现相机标定畸变校正

概述 相机标定是一种旨在通过确定相机的内参&#xff08;焦距、光学中心、畸变系数&#xff09;和外参&#xff08;相机的位置和方向&#xff09;&#xff0c;提高图像在现实世界中的几何精度的过程。该过程可以纠正相机拍摄的图像中的畸变&#xff0c;使相机能够准确感知现实…

Python作业4 文本词云统计,生成词云

编写程序&#xff0c;统计两会政府工作报告热词频率&#xff0c;并生成词云。 2025两会政府工作报告 import jieba import wordcloud from collections import Counter import re# 读取文件 with open("gov.txt", "r", encoding"gbk") as f:t …

Jenkins 2.492.2 LTS 重置管理员密码

文章目录 1. Jenkins 关闭用户认证2. jenkins 修改密码 如果忘记了 Jenkins 的管理员密码的话&#xff0c;也不用担心&#xff0c;只要你有权限访问 Jenkins 的根目录&#xff0c;就可以轻松地重置密码。 1. Jenkins 关闭用户认证 // 查看 jenkins 家目录&#xff08;使用 doc…

【裁判文书网DES3数据解密】逆向分析

点击翻页&#xff0c;出现请求&#xff0c;可以看到请求参数有个ciphertext密文&#xff0c;响应数据也是密文 打上断点&#xff0c;点击翻页&#xff0c;断住 可以看到postData里面的ciphertext已经生成 往前跟栈&#xff0c;可以发现是var ciphertext cipher(); funct…

花园灌溉问题

#include <bits/stdc.h> using namespace std;// 设置最大行列数&#xff08;题目限制 n, m ≤ 100&#xff09; const int N 104;// 标记某个格子是否已经被水浇灌 bool used[N][N];// 队列&#xff0c;用于 BFS&#xff0c;存储当前水源的位置 queue<pair<int,i…

《AI大模型应知应会100篇》第22篇:系统提示词(System Prompt)设计与优化

第22篇&#xff1a;系统提示词(System Prompt)设计与优化 摘要 在大语言模型&#xff08;LLM&#xff09;应用中&#xff0c;系统提示词&#xff08;System Prompt&#xff09;是控制模型行为的核心工具之一。它不仅定义了模型的身份、角色和行为规范&#xff0c;还直接影响输…

Jsp技术入门指南【六】jsp脚本原理及隐式对象

Jsp技术入门指南【六】jsp脚本原理及隐式对象 前言一、JSP 脚本元素1.1 声明1.2 表达式1.3 脚本标签 二、JSP 的隐式对象是什么三、隐式对象详解outrequestsessionapplicationconfigexception 前言 在之前的博客中&#xff0c;我们已经介绍了JSP的环境搭建、编译文件查找以及生…

Jsp技术入门指南【五】详细讲解jsp结构页面

Jsp技术入门指南【五】详细讲解jsp结构页面 前言一、JSP页面的结构二、JSP页面的部件1. 指令&#xff08;核心控制部件&#xff09;2. 动作&#xff08;页面交互部件&#xff0c;了解即可&#xff09;3. 脚本&#xff08;Java逻辑嵌入部件&#xff09; 三、JSP指令详解1.1 JSP指…

Beyond Compare 30天评估到期 解决方法

Beyond Compare 30天评估到期 解决方法 一、问题二、解决办法2.1 第一步&#xff1a;打开注册表2.2 第二步&#xff1a;删除cacheID 三、效果 一、问题 Beyond Compare提示评估到期&#xff0c;重装也无效&#xff0c;只需简单两步&#xff0c;轻轻松松出困境。 二、解决办法…

Arduino无线体感机器手——问题汇总

文章不介绍具体参数&#xff0c;有需求可去网上搜索。 特别声明&#xff1a;不论年龄&#xff0c;不看学历。既然你对这个领域的东西感兴趣&#xff0c;就应该不断培养自己提出问题、思考问题、探索答案的能力。 提出问题&#xff1a;提出问题时&#xff0c;应说明是哪款产品&a…

学习设计模式《一》——简单工厂

一、基础概念 1.1、接口 简单的说&#xff1a;接口是【用来实现类的行为定义、约束类的行为】&#xff08;即&#xff1a;定义可以做什么&#xff09;&#xff1b;接口可以包含【实例方法】、【属性】、【事件】、【索引器】或这四种成员类型的任意组合。 接口的优点&#xff1…

010数论——算法备赛

数论 模运算 一般求余都是对正整数的操作&#xff0c;如果对负数&#xff0c;不同编程语言结果可能不同。 C/javapythona>m,0<a%m<m-1 a<m,a%ma~5%32~-5%3 -21(-5)%(-3) -2~5%(-3)2-1正数&#xff1a;&#xff08;ab&#xff09;%m((a%m)(b%m))%m~正数&#xff…

NAT、代理服务、内网穿透

NAT、代理服务、内网穿透 1、NAT1.1、NAT过程1.2、NAPT2、内网穿透3、内网打洞3、代理服务器3.1、正向代理3.2、反向代理1、NAT 1.1、NAT过程 之前我们讨论了IPv4协议中IP地址数量不充足的问题。NAT技术是当前解决IP地址不够用的主要手段,是路由器的一个重要功能。 NAT能够将…