首页 > 其他分享 >注册功能接口

注册功能接口

时间:2023-06-28 22:22:11浏览次数:35  
标签:功能 code self 接口 attrs 注册 序列化 create serializer

[tov]

注册功能

# 前端传入的数据
	{手机号,验证码,密码}
# 后端要验证数据--->序列化类

#遇到的错误
	1 注册使用哪个序列化了:get_serializer_class
    2 配置文件中debug必须是True,因为咱们有万能验证码--->正常流程这个不需要
    3 把code,弹出来,加入用户名,你可以随机生成用户名
    4 重写create(可以不重写,把密码设为加密的密码),create_user
    5 如果你继承了CreateModelMixin,一定要注意,它会走序列化,所以code字段是只写的

视图类

重写get_serializer_class

class UserView(GenericViewSet, CreateModelMixin):
    serializer_class = LoginUserSerializer
    def get_serializer_class(self):
        if self.action == 'sms_login':
            return LoginUserSMSSerializer
        elif self.action == 'register' or self.action == 'create':
            return UserRegisterSerializer
        else:
            # return super().get_serializer_class()
            return self.serializer_class

方式一:自己写接口

    @action(methods=['POST'], detail=False)
    # 注册接口
    # 自己写的  访问:127.0.0.1:8000/api/v1/user/userinfo/register/   --->post请求即可
    def register(self,  request, *args, **kwargs):
        ser = self.get_serializer(data=request.data)
        ser.is_valid(raise_exception=True)
        ser.save()
        return APIResponse(mag='注册成功')

方式二:继承CreateModelMixin

class UserView(GenericViewSet, CreateModelMixin):
# 访问:127.0.0.1:8000/api/v1/user/userinfo/ --->post请求
# 这样调用Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
# 只要调用serializer.data ,就会走序列化,只要走序列化,会把create返回的user对象 来使用UserRegisterSerializer类做序列化
# 就需要在序列化类中code加write_only
code = serializers.CharField(max_length=4, min_length=4, write_only=True)

方式三:继承CreateModelMixin,重写create方法

    def create(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data) # 第一个错误  UserRegisterSerializer
        serializer.is_valid(raise_exception=True) # 执行三个校验:字段自己,局部钩子,全局
        self.perform_create(serializer)
        return APIResponse(msg='注册成功') # 不走序列化了,序列类中得write_only 也就不用了

序列化类

# 注册序列化类,注册需要:1.反序列化保存, 2.校验数据, 3.序列化要不要?存疑
class UserRegisterSerializer(serializers.ModelSerializer):
    code = serializers.CharField(max_length=4, min_length=4)

    class Meta:
        model = User
        fields = ['mobile', 'password', 'code']  # code 不是数据库的字段,需要重写

    # 如果要限制密码强度,需要写个局部钩子
    def _check_code(self, attrs):
        mobile = attrs.get('mobile')
        code = attrs.get('code')
        old_code = cache.get('send_sms_code_%s' % mobile)
        if not (code == old_code or (settings.DEBUG and code == '8888')):  # 第二个错误:debug忘了设为True
            raise APIException("验证码错误")

    def _pre_save(self, attrs):  # {mobile:122222,code:8888,password:123}
        attrs.pop('code')
        attrs['username'] = attrs.get('mobile')  # 默认用户名就是手机号  可以随机生成用户名  随机生成有意义的名字( Faker)

    def validate(self, attrs):
        # 写逻辑
        # 1 校验验证码是否正确
        self._check_code(attrs)
        # 2 入口前准备 ---> code不是数据库字段,不能入库,username是数据库字段必填,这里没有,写成默认
        self._pre_save(attrs)
        return attrs

    def create(self, validated_data):  # {mobile:122222,password:123,username:名字}
        # 为什么要重写create? 因为密码人家是加密的,也可以在全局钩子中使用check_password将密码加密
        # User.objects.create(**validated_data)  # 密码是明文,必须重写
        user = User.objects.create_user(**validated_data)  # 保存成功,密码就是加密的
        return user

标签:功能,code,self,接口,attrs,注册,序列化,create,serializer
From: https://www.cnblogs.com/zjyao/p/17512712.html

相关文章

  • pytest接口自动化测试框架搭建的全过程
    pytest是Python的一种单元测试框架,可用来组织用例执行,用例断言,下面这篇文章主要给大家介绍了关于pytest接口自动化测试框架搭建的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下一.背景Pytest目前已经成为Python系自动化测试必学必备的一个框架,网上也有很多......
  • 登录注册分析、多方式登录接口
    目录一、登录注册页面分析二、路由总路由分路由:user/urls.py三、验证手机号是否存在接口3.1不同方式验证手机号3.2固定写法:四、后端多方式登录接口user/views.pyuser/serializers.py一、登录注册页面分析#根据原型图分析出:要写的功能#用户名密码登录接口#注册功......
  • 案例-用户注册
      packagecom.itheima.web;importcom.itheima.mapper.UserMapper;importcom.itheima.pojo.User;importorg.apache.ibatis.io.Resources;importorg.apache.ibatis.session.SqlSession;importorg.apache.ibatis.session.SqlSessionFactory;importorg.apache.i......
  • api接口接入淘宝/天猫平台采集添加到购物车数据调用演示案例
    ​淘宝添加到购物车API接口的作用是向淘宝购物车中添加指定的商品,实现用户将商品加入购物车的功能。通过该API接口,用户可以将商品加入购物车,方便后续进行结算和购买。使用淘宝添加到购物车API接口,可以帮助开发者和商家进行以下操作:购物车管理:允许用户将商品添加到购物车并进行......
  • 云原生应用交付平台 Orbit 主要功能与核心能力
    GitOpsGitOps于2017年首创,是一种管理由Kubernetes提供支持的云原生系统的现代方式。它利用策略即代码方法来定义和管理现代应用程序堆栈的每一层——基础设施、网络、应用程序代码和GitOps管道本身。Orbit基于GitOps方法理念提供以下能力:1所有应用信息存储在Git仓......
  • 苹果开发者账号注册设备异常是怎么回事
    对于近期新续费的,或者新注册的苹果开发者账号,有一些开发人员发现,当在开发者账号里添加了一定数目的设备后,会出现如下的提示信息: Registrationisbeingprocessedforthesedevices.Theymaybecomeavailablefordevelopmentandadhocdistributionin24to72hours.......
  • 在EasyCVR中调用快照接口返回404是什么原因?如何解决?
    EasyCVR视频融合平台基于云边端一体化架构,能在复杂的网络环境中将前端设备进行统一集中接入,实现视频资源的汇聚管理、直播鉴权、转码处理、多端分发、智能告警、数据共享等能力与服务。此外,平台也提供了丰富的API接口供用户自由调用、集成与二次开发。有用户反馈,在EasyCVR中调用......
  • 前端打包部署后接口BASE_URL不对问题解决办法
    在前端打包部署时,为了免去不同环境打包的麻烦,项目用的流水线触发方式。在这里不细说,重点说说下面情况。当项目提交打包部署后,访问压测环境或者生产环境的地址来使用项目时,发现接口报错404。 在NETWORK里发现接口的BASEURL和当前环境需要调用的后端baseurl不同。主要问题在于......
  • 免费体验Stable Diffusion deforum文转视频插件,还有deforum API 接口部署介绍!
    如何使用ServerlessDevs和函数计算快速体验部署StableDiffusion,这个是小白也能简单体验安装部署的教程.有电脑就能操作,依托阿里云原生服务.不用考虑硬件问题本篇主要讲解怎么安装跟部署自定义安装插件跟模型.以deforum文转视频插件举例.deforumapi接口自定义开发镜像定......
  • vue-element table表格排序推拽功能
    //1.安装sortablejsnpminstallsortablejs--save//2.功能页面中引入importSortablefrom‘sortablejs’具体使用(注意:elementtable务必指定row-key,且row-key必须是唯一的,如id,不然会出现排序不对的情况)<el-tablerow-key="id":data="tableData"style="width:......