深入Django:用户认证与权限控制实战指南

news2024/10/3 18:22:56

title: 深入Django:用户认证与权限控制实战指南
date: 2024/5/7 18:50:33
updated: 2024/5/7 18:50:33
categories:

  • 后端开发

tags:

  • Auth
  • Decorators
  • Permissions
  • Guardian
  • RESTAuth
  • SessionMgmt
  • MFA

在这里插入图片描述

第1章:入门Django与设置

1.1 Django安装与环境配置

在开始使用Django之前,需要确保已经安装了Python环境。在安装好Python后,可以使用以下命令安装Django:

pip install Django

确保已安装Django后,可以使用以下命令检查版本:

django-admin --version

1.2 创建第一个Django项目和应用

创建一个新的Django项目:

django-admin startproject myproject

进入项目目录:

cd myproject

创建一个新的Django应用:

python manage.py startapp myapp

1.3 设置基础用户模型

Django默认提供一个基本的用户模型,如果需要定制用户模型,可以在myproject/settings.py中进行设置。

例如,可以添加一个新的字段age

# myproject/settings.py

AUTH_USER_MODEL = 'myapp.NewUser'

# myapp/models.py

from django.contrib.auth.models import AbstractUser
from django.db import models


class NewUser(AbstractUser):
    age = models.PositiveIntegerField(null=True, blank=True)

    def __str__(self):
        return f'{self.username} ({self.email})'

在数据库迁移中应用新的用户模型:

python manage.py makemigrations
python manage.py migrate

现在,已经完成了基本的Django项目和应用的创建,并设置了一个基础的用户模型。

第2章:Django认证系统

2.1 用户模型详解

在Django中,AUTH_USER_MODEL设置决定了你如何处理用户。默认的用户模型是django.contrib.auth.models.User
,但如你之前设置的,可以创建自定义用户模型。例如,NewUser模型需要继承AbstractUser,并包含username,email, 和age等字段。

2.2 用户注册、登录与验证

  • 注册:Django的UserCreationFormUserChangeForm可以用于用户注册,通常在myapp/forms.py中定义。在views.py
    中使用UserCreationForm.as_view()创建视图。
from django.contrib.auth import get_user_model
from django.urls import reverse_lazy
from django.views import generic


class RegisterView(generic.CreateView):
    form_class = get_user_model().forms.UserCreationForm
    success_url = reverse_lazy('login')
    template_name = 'registration/register.html'
  • 登录LoginViewLogoutViewdjango.contrib.auth.views中,使用LoginView.as_view()LogoutView.as_view()
from django.contrib.auth.views import LoginView, LogoutView


class CustomLoginView(LoginView):
    template_name = 'registration/login.html'
  • 验证:用户登录后,Django会自动验证用户。在views.py中,你可以使用@login_required装饰器确保只有登录用户才能访问某些视图。
from django.contrib.auth.decorators import login_required


@login_required
def protected_view(request):
    # 只有已登录用户可以访问的视图
    ...

2.3 自定义认证视图和URL

要自定义登录或注册视图,可以创建一个类视图并定义getpost方法。在urls.py中,使用path来映射URL到这些视图。

from django.urls import path

from .views import CustomLoginView, CustomRegisterView

urlpatterns = [
    path('login/', CustomLoginView.as_view(), name='login'),
    path('register/', CustomRegisterView.as_view(), name='register'),
]

2.4 CSRF保护

Django的CSRF(跨站请求伪造)保护是通过在表单中添加一个隐藏的CSRF
token来实现的。确保在所有需要用户交互的表单(如注册和登录表单)中使用{% csrf_token %}模板标签。

此外,你可以在settings.py中启用CSRF保护:

CSRF_COOKIE_NAME = 'my_custom_cookie_name'
CSRF_COOKIE_SECURE = True
CSRF_COOKIE_HTTPONLY = True

这将确保CSRF令牌的安全传输。

第3章:认证中间件和信号

3.1 中间件在认证中的作用

认证中间件

AD:首页 | 一个覆盖广泛主题工具的高效在线平台
是Django提供的一种处理请求和响应的机制,它位于视图函数之前和之后。在认证中,django.contrib.auth.middleware.AuthenticationMiddleware
负责检测请求是否已通过身份验证。如果用户未登录,中间件会重定向到登录页面。一旦用户登录,中间件会设置request.user
,使得视图可以访问用户信息。

3.2 用户登录状态管理

Django的认证系统会在用户登录后自动设置request.user,这使得在视图中可以通过request.user
访问用户信息。但如果你想在会话之外存储用户状态(例如,记住用户名),可以使用
AD:专业搜索引擎
django.contrib.auth.middleware.SessionAuthenticationMiddleware
,它会将用户信息存储在会话中。如果需要自定义登录状态的持久性,可以考虑使用django.contrib.auth.backends.RemoteUserBackend
或创建自己的Backend实现。

3.3 认证信号与事件处理

认证信号是Django的一种通知机制,用于在认证过程中触发特定事件。例如,user_logged_inuser_logged_out
信号分别在用户登录和登出时发送。你可以通过注册接收器来处理这些信号,执行额外的操作,如发送邮件通知或更新用户会话记录。

from django.contrib.auth import get_user_model
from django.dispatch import receiver
from django.db.models.signals import post_save


# 注册接收器
@receiver(post_save, sender=get_user_model())
def create_or_update_user_profile(sender, instance, created, **kwargs):
    if created:
    # 用户创建时,创建用户profile
    else:
# 用户更新时,更新userprofile

通过这种方式,你可以扩展Django认证系统的功能,而无需直接修改核心代码。

第4章:权限系统基础

4.1 Django内置权限模型

Django的权限系统主要依赖于django.contrib.auth.models模块中的以下几个模型:

  • User:表示用户,每个用户都有一个唯一的用户名和密码。
  • Group:用于组织用户,一个用户可以属于多个组。
  • Permission:表示一个操作或资源的权限,例如“管理博客”或“查看文章”。
  • UserPermission(也称为user_has_perm):关联用户和权限,表示用户拥有特定的权限。

4.2 用户角色与权限关联

在Django中,用户和权限通常是通过Group
来关联的。用户可以被添加到一个或多个组中,而组则被赋予了特定的权限。这样,如果一个用户属于某个具有特定权限的组,那么该用户就自动获得了该组的所有权限。通过这种方式,可以实现角色(如管理员、编辑员等)的权限管理。

4.3 分组与权限管理

  • 创建和管理组:使用Group模型,你可以创建新的组,然后将用户添加到组中。例如:
group = Group.objects.create(name='Administrators')
user = User.objects.get(username='john')
group.user_set.add(user)
  • 为组分配权限:使用Permission模型,为组赋予特定的权限,然后将组与这些权限关联起来。例如:
permission = Permission.objects.get(codename='add_article')
group.permissions.add(permission)
  • 检查用户权限:在视图中,可以使用user.has_perm()user.has_module_perms()方法检查用户是否具有特定的权限。
if request.user.has_perm('blog.add_article'):
# 用户有添加文章的权限

通过这种方式,Django的权限系统允许你以灵活的方式管理用户对应用的不同部分的访问。

第5章:自定义权限和验证

5.1 使用@permission_required装饰器

Django提供了一个名为@permission_required的装饰器,用于在视图函数中检查用户是否具有特定权限。例如:

from django.contrib.auth.decorators import permission_required


def some_view(request):
    @permission_required('blog.add_article')
    def inner_view(request):
        # 视图代码,如果用户没有添加文章的权限,将被重定向到登录页面
        ...

    return inner_view(request)

如果用户没有blog.add_article权限,请求会重定向到登录页面,或者根据设置显示一个403 Forbidden错误。

5.2 编写自定义权限类

Django允许你自定义权限类来实现更复杂的权限检查。创建一个继承自BasePermission的类,然后在has_permission方法中定义你的逻辑:

from django.contrib.auth.models import Permission
from django.contrib.auth.base_permissions import BasePermission


class IsSuperAdmin(BasePermission):
    def has_permission(self, request, view):
        # 检查用户是否是超级管理员
        return request.user.is_superuser

然后在视图中使用这个自定义权限:

def some_view(request):
    permission_classes = (IsSuperAdmin,)
    # 使用自定义权限检查
    if not request.user.has_perm(IsSuperAdmin()):
        return HttpResponseForbidden('You are not authorized.')
    ...

5.3 权限验证最佳实践

  • 避免硬编码:不要在代码中硬编码用户的权限检查,而应使用Django的权限系统。
  • 使用装饰器@permission_required装饰器是快速添加权限检查的好工具,但也要注意不要过度使用,可能导致代码难以理解和维护。
  • 权限分离:将权限管理与业务逻辑分离,确保权限检查独立于具体的视图。
  • 使用权限类:自定义权限类可以提供更灵活的权限控制,例如基于角色、用户组或用户属性的权限。
  • 错误处理:对于权限检查失败的情况,提供清晰的错误信息和适当的用户反馈,如重定向到登录页面或显示一个友好的错误消息。

AD:漫画首页
遵循这些最佳实践,可以确保你的权限系统既安全又易于管理。

第6章:权限管理框架(如django-guardian)

6.1 django-guardian的介绍

django-guardian是一个Django应用,用于在Django项目中实现更细粒度的权限控制。django-guardian允许你将权限授予单个对象,而不仅仅是对整个模型的访问权限。

6.2 细化权限控制

django-guardian为你提供了一种在Django中实现更细粒度的权限控制的方法。django-guardian的核心是ObjectPermission
模型,用于将权限与单个对象关联。

django-guardian允许你:

  • 为单个对象设置和管理权限。
  • 对对象进行精细的权限控制。
  • 在视图中进行简单的权限检查。

6.3 实例演示

首先,安装django-guardian:

pip install django-guardian

在你的Django项目中,添加'guardian'INSTALLED_APPS中,并在MIDDLEWARE
中添加'guardian.middleware.UpdatePermissionsMiddleware'

接下来,让我们创建一个简单的应用,并在其中使用django-guardian:

  1. 创建一个名为articles的应用:

    python manage.py startapp articles
    
  2. articles应用中,创建一个名为models.py的文件,并添加以下代码:

    from django.db import models
    from django.contrib.auth.models import User
    from guardian.shortcuts import assign_perm, get_objects_for_user
    
    class Article(models.Model):
        title = models.CharField(max_length=100)
        content = models.TextField()
        author = models.ForeignKey(User, on_delete=models.CASCADE)
    
        def __str__(self):
            return self.title
    
  3. articles应用中,创建一个名为views.py的文件,并添加以下代码:

    from django.shortcuts import render, get_object_or_404
    from django.contrib.auth.decorators import login_required
    from django.http import HttpResponseForbidden
    from articles.models import Article, assign_perm, get_objects_for_user
    
    @login_required
    def article_list(request):
        user = request.user
        articles = get_objects_for_user(user, 'articles.view_article', klass=Article)
        return render(request, 'articles/article_list.html', {'articles': articles})
    
    @login_required
    def assign_article_permissions(request, article_id):
        user = request.user
        article = get_object_or_404(Article, id=article_id)
        if request.method == 'POST':
            if user.has_perm('articles.change_article', article):
                assign_perm('articles.view_article', user, article)
                return HttpResponse('Assigned view permission.')
            else:
                return HttpResponseForbidden('You do not have the permission to change article.')
        return render(request, 'articles/assign_permissions.html', {'article': article})
    
  4. articles应用中,创建一个名为templates/articles的文件夹,并在其中创建一个名为assign_permissions.html的文件:

    <form method="post">
        {% csrf_token %}
        <input type="submit" value="Assign Permission">
    </form>
    
  5. articles应用中,创建一个名为urls.py的文件,并添加以下代码:

    from django.urls import path
    from . import views
    
    urlpatterns = [
        path('', views.article_list, name='article_list'),
        path('assign_permissions/<int:article_id>/', views.assign_article_permissions, name='assign_permissions'),
    ]
    
  6. 在你的项目中,将articles应用的urls.py添加到主urls.py中:

    from django.contrib import admin
    from django.urls import path, include
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('articles/', include('articles.urls')),
    ]
    

现在,你可以运行你的项目,并在文章列表中查看权限管理的实例。在这个例子中,我们使用django-guardian为每个用户分配了对文章的特定视图权限。

你可以使用django-guardian的assign_permget_objects_for_user
函数来分配和检查权限。在这个例子中,我们使用了一个名为view_article的权限,可以在admin.py中进行定义:

from django.contrib import admin
from django.contrib.auth.models import Permission
from articles.models import Article


class ArticleAdmin(admin.ModelAdmin):
    list_display = ('title', 'author')

    def save_model(self, request, obj, form, change):
        if not obj.pk:
            assign_perm('articles.view_article', request.user, obj)
        obj.save()


admin.site.register(Article, ArticleAdmin)

这样,当你在Django管理界面中创建一个新文章时,将自动为当前用户分配view_article权限。

django-guardian为你提供了一种更细粒度的权限控制方法,可以在Django项目中实现更强大的权限管理。

第7章:视图和模板的权限控制

7.1 在视图中检查权限

在Django中,视图是处理HTTP请求的函数或类。为了在视图中检查用户的权限,可以使用django-guardian提供的has_perm
get_objects_for_user函数。以下是一个基本的视图检查权限的例子:

from django.shortcuts import render, redirect
from django.contrib.auth.decorators import login_required
from guardian.shortcuts import has_perm


@login_required
def some_view(request):
    user = request.user
    article = Article.objects.get(pk=1)  # 假设你有一个名为Article的模型

    # 检查用户是否有查看文章的权限
    if not has_perm('articles.view_article', article, user):
        return HttpResponseForbidden("You don't have permission to view this article.")

    # 如果用户有权限,继续执行
    # ...
    return render(request, 'some_template.html', {'article': article})

在这个例子中,has_perm函数检查用户是否有指定的权限(在这个例子中是articles.view_article)对给定的对象(article)。

7.2 在模板中显示权限相关信息

在模板中,你可能想要显示用户是否具有特定的权限。Django模板语言允许你使用条件语句来检查这些权限。以下是一个简单的例子:

{% if user.has_perm('articles.view_article', article) %}
<p>You have permission to view this article.</p>
{% else %}
<p>You do not have permission to view this article.</p>
{% endif %}

在这个模板片段中,如果用户具有articles.view_article权限,has_perm表达式会返回True,否则返回False,从而决定显示不同的内容。

你也可以在模板中使用get_objects_for_user来获取用户具有特定权限的对象,并根据这些对象的内容进行渲染:

{% if object_list %}
<ul>
    {% for object in object_list %}
    {% if user.has_perm('articles.view', object) %}
    <li>{{ object.title }} (You can view)</li>
    {% else %}
    <li>{{ object.title }} (You cannot view)</li>
    {% endif %}
    {% endfor %}
</ul>
{% else %}
<p>No objects found.</p>
{% endif %}

这样,模板会根据用户的权限动态地显示内容,提供一个用户友好的界面。

第8章:RESTful API的认证与权限

8.1 Django REST framework的认证集成

Django REST
framework提供了多种认证方式,包括基本认证(BasicAuthentication)、令牌认证(TokenAuthentication)和会话认证(SessionAuthentication)等。可以在项目的设置文件中进行配置。以下是一个基本的认证配置示例:

# settings.py

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.BasicAuthentication',
        'rest_framework.authentication.SessionAuthentication',
    )
}

在这个配置中,REST framework将使用基本认证和会话认证来处理API请求。

8.2 API权限控制策略

API权限控制是确保API的安全性和保护数据的重要部分。Django REST
framework提供了多种权限控制策略,包括只读权限(ReadOnly)、对象级权限(ObjectPermissions)和自定义权限类(CustomPermission)等。可以在视图中配置权限控制策略。以下是一个使用对象级权限的视图示例:

from rest_framework import viewsets, permissions

from myapp.models import Article
from myapp.serializers import ArticleSerializer


class ArticleViewSet(viewsets.ModelViewSet):
    queryset = Article.objects.all()
    serializer_class = ArticleSerializer
    permission_classes = [permissions.DjangoModelPermissions]

在这个视图中,我们使用了DjangoModelPermissions,这意味着用户只能访问他们拥有的对象。如果用户试图访问他们不拥有的对象,REST
framework将返回一个403 Forbidden响应。

如果你需要更细粒度的权限控制,可以使用自定义权限类。以下是一个简单的自定义权限类示例:

from rest_framework import permissions


class CustomPermission(permissions.BasePermission):
    def has_object_permission(self, request, view, obj):
        if request.user.is_staff:
            return True
        return False


class ArticleViewSet(viewsets.ModelViewSet):
    queryset = Article.objects.all()
    serializer_class = ArticleSerializer
    permission_classes = [CustomPermission]

在这个示例中,我们创建了一个名为CustomPermission的自定义权限类,它只允许管理员用户访问API。如果用户不是管理员,则返回一个403
Forbidden响应。

总之,Django REST framework为RESTful API的认证和权限控制提供了多种方式和工具,可以根据项目需求进行选择和定制。

第9章:高级主题

9.1 用户会话管理

在Web应用程序中,用户会话管理是非常重要的,它涉及到用户登录、注销和会话状态的管理。Django提供了内置的会话管理功能,而Django
REST framework也提供了相应的支持。通过使用SessionAuthentication认证类,Django REST framework可以与Django的会话管理系统集成,从而实现用户会话管理。

# settings.py

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.SessionAuthentication',
    )
}

通过将SessionAuthentication添加到DEFAULT_AUTHENTICATION_CLASSES中,可以启用基于会话的认证,从而实现用户会话管理。

9.2 客户端认证(OAuth2、JWT等)

客户端认证是指在API请求中对客户端进行身份验证的过程。Django REST framework支持多种客户端认证方式,包括OAuth2和JWT(JSON Web
Token)等。这些认证方式可以通过第三方库来实现,比如djangorestframework-simplejwt用于JWT认证。

以下是一个简单的JWT认证配置示例:

# settings.py

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework_simplejwt.authentication.JWTAuthentication',
    )
}

通过将JWTAuthentication添加到DEFAULT_AUTHENTICATION_CLASSES中,可以启用JWT认证,从而实现客户端认证。

9.3 多因素认证(MFA)

多因素认证是指在用户登录或进行敏感操作时,除了用户名和密码外,还需要提供第二种或多种身份验证因素的过程。Django REST
framework本身并没有内置的多因素认证功能,但可以通过结合第三方库来实现。例如,可以使用django-mfa等库来实现多因素认证功能。

通过使用这些第三方库,可以实现诸如短信验证码、一次性密码(OTP)等多因素认证方式,从而提高系统的安全性。

综上所述,Django REST framework提供了丰富的支持,可以轻松实现用户会话管理、客户端认证和多因素认证等高级主题。开发人员可以根据项目需求选择合适的认证方式,并结合相关的第三方库来实现所需的功能。

第10章:实战项目

建立一个简单的博客系统是一个很好的实战项目,可以涵盖认证与权限控制等方面。下面是一个基本的Django REST
framework博客系统的示例,其中包括了认证与权限控制的应用。

首先,我们需要创建一个Django应用,并定义博客文章的模型、序列化器、视图和URL配置。

# models.py
from django.db import models


class Post(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()
    author = models.ForeignKey('auth.User', on_delete=models.CASCADE)
    created_at = models.DateTimeField(auto_now_add=True)


# serializers.py
from rest_framework import serializers
from .models import Post


class PostSerializer(serializers.ModelSerializer):
    class Meta:
        model = Post
        fields = ['id', 'title', 'content', 'author', 'created_at']


# views.py
from rest_framework import viewsets
from .models import Post
from .serializers import PostSerializer


class PostViewSet(viewsets.ModelViewSet):
    queryset = Post.objects.all()
    serializer_class = PostSerializer


# urls.py
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from .views import PostViewSet

router = DefaultRouter()
router.register(r'posts', PostViewSet)

urlpatterns = [
    path('', include(router.urls)),
]

接下来,我们将添加认证与权限控制。

# settings.py

INSTALLED_APPS = [
    # ...
    'rest_framework',
    'blog',  # assuming 'blog' is the name of the app
]

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.IsAuthenticated',
    ],
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework.authentication.SessionAuthentication',
        'rest_framework.authentication.TokenAuthentication',
    ],
}

在上述代码中,我们将默认权限设置为IsAuthenticated,这意味着只有经过身份验证的用户才能访问API。我们还配置了SessionAuthentication和TokenAuthentication作为默认的认证类,这样用户可以使用会话验证或令牌验证进行身份验证。

最后,我们需要为用户创建博客文章的权限。我们可以使用Django的自定义权限类来实现这一点。

# permissions.py
from rest_framework import permissions


class IsAuthorOrReadOnly(permissions.BasePermission):
    def has_object_permission(self, request, view, obj):
        if request.method in permissions.SAFE_METHODS:
            return True
        return obj.author == request.user

然后,将这个权限类应用到我们的视图中。

# views.py
from rest_framework import viewsets
from .models import Post
from .serializers import PostSerializer
from .permissions import IsAuthorOrReadOnly


class PostViewSet(viewsets.ModelViewSet):
    queryset = Post.objects.all()
    serializer_class = PostSerializer
    permission_classes = [IsAuthorOrReadOnly]

现在,我们已经完成了一个简单的博客系统,并应用了认证与权限控制。用户需要经过身份验证才能访问API,并且只有文章的作者才有权限对文章进行修改或删除。

第11章:最佳实践与高级技巧

性能优化

  1. 数据库优化:使用索引、合理设计数据库结构、避免N+1查询等。
  2. 缓存:使用缓存技术(如Redis、Memcached)缓存频繁访问的数据。
  3. 异步任务:将耗时任务异步化,可以使用Celery等工具。
  4. 代码优化:避免过多的数据库查询、减少不必要的计算、优化算法等。

安全注意事项

  1. 数据加密:对敏感数据进行加密存储。
  2. 防止跨站脚本攻击(XSS) :对用户输入进行过滤和转义。
  3. 防止SQL注入:使用ORM或参数化查询来防止SQL注入攻击。
  4. 权限控制:确保用户只能访问其有权限的资源。
  5. 保持系统更新:定期更新框架、库和操作系统,以修复潜在的安全漏洞。

未来趋势与更新

  1. 微服务架构:将应用拆分为小型的、独立部署的服务。
  2. 容器化:使用Docker等容器技术实现应用的快速部署和扩展。
  3. Serverless架构:无需管理服务器,按需运行代码,降低运维成本。
  4. 人工智能与机器学习:将人工智能技术应用于应用开发中,实现智能化功能。
  5. 持续集成与持续部署:采用CI/CD流程实现快速迭代和交付。

附录

Django官方文档链接

你可以在Django官方文档中找到最新的Django文档,包括教程、API参考和发布说明等。

常见问题解答

  1. Stack Overflow:在Stack Overflow上搜索相关问题,通常能找到解决方案。
  2. Django官方论坛:官方网站上有一个社区论坛,你可以在这里提问和寻求帮助。
  3. GitHub Issues:如果你使用的是开源的Django项目或库,可以在对应的GitHub仓库的Issues中查找或提问问题。

工具和库推荐

  1. Django REST framework:用于构建Web API的强大工具。
  2. Celery:用于处理异步任务和定时任务的分布式任务队列。
  3. Django Debug Toolbar:用于在开发阶段进行性能分析和调试的工具。
  4. Django Channels:为Django引入了实时的、异步的通信协议,用于构建实时应用。
  5. Django Allauth:提供了完整的用户认证和账户管理功能,包括社交账号登录、邮箱验证等。

这些工具和库都是Django社区广泛使用和推荐的,可以帮助你更高效地开发和管理Django应用。

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

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

相关文章

26 JavaScript学习:JSON和void

JSON 英文全称 JavaScript Object NotationJSON 是一种轻量级的数据交换格式。JSON是独立的语言JSON 易于理解。 JSON 实例 简单的 JSON 字符串实例: "{\"name\": \"Alice\", \"age\": 25, \"city\": \"San Francisco\&…

Transformer详解:从放弃到入门(三)

上篇文章中我们了解了多头注意力和位置编码&#xff0c;本文我们继续了解Transformer中剩下的其他组件。 层归一化 层归一化想要解决一个问题&#xff0c;这个问题在Batch Normalization的论文中有详细的描述&#xff0c;即深层网络中内部结点在训练过程中分布的变化问题。  …

最新版Ceph( Reef版本)块存储简单对接k8s

当前ceph 你的ceph集群上执行 1.创建名为k8s-rbd 的存储池 ceph osd pool create k8s-rbd 64 642.初始化 rbd pool init k8s-rbd3 创建k8s访问块设备的认证用户 ceph auth get-or-create client.kubernetes mon profile rbd osd profile rbd pool=k8s-rbd部署 ceph-rbd-csi …

【PCIE】基于PCIE4C的数据传输(四)——使用MSIX中断

基于PCIE4C的数据传输&#xff08;三&#xff09;——遗留中断与MSI中断 一文介绍了遗留中断与MSI中断两种中断方式的代码实现&#xff0c;本文继续基于Xilinx UltrascaleHBM VCU128开发板与linux&#xff08;RHEL8.9&#xff09;&#xff0c;介绍MSIX中断方式的代码实现。本文…

英语新概念2-回译法-lesson12

第一次翻译 &#xff08;稀巴烂&#xff09; Our neiborhood,Capitain Charles Alison,will sail from P. We will ______ in the _. He will sit in his small boat, Topsail,Topsail is a famous boat. It has been across the A many times. Alison will sail at 8 o’cloc…

每日一题(力扣740):删除并获得点数--dp+思维

其实跟打家劫舍没啥区别 排序去重之后去考虑当前位置和前两个位置之间的关系即可&#xff0c;具体见代码&#xff1a; class Solution { public:int deleteAndEarn(vector<int>& nums) {int n nums.size();if (n 1) return nums[0];unordered_map<int, int>…

LLM⊗KG范式下的知识图谱问答实现框架思想阅读

分享一张有趣的图&#xff0c;意思是在分类场景下&#xff0c;使用大模型和fasttext的效果&#xff0c;评论也很逗。 这其实背后的逻辑是&#xff0c;在类别众多的分类场景下&#xff0c;尤其是在标注数据量不缺的情况下&#xff0c;大模型的收益是否能够比有监督模型的收益更多…

multipass和multipassd命令的区别

multipassd通常是multipass服务的后台守护进程&#xff0c;它负责管理和控制虚拟机实例。 命令区别 例&#xff1a; multipass restart my-vm 这个命令用于重启Multipass中的虚拟机实例。例如有一个名为my-vm的虚拟机实例。 multipassd restart 这会重新启动Multipass后台…

Backblaze发布2024 Q1硬盘故障质量报告-1

作为一家在2021年在美国纳斯达克上市的云端备份公司&#xff0c;Backblaze一直保持着对外定期发布HDD和SSD的故障率稳定性质量报告&#xff0c;给大家提供了一份真实应用场景下的稳定性分析参考数据。 截至2024年第一季度末&#xff0c;Backblaze在其全球数据中心的云存储服务器…

欧式聚类提取-------PCL

欧式聚类 std::vector<pcl::PointCloud<pcl::PointXYZ>::Ptr> PclTool::euclideanClustering(const pcl::PointCloud<pcl::PointXYZ>::Ptr& cloud) {std::vector<pcl::PointCloud<pcl::PointXYZ>::Ptr> clustered_clouds;// 下采样pcl::Vox…

Eplan带你做项目——如何实现项目的交付

前言 Eplan作为一款专业的电气工程设计软件&#xff0c;不仅在设计阶段为电气工程师提供了强大的绘图、计算、仿真等功能&#xff0c;还具备丰富的数据管理与交换能力&#xff0c;能够便捷、准确地导出软件设计、生产制造所需的数据&#xff0c;实现电气设计与软件设计、生产制…

领鸡蛋游戏养鸡游戏淘宝客源码广告联盟功能介绍

领鸡蛋游戏功能介绍 核心功能 用户鸡蛋数量 玩家在游戏中会累积一定数量的鸡蛋&#xff0c;这些鸡蛋可以通过完成任务、签到、邀请好友等方式获得。鸡蛋数量直接关联到玩家的游戏进度和奖励。足迹 足迹功能展示用户的饲料明细&#xff0c;包括饲料的获取方式、数量以及时间等…

好用的win10电脑桌面便利贴,桌面便签小工具

在日常办公中&#xff0c;我们经常需要记录重要事项、提醒任务或者临时想法。这时&#xff0c;一款好用的电脑桌面便签或便利贴小工具就显得尤为重要。它们能够帮助我们高效地管理信息&#xff0c;提升工作效率。 那么好用的win10电脑桌面便利贴是哪个呢&#xff1f;电脑桌面便…

品深茶的抗癌功能是否涉及虚假宣传?

品深茶说到底&#xff0c;本质还是中国传统茶叶&#xff0c;茶叶本就是一种含有多种成分的饮品&#xff0c;包括茶多酚、生物碱、氨基酸、有机酸等。这些成分对人体有一定的益处&#xff0c;如抗氧化、抗炎、抗菌等作用。 一些研究表明&#xff0c;茶叶中的某些成分如茶多酚、…

通过 Java 操作 redis -- String 基本命令

关于 redis String 类型的相关命令推荐看 Redis - String 字符串 要想通过 Java 操作 redis&#xff0c;首先要连接上 redis 服务器&#xff0c;推荐看通过 Java 操作 redis -- 连接 redis 本博客只介绍了一小部分常用的命令&#xff0c;其他的命令根据上面推荐的博客也能很简单…

《Fundamentals of Power Electronics》——示例:Buck-Boost转换器模型变为正则形式

为了说明正则电路模型推导的步骤&#xff0c;让我们将buck-boost转换器的等效电路操作成规范形式。buck-boost转换器的一个小信号交流等效电路如下图所示。 为了将上图所示网络转换成正则形式&#xff0c;需要将所有独立源d(t)转换到左侧&#xff0c;而将所有电感转换到右侧与变…

⚡REST 和 SOAP 协议有什么区别?

原文链接&#xff1a;https://document360.com/blog/rest-vs-soap/ API 是应用程序编程接口&#xff08;Application Programming Interface&#xff09;的缩写。API 规定了不同的软件组件应如何以编程方式进行交互和通信。 最常见的 API 类型就是 Web API。网络应用&#xff…

开源go实现的iot物联网新基建平台

软件介绍 Magistrala IoT平台是由Abstract Machines公司开发的创新基础设施解决方案&#xff0c;旨在帮助组织和开发者构建安全、可扩展和创新的物联网应用程序。曾经被称为Mainflux的平台&#xff0c;现在已经开源&#xff0c;并在国际物联网领域受到广泛关注。 功能描述 多协…

25-ESP32-S3 内置的真随机数发生器(RNG)

ESP32-S3 内置的真随机数发生器&#xff08;RNG&#xff09;&#x1f60e; 引言 &#x1f4da; 在许多应用中&#xff0c;随机数发生器&#xff08;RNG&#xff09;是必不可少的。无论是在密码学&#x1f512;、游戏&#x1f3ae;、模拟&#x1f9ea;或其他领域&#xff0c;随…

北邮22级信通院DSP:实验三(1):FFT变换、IFFT变换(附每步8点变换蝶形图)保姆级讲解+用C++程序实现复数域的FFT变换和IFFT变换

北邮22信通一枚~ 跟随课程进度更新北邮信通院DSP的笔记、代码和文章&#xff0c;欢迎关注~ 获取更多文章&#xff0c;请访问专栏&#xff1a; 北邮22级信通院DSP_青山入墨雨如画的博客-CSDN博客 目录 一、预备知识 1.1 FFT算法 1.2.1由DFT到FFT 1.2.2 基2时域抽选算法 …