阿语python4-2 美多商城v5.0用户登录-账号登录之第4.1.5节判断用户是否登录

判断用户是否登录

1. 展示用户中心界面

class UserInfoView(View):
    """用户中心"""

    def get(self, request):
        """提供个人信息界面"""
        return render(request, 'user_center_info.html')

需求:

  • 当用户登录后,才能访问用户中心。

  • 如果用户未登录,就不允许访问用户中心,将用户引导到登录界面。

实现方案:

  • 需要判断用户是否登录。

  • 根据是否登录的结果,决定用户是否可以访问用户中心。

2. is_authenticate 判断用户是否登录

介绍:

  • Django用户认证系统提供了方法request.user.is_authenticated()来判断用户是否登录。

  • 如果通过登录验证则返回True。反之,返回False。

  • 缺点:登录验证逻辑很多地方都需要,所以该代码需要重复编码好多次。

class UserInfoView(View):
    """用户中心"""

    def get(self, request):
        """提供个人信息界面"""
        if request.user.is_authenticated():
            return render(request, 'user_center_info.html')
        else:
            return redirect(reverse('users:login'))

3. login_required装饰器 判断用户是否登录

  • Django用户认证系统提供了装饰器login_required来判断用户是否登录。

    • 内部封装了is_authenticate

    • 位置:django.contrib.auth.decorators

  • 如果通过登录验证则进入到视图内部,执行视图逻辑。

  • 如果未通过登录验证则被重定向到LOGIN_URL配置项指定的地址。

    • 如下配置:表示当用户未通过登录验证时,将用户重定向到登录页面。

      LOGIN_URL = '/login/'
      

1.装饰as_view()方法返回值

提示:

  • login_required装饰器可以直接装饰函数视图,但是本项目使用的是类视图。

  • as_view()方法的返回值就是将类视图转成的函数视图。

结论:

  • 要想使用login_required装饰器装饰类视图,可以间接的装饰as_view()方法的返回值,以达到预期效果。

url(r'^info/$', login_required(views.UserInfoView.as_view()), name='info'),
class UserInfoView(View):
    """用户中心"""

    def get(self, request):
        """提供个人信息界面"""
        return render(request, 'user_center_info.html')

2.定义View子类封装login_required装饰器

  • 提示:LoginRequired(object)依赖于视图类View,复用性很差。

url(r'^info/$', views.UserInfoView.as_view(), name='info'),
class LoginRequired(View):
  """验证用户是否登陆"""

  @classmethod
  def as_view(cls, **initkwargs):
      # 自定义as_view()方法中,调用父类的as_view()方法
      view = super().as_view()
      return login_required(view)


class UserInfoView(LoginRequired):
    """用户中心"""

    def get(self, request):
        """提供个人信息界面"""
        return render(request, 'user_center_info.html')

3.定义obejct子类封装login_required装饰器

  • 提示:LoginRequired(object)不依赖于任何视图类,复用性更强。

url(r'^info/$', views.UserInfoView.as_view(), name='info'),
class LoginRequired(object):
  """验证用户是否登陆"""

  @classmethod
  def as_view(cls, **initkwargs):
      # 自定义as_view()方法中,调用父类的as_view()方法
      view = super().as_view()
      return login_required(view)


class UserInfoView(LoginRequired, View):
    """用户中心"""

    def get(self, request):
        """提供个人信息界面"""
        return render(request, 'user_center_info.html')

4.定义验证用户是否登录扩展类

  • 提示:定义扩展类方便项目中导入和使用(meiduo_mall.utils.views.py)

class LoginRequiredMixin(object):
  """验证用户是否登录扩展类"""

  @classmethod
  def as_view(cls, **initkwargs):
      # 自定义的as_view()方法中,调用父类的as_view()方法
      view = super().as_view()
      return login_required(view)
 class UserInfoView(LoginRequiredMixin, View):
    """用户中心"""

    def get(self, request):
        """提供个人信息界面"""
        return render(request, 'user_center_info.html')

4. 登录时next参数的使用

1.next参数的效果

http://127.0.0.1:8000/login/?next=/info/

2.next参数的作用

  • 由Django用户认证系统提供,搭配login_required装饰器使用。

  • 记录了用户未登录时访问的地址信息,可以帮助我们实现在用户登录成功后直接进入未登录时访问的地址。

# 响应登录结果
next = request.GET.get('next')
if next:
    response = redirect(next)
else:
    response = redirect(reverse('contents:index'))

5. 知识要点

  1. 判断用户是否登录依然使用状态保持信息实现。

  2. 项目中很多接口都是需要用户登录才能访问的,所以为了方便编码,我们将判断用户登录的操作封装到装饰器中。

  3. 登录时next参数的作用是为了方便用户从哪里进入到登录页面,登录成功后就回到哪里。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
基于 Django 的前后端分离可以使用 Django Rest Framework(DRF)来实现。DRF 是 Django 的一个扩展,提供了一整套用于构建 Web API 的工具和框架,可以让我们轻松地将 Django 应用程序转换为 Web API 服务。 下面是实现步骤: 1.安装 Django 和 DRF: ``` pip install django pip install djangorestframework ``` 2.创建一个 Django 项目和应用程序: ``` django-admin startproject myproject cd myproject python manage.py startapp myapp ``` 3.在应用程序的 models.py 中定义用户模型,并使用 Django 自带的用户认证系统(或自定义认证系统): ```python from django.contrib.auth.models import AbstractUser class User(AbstractUser): pass ``` 4.在应用程序的 serializers.py 中定义用户序列化器以便将用户模型转换为 JSON 格式: ```python from rest_framework import serializers from myapp.models import User class UserSerializer(serializers.ModelSerializer): class Meta: model = User fields = ('id', 'username', 'email') ``` 5.在应用程序的 views.py 中定义用户视图,使用 DRF 提供的视图类来处理 HTTP 请求: ```python from rest_framework import generics from myapp.models import User from myapp.serializers import UserSerializer class UserList(generics.ListCreateAPIView): queryset = User.objects.all() serializer_class = UserSerializer class UserDetail(generics.RetrieveUpdateDestroyAPIView): queryset = User.objects.all() serializer_class = UserSerializer ``` 6.在应用程序的 urls.py 中定义用户 URL,指向用户视图: ```python from django.urls import path from myapp.views import UserList, UserDetail urlpatterns = [ path('users/', UserList.as_view()), path('users/<int:pk>/', UserDetail.as_view()), ] ``` 7.在前端页面中发送 HTTP 请求到后端 URL,获取用户数据: ```javascript // 使用 jQuery 或其他库发送 HTTP GET 请求 $.ajax({ url: '/api/users/', type: 'GET', dataType: 'json', success: function(data) { // 处理返回的用户数据 console.log(data); }, error: function(xhr, status, error) { // 处理错误 console.error(error); } }); ``` 8.在前端页面中使用 AJAX 技术将表单数据发送到后端 URL,进行用户登录: ```javascript // 使用 jQuery 或其他库发送 HTTP POST 请求 $.ajax({ url: '/api/login/', type: 'POST', dataType: 'json', data: { username: $('#username').val(), password: $('#password').val() }, success: function(data) { // 处理返回的用户数据 console.log(data); }, error: function(xhr, status, error) { // 处理错误 console.error(error); } }); ``` 以上就是基于 Django 的前后端分离实现用户登录的一般步骤。具体实现可能因项目需求而异,需要根据实际情况进行调整和优化。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zz77244920

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值