Django DRF 登录、注册、分页后端功能实现

DRF框架简介

  • drf是django框架的一个插件,所以要先安装django;
  • 安装命令:pip3 install djangorestframework
  • 使用drf时,要在settings中注册

1、注册功能

– 实例 --在生活中的实例

在这里插入图片描述

  • 创建模型 用于注册和登录使用
# 在 model.py 中创建模型(表)  以User为例
from django.db import models

class User(models.Model):
    username = models.CharField(max_length=32)
    password = models.CharField(max_length=128, default=True)

    def __str__(self):     
        return self.username

    class Meta:
        db_table = 'user'
  • 创建序列化器

    在自建 app下创建serializer.py 文件,写序列化工具 使用ModelSerializer

from rest_framework import serializers
from .models import User

class UserModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = '__all__'
  • 功能实现
from django.contrib.auth.hashers import make_password
from rest_framework.views import APIView
from rest_framework.response import Response

from .serializers import UserModelSerializer
from .models import User

class RegisterView(APIView):
    def post(self, request):
        username = request.data.get('username')
        password1 = request.data.get('password1')
        password2 = request.data.get('password2')
        if User.objects.filter(username=username):
            return Response({'msg': '该用户已注册!', 'code': 400})
        else:
            if password1 == password2:
                user_data = {'username': username, 'password': make_password(password1)}
                user_serializer = UserModelSerializer(data=user_data)
                if user_serializer.is_valid():
                    user_serializer.save()
                    return Response({'msg': '注册成功!', 'code': 200})
                else:
                    return Response({'msg': user_serializer.errors, 'code': 400})
            else:
                return Response({'msg': '两次密码不一致!', 'code': 400})

完成上面的操作之后,配置路由查看效果!!!

2、登录功能

使用上面的序列化器 和 模型 !!!

登录

  • 功能实现
# 在views.py 中写功能  登录成功后带的参数用于状态保持
from rest_framework.views import APIView
from rest_framework.response import Response

from django.contrib.auth.hashers import check_password

from .models import User

class LoginView(APIView):
    def post(self, request):
        username = request.POST.get('username')
        password = request.POST.get('password')
        user = User.objects.filter(username=username).first()
        if user and check_password(password, user.password):
            return Response({'msg': '登录成功', 'code': 200, 'user_id': user.id})
        else:
            return Response({'msg': '登录失败', 'code': 400})

完成上面的操作之后,配置路由查看效果!!!

3、分页功能

  • 创建模型

以新闻为例 可以创建一对多,多对多模型,此处以单标为例!

from django.db import models

class News(models.Model):
    title = models.CharField(max_length=64)
    context = models.TextField()
    stars = models.IntegerField()

    def __str__(self):
        return self.title

    class Meta:
        db_table = 'news'
  • 创建序列化器
class NewsModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = News
        fields = '__all__'
  • 后端代码
from rest_framework.views import APIView
from rest_framework.response import Response

from django.core.paginator import Paginator

from .serializers import NewsModelSerializer
from .models import News


class NewsPage(APIView):
    """分页"""

    def get(self, request):
        # 获取当前页
        current_page = request.query_params.get('current_page')
        # 获取每页显示的数量
        page_size = request.query_params.get('page_size')
        # 获取所有的数据
        news_list = News.objects.all()
        # 实例化分页器
        paginotor = Paginator(news_list, page_size)
        # 获取当前页的数据
        paged = paginotor.page(current_page)
        # 序列化
        news_serializer = NewsModelSerializer(paged, many=True)
        # 返回数据
        return Response({
            'data': news_serializer.data,
            'page_list': [i for i in paginotor.page_range],
            'page_sum': paginotor.num_pages

接口地址:http://127.0.0.1:8000/app01/news/

请求方法:GET

请求参数:current_page(当前页) page_size(每页展示几条数据)

  • 前端代码 vue 工具:WebStorm
<template>
  <div>
    <h3 class="t1">新闻展示页面</h3>
    <hr class="t1">
    <table class="t1">
      <tr>
        <td>新闻编号</td>
        <td>新闻标题</td>
        <td>新闻内容</td>
        <td>新闻点赞</td>
      </tr>
      <tr v-for="item in news_list">
        <td>{{item.id}}</td>
        <td>
          <!--  点击跳转详情页  -->
          <router-link :to="{name:'NewsDetail',query:{'news_id':item.id}}">{{item.title}}</router-link>
        </td>
        <td>{{item.context}}</td>
        <td>{{item.stars + '人'}}</td>
      </tr>
      <tr>
        <td colspan="5" class="td1"></td>
      </tr>
      <tr>
        <td colspan="5">
          <button @click="upPage">上一页</button>
          <button v-for="item in page_list" @click="jump(item)">{{item}}</button>
          <button @click="downPage">下一页</button>
        </td>
      </tr>
    </table>
  </div>
</template>

<script>
  import axios from 'axios'

  export default {
    data() {
      return {
        current_page: 1,
        page_size: 2,
        news_list: [],
        page_list: []
      }
    },
    methods: {
      // 上一页
      upPage() {
        if (this.current_page > 1) {
          this.current_page--
          this.getnews()
        }
      },
      // 下一页
      downPage() {
        if (this.current_page < this.page_list.length) {
          this.current_page++
          this.getnews()
        }
      },
      // 点击跳转
      jump(page) {
        this.current_page = page
        this.getnews()
      },
      getnews() {
        this.axios({
          url: 'app01/newspage/',
          params: {'current_page': this.current_page, 'page_size': this.page_size}
        }).then(res => {
          this.news_list = res.data.data
          console.log(this.news_list)
          this.page_list = res.data.page_list
        })
      }
    },
    created() {
      this.getnews()
    }
  }
</script>

<style scoped>
  .t1 {
    margin: 15px auto;
    width: 80%;
    text-align: center;
  }

  .td1 {
    height: 40px;
  }

</style>

  • 前端点击跳转详情页
<router-link :to="{name:'NewsDetail',query:{'news_id':item.id}}">
<-- 跳转至详情页之后,获取路由中的参数 --!>
news_id = this.$route.query.news_id 

使用axios 请求后端的数据(详情数据)

  • 后端功能
from rest_framework.views import APIView
from rest_framework.response import Response

from .serializers import NewsModelSerializer
from .models import News
	
class NewsView(APIView):
   """获取详情页面"""
    def get(self, request):
        news_id = request.query_params.get('news_id')
        news_obj = News.objects.filter(pk=news_id)
        news_serializer = NewsModelSerializer(news_obj, many=True)
        return Response(news_serializer.data)

4、删除功能

5、修改功能

6、前端状态保持

京东\淘宝

用户名+密码 先登录 + token user_id

<-- 传入需要保持的数据 --!>
localStorage.setItem('user_id', res.data.user_id) 

4、删除功能

5、修改功能

6、前端状态保持

京东、淘宝等网站都需要!!!

用户名+密码 先登录 + token user_id

<-- 传入需要保持的数据 --!>
localStorage.setItem('user_id', res.data.user_id) 
关注我 明天完善删除和修改功能!!!感谢支持,留下一间三连呗 么么哒~
  • 7
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
Django是一个基于Python的Web开发框架,而D REST Framework(简称DRF)是Django的一个扩展,用于构建RESTful API。下面是关于Django DRF用户登录注册和修改密码的简要介绍: 1. 用户注册: - 创建一个用户注册的API视图,可以使用DRF提供的`APIView`或者`ViewSet`。 - 在该视图中,接收用户提交的注册信息,如用户名、密码等。 - 对接收到的信息进行验证和处理,例如检查用户名是否已存在,对密码进行加密等。 - 创建用户对象并保存到数据库中。 2. 用户登录: - 创建一个用户登录的API视图,同样可以使用DRF提供的`APIView`或者`ViewSet`。 - 在该视图中,接收用户提交的登录信息,如用户名和密码。 - 对接收到的信息进行验证,例如检查用户名和密码是否匹配。 - 如果验证通过,可以生成并返回一个认证Token给客户端,用于后续的身份验证。 3. 修改密码: - 创建一个修改密码的API视图,同样可以使用DRF提供的`APIView`或者`ViewSet`。 - 在该视图中,需要验证用户的身份,通常可以使用Token认证或Session认证。 - 接收用户提交的旧密码和新密码。 - 验证旧密码是否正确,并对新密码进行加密处理。 - 更新用户对象中的密码字段,并保存到数据库中。 以上是关于Django DRF用户登录注册和修改密码的简要介绍。如果你需要更详细的代码实现或者其他相关问题,请告诉我。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

楼下安同学

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

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

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

打赏作者

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

抵扣说明:

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

余额充值