您的位置:首页 > 健康 > 美食 > 郑州软件开发学校_甘肃庆城县疫情最新消息_网站推广排名优化_百度应用市场

郑州软件开发学校_甘肃庆城县疫情最新消息_网站推广排名优化_百度应用市场

2025/4/22 17:48:08 来源:https://blog.csdn.net/qq_44810930/article/details/147338777  浏览:    关键词:郑州软件开发学校_甘肃庆城县疫情最新消息_网站推广排名优化_百度应用市场
郑州软件开发学校_甘肃庆城县疫情最新消息_网站推广排名优化_百度应用市场

第一章: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__.pyadmin.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 viewsurlpatterns = [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 HttpResponsedef 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 modelsclass 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 HttpResponsedef 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 Bookclass 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 Bookdef 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 Bookadmin.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 formsclass 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 UserRegistrationFormdef 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 Bookclass BookForm(forms.ModelForm):class Meta:model = Bookfields = ['title', 'author', 'published_date']

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

# myapp/views.py
from django.shortcuts import render, redirect
from .forms import BookFormdef 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 LoginViewurlpatterns = [path('login/', LoginView.as_view(), name='login'),
    ]
    
  • 登出视图

    from django.contrib.auth.views import LogoutViewurlpatterns = [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 Userclass CustomUserCreationForm(UserCreationForm):email = forms.EmailField()class Meta:model = Userfields = ['username', 'email', 'password1', 'password2']

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

# myapp/views.py
from django.shortcuts import render, redirect
from .forms import CustomUserCreationFormdef 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 HttpResponseclass SimpleMiddleware:def __init__(self, get_response):self.get_response = get_responsedef __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 AppConfigclass 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 Bookclass 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 reverseclass 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 BookSerializerclass 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 Bookclass BookSerializer(serializers.ModelSerializer):class Meta:model = Bookfields = ['id', 'title', 'author', 'published_date', 'isbn']
17.4 配置 URL 路由

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

# myapp/urls.py
from django.urls import path
from .views import BookListurlpatterns = [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 DjangoFilterBackendclass BookViewSet(viewsets.ModelViewSet):queryset = Book.objects.all()serializer_class = BookSerializerfilter_backends = [DjangoFilterBackend]filterset_fields = ['author', 'published_date']
    
  • 排序:通过 ordering 可以添加排序功能。

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

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

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

18.1 异步视图

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

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

# myapp/views.py
from django.http import JsonResponse
import asyncioasync 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 Existsauthors_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 modelsclass 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 Bookclass BookSerializer(serializers.ModelSerializer):class Meta:model = Bookfields = ['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 BookSerializerclass 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 BookListurlpatterns = [path('api/books/', BookList.as_view(), name='book_list_api'),
    ]
    

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

    from django.urls import path, includeurlpatterns = [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 进行通信。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com