1. 手机验证码注册接口
/1 短信注册的序列化类
class UserRegisterSerializer(serializers.ModelSerializer):
code = serializers.CharField(max_length=4, min_length=4,write_only=True)
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:123,code:321,password:123}
attrs.pop('code')
attrs['username'] = attrs.get('mobile') # 默认用户名就是手机号
# 限制密码强度,使用局部钩子
def validate(self,attrs):
# 逻辑部分
# 1.校验验证码是否正确
self._check_code(attrs)
# 2.入库前准备--->code不是数据库字段,无法在库中写出,username是必填的我们需要给一个默认的
self._pre_save(attrs)
return attrs
# 重写create方法
def create(self, validated_data): # {mobile:123,password:123,username:123}
# 重写create的原因是因为原来的密码是加密的 需要加密
user = User.objects.create_user(**validated_data)
return user
/2 视图类中接口的创建
# 判断选择哪个序列化类
def get_serializer_class(self):
if self.action == 'sms_login':
return LoginUserSMSSerializer
elif self.action == 'sms_register' or self.action == 'create':
return UserRegisterSerializer
else:
return self.serializer_class
有两种不同的方法
# 验证码的注册功能
# 1 自己写版本 访问地址:127.0.0.1:8000/api/v1/user/userinfo/register/
@action(methods=['POST'], detail=False)
def sms_register(self,request,*args,**kwargs):
ser = self.get_serializer(data=request.data)
ser.is_valid(raise_exception=True) # 执行三大校验
ser.save()
return APIResponse(msg='注册成功')
# 2 继承视图扩展类CreateModelMixin的版本 访问地址:127.0.0.1:8000/api/v1/user/userinfo
此方法需要导入from rest_framework.mixins import CreateModelMixin
/3 调试全局异常的报错模式
让报错更详细
if isinstance(res.data,dict):
msg=res.data.get('detail',None) # 取不到 就显示not msg
if not msg:
msg = res.data
data = {'code':102,'msg':msg}
else:
data = {'code': 100, 'msg': res.data}
/4 知识点的补充
主路由中为什么要写media
因为django中默认是不允许前端直接访问项目的某个文件夹的(static文件夹中的除外)
path('media/<path:path>',serve,{'document_root':settings.MEDIA_ROOT})
配置文件中debug有什么作用
debug让信息显示更丰富
你访问的路由如果不存在,会把所有能访问到的路由都显示出来
程序出了异常,错误信息直接显示在浏览器上
上线阶段,肯定要改成False
allowed的作用
只有debug 为Flase时,这个必须填
限制后端项目(django项目 )能够部署在哪个ip的机器上
写 * 表示所有地址都可以
标签:code,get,self,接口,attrs,msg,data,学城,搭建 From: https://www.cnblogs.com/abc683871/p/17523799.html