深入Django:用戶認證與權限控制實戰指南


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

image

第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應用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章