当前位置: 首页 > news >正文

【Python3】Django 学习之路

第一章: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 进行通信。

相关文章:

【Python3】Django 学习之路

第一章&#xff1a;Django 简介 1.1 什么是 Django&#xff1f; Django 是一个高级的 Python Web 框架&#xff0c;旨在让 Web 开发变得更加快速和简便。它鼓励遵循“不要重复自己”&#xff08;DRY&#xff0c;Don’t Repeat Yourself&#xff09;的原则&#xff0c;并提供了…...

Java并发编程高频面试题(已整理Java面试宝典PDF完整版)

为什么要使用并发编程 提升多核CPU利用率&#xff1a;现代计算机通常配备多核CPU&#xff0c;通过创建多个线程&#xff0c;操作系统可以将不同线程分配到不同CPU核心上并行执行&#xff0c;从而充分利用硬件资源。若仅使用单线程&#xff0c;则只能利用一个CPU核心&#xff0c…...

第 4 期:DDPM中的损失函数——为什么只预测噪声?

—— 从变分下界到噪声预测 回顾&#xff1a;我们到底在做什么&#xff1f; 在第 3 期中&#xff0c;我们介绍了扩散模型的逆过程建模。简而言之&#xff0c;目标是通过神经网络学习从噪声 x_t​ 中恢复图像 x_0&#xff0c;并且我们通过预测噪声 ϵ来完成这个任务。 今天&a…...

Docker使用、容器迁移

Docker 简介 Docker 是一个开源的容器化平台&#xff0c;用于打包、部署和运行应用程序及其依赖环境。Docker 容器是轻量级的虚拟化单元&#xff0c;运行在宿主机操作系统上&#xff0c;通过隔离机制&#xff08;如命名空间和控制组&#xff09;确保应用运行环境的一致性和可移…...

专业热度低,25西电光电工程学院(考研录取情况)

1、光电工程学院各个方向 2、光电工程学院近三年复试分数线对比 学长、学姐分析 由表可看出&#xff1a; 1、光学工程25年相较于24年下降20分&#xff0c; 2、光电信息与工程&#xff08;专硕&#xff09;25年相较于24年上升15分 3、25vs24推免/统招人数对比 学长、学姐分析…...

六、LangChain Agent 最佳实践

1. 架构设计与组件选择 (1) 核心组件分层设计 Model(LLM驱动层) 生产环境推荐:使用 gpt-4-1106-preview 或 Anthropic Claude 3 等高性能模型,结合 model.with_fallbacks() 实现故障转移(如备用模型或本地模型)。本地部署:选择 Llama3-70B 等开源模型,搭配 Docker 或 …...

ubantu18.04(Hadoop3.1.3)之MapReduce编程

说明&#xff1a;本文图片较多&#xff0c;耐心等待加载。&#xff08;建议用电脑&#xff09; 注意所有打开的文件都要记得保存。 第一步&#xff1a;准备工作 本文是在之前Hadoop搭建完集群环境后继续进行的&#xff0c;因此需要读者完成我之前教程的所有操作。 第二步&…...

PoCL环境搭建

PoCL环境搭建 **一.关键功能与优势****二.设计目的****三.测试步骤**1.创建容器2.安装依赖3.编译安装pocl4.运行OpenCL测试程序 Portable Computing Language (PoCL) 简介 Portable Computing Language (PoCL) 是一个开源的、符合标准的异构计算框架&#xff0c;旨在为 OpenCL…...

关于hadoop和yarn的问题

1.hadoop的三大结构及各自的作用&#xff1f; HDFS&#xff08;Hadoop Distributed File System&#xff09;&#xff1a;分布式文件系统&#xff0c;负责海量数据的存储&#xff0c;具有高容错性和高吞吐量。 MapReduce&#xff1a;分布式计算框架&#xff0c;用于并行处理大…...

软件工程中数据一致性的探讨

软件工程中数据一致性的探讨 引言数据一致性&#xff1a;软件工程中的业务正确性与性能的权衡数据一致性为何重要业务正确性&#xff1a;事务的原子性与一致性ACID原则的基石分布式事务的挑战一致性级别&#xff1a;从强一致到最终一致 实践中的一致性权衡金融系统&#xff1a;…...

在服务器上安装redis

1.安装所需插件gcc 查看gcc版本 gcc -v 没有安装的话,安装命令如下 yum -y install gcc 2.安装 下载安装包 https://download.redis.io/releases/ 将安装包上传到/opt/software目录下 解压安装包 cd /opt/software tar -zxvf redis-6.2.6.tar.gz 编译并安装redis到指…...

如何选择适合您的过程控制器?

在现代工业中&#xff0c;过程控制器是确保生产效率、质量和安全性的关键设备。它们可以精准监测温度、湿度等变量&#xff0c;优化制造流程&#xff0c;减少人工干预&#xff0c;从而降低错误率和运营成本。但您是否清楚&#xff0c;哪种过程控制器更适合您的企业&#xff1f;…...

C#/.NET/.NET Core拾遗补漏合集(25年4月更新)

前言 在这个快速发展的技术世界中&#xff0c;时常会有一些重要的知识点、信息或细节被忽略或遗漏。《C#/.NET/.NET Core拾遗补漏》专栏我们将探讨一些可能被忽略或遗漏的重要知识点、信息或细节&#xff0c;以帮助大家更全面地了解这些技术栈的特性和发展方向。 ✍C#/.NET/.N…...

闲来无事,用HTML+CSS+JS打造一个84键机械键盘模拟器

今天闲来无聊&#xff0c;突发奇想要用前端技术模拟一个机械键盘。说干就干&#xff0c;花了点时间搞出来了这么一个有模有样的84键机械键盘模拟器。来看看效果吧&#xff01; 升级版的模拟器 屏幕录制 2025-04-18 155308 是不是挺像那么回事的&#xff1f;哈哈&#xff01; 它…...

极狐GitLab 项目导入导出设置介绍?

极狐GitLab 是 GitLab 在中国的发行版&#xff0c;关于中文参考文档和资料有&#xff1a; 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 导入导出设置 (BASIC SELF) 导入和导出相关功能的设置。 配置允许的导入源 在从其他系统导入项目之前&#xff0c;必须为该…...

极狐GitLab 项目 API 的速率限制如何设置?

极狐GitLab 是 GitLab 在中国的发行版&#xff0c;关于中文参考文档和资料有&#xff1a; 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 项目 API 的速率限制 (BASIC SELF) 引入于 15.10 版本&#xff0c;功能标志为rate_limit_for_unauthenticated_projects_api_…...

electron 渲染进程按钮创建新window,报BrowserWindow is not a constructor错误;

在 Electron 中&#xff0c;有主进程和渲染进程 主进程&#xff1a;在Node.js环境中运行—意味着能够使用require模块并使用所有Node.js API 渲染进程&#xff1a;每个electron应用都会为每个打开的BrowserWindow&#xff08;与每个网页嵌入&#xff09;生成一个单独的渲染器进…...

【前沿】成像“跨界”测量——扫焦光场成像

01 背景 眼睛是人类认识世界的重要“窗口”&#xff0c;而相机作为眼睛的“延伸”&#xff0c;已经成为生产生活中最常见的工具之一&#xff0c;广泛应用于工业检测、医疗诊断与影音娱乐等领域。传统相机通常以“所见即所得”的方式记录场景&#xff0c;传感器捕捉到的二维图像…...

基于C++(MFC)图形编辑界面工具

MFC 图形编辑界面工具 一、背景 喔&#xff0c;五天的实训终于结束了&#xff0c;学校安排的这次实训课名称叫高级程序设计实训&#xff0c;但在我看来&#xff0c;主要是学习了 Visual C .NET 所提供的 MFC&#xff08;Microsoft Foundation Class)库所提供的类及其功能函数…...

Linux网络通信核心机制解析与层级架构探秘

作为现代操作系统的神经网络&#xff0c;Linux网络通信系统通过多层协作架构实现高效的数据传输机制。本文将从模块化设计、报文处理路径、核心组件交互等多个维度&#xff0c;解析Linux网络通信系统的实现原理与优化策略&#xff0c;并结合内核源码示例与性能调优实践&#xf…...

Tensorflow实现用接口调用模型训练和停止训练功能

语言&#xff1a;Python 框架&#xff1a;Flask、Tensorflow 功能描述&#xff1a;存在两个接口&#xff0c;一个接口实现开始训练模型的功能&#xff0c;一个接口实现停止训练的功能。 实现&#xff1a;用一个全局变量存储在训练中的模型。 # 存储所有训练任务 training_task…...

HTTP测试智能化升级:动态变量管理实战与效能跃迁

在Web应用、API接口测试等领域&#xff0c;测试场景的动态性和复杂性对测试数据的灵活管理提出了极高要求。传统的静态测试数据难以满足多用户并发、参数化请求及响应内容验证等需求。例如&#xff0c;在电商系统性能测试中&#xff0c;若无法动态生成用户ID、订单号或实时提取…...

PyTorch 浮点数精度全景:从 float16/bfloat16 到 float64 及混合精度实战

PyTorch 在深度学习中提供了多种 IEEE 754 二进制浮点格式的支持&#xff0c;包括半精度&#xff08;float16&#xff09;、Brain‑float&#xff08;bfloat16&#xff09;、单精度&#xff08;float32&#xff09;和双精度&#xff08;float64&#xff09;&#xff0c;并通过统…...

《软件设计师》复习笔记(14.2)——统一建模语言UML、事务关系图

目录 1. UML概述 2. UML构造块 (1) 事物&#xff08;Things&#xff09; (2) 关系&#xff08;Relationships&#xff09; 真题示例&#xff1a; 3. UML图分类 (1) 结构图&#xff08;静态&#xff09; (2) 行为图&#xff08;动态&#xff09; 4. 核心UML图详解 5.…...

基于C++(MFC)的细胞识别程序

基于 mfc 的细胞识别程序 一、图像处理课程设计目标 1.1 课题与技术指标 课题&#xff1a;利用图像处理技术设计细胞识别程序。 技术指标&#xff1a; 实验 VS2019 MFC 开发平台待识别图像为 24bit 的真彩色细胞图像进行处理要求识别出细胞&#xff0c;并且保证准确度情况下…...

【前端HTML生成二维码——MQ】

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 前端HTML生成二维码——MQ 前言本文将介绍前端HTML如何更具用户输入的内容生成对应的二维码,附页面代码、实现函数、js脚本。一、自定义显示页面1、效果图二、使用步骤1、引入库2、实现函数3、页面及函数代…...

Spring Boot自动配置原理深度解析:从条件注解到spring.factories

大家好&#xff01;今天我们来深入探讨Spring Boot最神奇的特性之一——自动配置(Auto-configuration)。这个功能让Spring Boot如此受欢迎&#xff0c;因为它大大简化了我们的开发工作。让我们一起来揭开它的神秘面纱吧&#xff01;&#x1f440; &#x1f31f; 什么是自动配置…...

【unity实战】Animator启用root motion根运动动画,实现完美的动画动作匹配

文章目录 前言1、动画分类2、如何使用根位移动画&#xff1f; 一、根位移动画的具体使用1、导入人形模型2、导入动画3、配置动画参数4、配置角色Animator动画状态机5、使用代码控制人物前进后退 二、问题分析三、Humanoid动画中的Root Motion机制及相关配置1、Humanoid动画中的…...

(51单片机)LCD显示数据存储(DS1302时钟模块教学)(LCD1602教程)(独立按键教程)(延时函数教程)(I2C总线认识)(AT24C02认识)

目录 演示视频&#xff1a; 源代码 main.c LCD1602.c LCD1602.h AT24C02.c AT24C02.h Key.c Key.h I2C.c I2C.h Delay.c Delay.h 代码解析与教程&#xff1a; Dealy模块 LCD1602模块 Key模块 I2C总线模块 AT24C02模块 /E2PROM模块 main模块 演示视频&#xff1a; &…...

2d深度预测

Depth anything v1 相对深度估计&#xff0c;要用绝对深度估计需要微调 概要&#xff1a; 1 使用大量的未标注图像信息 2 采用优化策略—数据增强工具(作用在未标注图像) 3 进行辅助监督—继承语义分割知识&#xff08;作用在未标注图像&#xff09; 数据层面&#xff1a; …...

Android12 ServiceManager::addService源码解读

源码 Status ServiceManager::addService(const std::string& name, const sp<IBinder>& binder, bool allowIsolated, int32_t dumpPriority) {auto ctx mAccess->getCallingContext();// apps cannot add servicesif (multiuser_get_app_id(ctx.uid) >…...

【HDFS入门】HDFS性能调优实战:从基准测试到优化策略

目录 引言 1 HDFS性能评估体系 1.1 性能评估体系架构 1.2 基准测试工具对比 2 TestDFSIO基准测试实战 2.1 TestDFSIO工作原理 2.2 测试执行步骤 2.3 结果分析指标 3 TeraSort基准测试实战 3.1 TeraSort测试流程 3.2 测试执行命令 3.3 关键性能指标 4 HDFS性能调优…...

Linux 内核开发/测试工具对比 Windows 驱动验证工具 (Driver Verifier)

Windows 的 Driver Verifier 是一个用于测试和验证驱动程序的强大工具。在 Linux 内核开发中&#xff0c;虽然没有一个完全等价的单一工具&#xff0c;但有多种工具和框架可以提供类似或更专业的功能。 Linux 内核开发和测试工具 1. KASAN (Kernel Address Sanitizer) 功能&…...

通信算法之269 : OFDM信号的循环自相关特性用于无人机图传信号识别

OFDM信号的循环自相关特性是其循环平稳性的核心体现,如下: [相关仿真代码,联系,提供] 一、循环自相关特性来源 ‌循环前缀引入周期性‌ OFDM符号通过添加循环前缀(CP)形成符号周期结构,导致信号具有循环平稳性‌26。每个符号的CP与尾部数据重复,在时延等于FFT长度(N…...

【无人机】电子速度控制器 (ESC) 驱动电机,常见的电调协议,PWM协议,Oneshot协议,DShot协议

目录 1、ESCs & 电机 #1.1、ESC 协议 --ESC Protocols #1.1.1、PWM协议&#xff0c;需要校准 #1.1.2、One Shot 125协议&#xff0c;速率更快 #1.1.3、DShot &#xff0c;减少延迟&#xff0c;无需校准 #1.1.4、无人机CAN 2、PWM 伺服系统和 ESC&#xff08;电机控…...

LeadeRobot具身智能应用标杆:无人机X柔韧具身智能,空中精准作业游刃有余

当前,具身智能已成为全球科技领域的前沿焦点,更受到国家战略级重视,吸引科技产业巨头抢滩布局。但同时,具身智能的商业化路径、规模化应用场景、技术成本等难题也开始在资本界与产业圈引起广泛讨论。 目前,万勋科技基于Pliabot 柔韧技术已推出多款具身智能柔韧机器人产品,在柔…...

WebSocket:实现实时双向通信的技术

WebSocket是一种网络通信协议&#xff0c;它在单个TCP连接上提供全双工通信。WebSocket协议在2011年被IETF&#xff08;互联网工程任务组&#xff09;标准化为RFC 6455&#xff0c;并由W3C&#xff08;万维网联盟&#xff09;制定了WebSocket API标准&#xff0c;使得客户端&am…...

探索 HumanoidBench:类人机器人学习的新平台

在科技飞速发展的当下&#xff0c;类人机器人逐渐走进我们的视野&#xff0c;它们有着和人类相似的外形&#xff0c;看起来能像人类一样在各种环境里完成复杂任务&#xff0c;潜力巨大。但实际上&#xff0c;让类人机器人真正发挥出实力&#xff0c;还面临着重重挑战。 这篇文…...

「数据可视化 D3系列」入门第十一章:力导向图深度解析与实现

D3.js 力导向图深度解析与实现 力导向图核心概念 力导向图是一种通过物理模拟来展示复杂关系网络的图表类型&#xff0c;特别适合表现社交网络、知识图谱、系统拓扑等关系型数据。其核心原理是通过模拟粒子间的物理作用力&#xff08;电荷斥力、弹簧引力等&#xff09;自动计…...

「数据可视化 D3系列」入门第八章:动画效果详解(让图表动起来)

动画效果详解 一、D3.js动画核心API1. d3.transition()2. transition.duration()3. transition.delay()4. 其他重要API 二、动画实现原理三、完整动画示例解析1. 柱状图生长动画2. 文本跟随动画 四、动画效果优化技巧1. 缓动函数选择&#xff1a;2. 组合动画&#xff1a;3. 动画…...

index: 自动化浏览器智能体

GitHub&#xff1a;https://github.com/lmnr-ai/index 更多AI开源软件&#xff1a;https://www.aiinn.cn/ 在做浏览器自动化脚本时&#xff0c;我们常常需要编写大量代码来处理复杂的网页交互&#xff0c;不仅耗时耗力&#xff0c;还难以调试和优化&#xff0c;要是出错更是难以…...

网页端调用本地应用打开本地文件(PDF、Word、excel、PPT)

一、背景原因 根据浏览器的安全策略&#xff0c;在网页端无法直接打开本地文件&#xff0c;所以需要开发者曲线救国。 二、实现步骤 前期准备&#xff1a; 确保已安装好可以打开文件的应用软件&#xff0c;如&#xff0c;WPS&#xff1b; 把要打开的文件统一放在一个文件夹&am…...

如何批量在多个 Word 文档末尾添加广告页面

Word是我们日常使用非常频繁的文档编辑软件&#xff0c;凭借其强大的文本处理功能&#xff0c;如文字输入、格式设置、段落排版、图片插入等&#xff0c;可以帮助我们轻松创建专业且美观的文档。不过呢当我们需要将这些文档分享给他人时&#xff0c;往往需要在每个文档的末尾添…...

JavaScript原生实现简单虚拟列表

旧笔记&#xff0c;最近使用时做了点新优化&#xff0c;之前只发在了个人博客上 地址&#xff1a;JavaScript原生实现简单虚拟列表 背景 在公司项目中&#xff0c;需要给商品配置大量的属性值&#xff0c;可能其中一个属性的值数量就有成百上千条。 一个商品会有很多属性&…...

安心联车辆管理平台应用前景分析

安心联车辆管理平台凭借其技术创新与行业适配能力&#xff0c;展现出广阔的应用前景。以下从技术驱动、行业覆盖、实际效益、市场策略及未来潜力五个维度进行分析&#xff1a; 一、技术驱动的核心竞争力 高精度定位与多传感器融合 安心联采用北斗/GPS双模定位技术&#xff0c;实…...

力扣每日打卡 2176. 统计数组中相等且可以被整除的数对(简单)

力扣 2176. 统计数组中相等且可以被整除的数对 简单 前言一、题目内容二、解题方法1. 暴力解法2.官方题解官方也是暴力解法 前言 这是刷算法题的第十三天&#xff0c;用到的语言是JS 题目&#xff1a;力扣 2176. 统计数组中相等且可以被整除的数对(简单) 一、题目内容 给你一…...

OpenStack Yoga版安装笔记(22)Swift笔记20250418

一、官方文档 https://docs.openstack.org/swift/yoga/admin/objectstorage-components.html#https://docs.openstack.org/swift/yoga/admin/objectstorage-components.html# 二、对象存储简介&#xff08;Introduction to Object Storage&#xff09; OpenStack 对象存储&a…...

Linux 线程互斥

目录 Linux线程互斥 进程线程间的互斥相关背景概念 互斥量的接口 初始化互斥量 互斥量加锁和解锁 锁的封装 ​编辑 互斥量加锁的非阻塞版本 互斥量实现原理探究 可重入VS线程安全 概念 常见的线程不安全的情况 常见的线程安全的情况 常见的不可重入的情况 常见的…...

webgl入门实例-12WebGL 投影矩阵 (Projection Matrix)基本概念

WebGL 投影矩阵 (Projection Matrix) 投影矩阵是将3D场景从视图空间(相机空间)转换到裁剪空间的关键矩阵&#xff0c;它决定了3D物体如何投影到2D屏幕上。 投影矩阵的作用 定义3D空间到2D平面的映射方式确定视景体(view frustum)的形状和范围实现透视效果(近大远小)或正交投…...

《实战AI智能体》——邮件转工单的AI自动化

💡 为什么使用 邮件转工单(AI自动化)模板 想象一下,您的邮箱像是一个繁忙的宇宙港口,每封邮件都是一艘载着信息的飞船。当这些飞船抵达时,我们的自动化系统就像是一位高效的宇宙调度员,迅速将每艘飞船(邮件)转化为一艘艘探索号(工单),并为它们分配勇敢的宇航员(…...