def register(self, request): # 触发该函数,接口地址为:/api/user/auth/register/ # 1.校验数据 serializer = self.get_serializer(data=request.data) result = serializer.is_valid(raise_exception=False) # 2.判断校验结果 if not result: errors = serializer.errors res = { 'code': 1001, 'msg': '字段校验失败', 'data': errors } raise ParamsException(res) user = serializer.save() res = {'user_id': user.id} return Response(res)
def register(self, request, *args, **kwargs): # /api/user/auth/register/ serializer = self.get_serializer( data=request.data ) # get_serializer()首先调用的是自己定义的serializer_class=UserRegisterSerializers result = serializer.is_valid(raise_exception=False) #False 不直接抛错 if not result: raise ParamsException({ 'code': 1000, 'msg': '参数校验失败', 'data': serializer.errors # serializer.errors 获取字段校验(上面定义部分)不通过时抛出的错误 }) # 保存用户信息 user = serializer.register_user(serializer.data) # 返回结构{'code':200,'msg':'请求成功,'data':{'user_id':user.id}} res = {'user_id': user.id} return Response(res)
def validate(self, attrs): # 账号必须不存在 res = {} username = attrs.get('u_username') email = attrs.get('u_email') # 密码和确认密码必须一致 # 邮箱正则匹配 if UserModel.objects.filter(username=username): res = {'code': 1001, 'msg': '账号已存在'} if UserModel.objects.filter(email=email): res = {'code': 1000, 'msg': '邮箱已存在'} re_compile = re.compile( '^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$') if not re_compile.fullmatch(email): res = {'code': 1000, 'msg': '邮箱格式不正确'} if res: raise ParamsException(res) return attrs
def login(self, request): # 请求地址:/api/user/auth/login/ data = request.data # self.get_serializer调用UserLoginSerializer serializer = self.get_serializer(data=data) result = serializer.is_valid() if not result: res = {'code': 1007, 'msg': '校验登录参数失败', 'data': serializer.errors} raise ParamsException(res) # 登录标识符的操作 # 1.获取唯一的标识符传递给前端 token = uuid.uuid4().hex # 2.存储标识符和当前登录用户的关联关系(redis) username = serializer.data.get('u_username') user = UserModel.objects.filter(username=username).first() # 使用redis中的string类型进行存储, 存储的key为token值,value为当前登录用户的id值 cache.set(token, user.id, timeout=12000) res = {'token': token} return Response(res)
def register(self, request): # 请求地址:/api/user/auth/register/ # 请求方式: # 1. 获取前端传递的参数 data = self.request.data # 2. 字段校验(重新定义UserRegisterSerializer) serializer = UserRegisterSerializer(data=data) # 3. 注册功能实现 result = serializer.is_valid() if not result: res = {'code': 1004, 'msg': '字段校验错误', 'data': serializer.errors} raise ParamsException(res) user = UserModel.objects.create( username=serializer.data.get('u_username'), password=make_password(serializer.data.get('u_password')), email=serializer.data.get('u_email')) # 4. 返回数据 res = {'user_id': user.id} return Response(res)
def login(self, request): # 请求地址:/api/user/auth/login/ data = request.data serializer = self.get_serializer(data=data) result = serializer.is_valid() if not result: res = {'code': 1005, 'msg': '字段校验错误', 'data': serializer.errors} raise ParamsException(res) # 登陆标识符的操作 # 1.获取唯一的标识符传递给前端 token = uuid.uuid4().hex # 2.存储标识符和当前登陆用户的关联关系(redis) # 这里取user是为了取得user.id,存入本地数据库,形成标识符和登录用户的关联关系 user = UserModel.objects.filter( username=serializer.data.get('u_username')).first() # 使用redis中的string类型进行存储,存储的key为token值,value为当前登录用户的id值 # 本地终端获取user.id get token值 cache.set(token, user.id, timeout=30000) res = {'token': token} return Response(res)
def authenticate(self, request): # 登录地址才做token与user_id的判断 # 不需要做登录认证的地址,如/register/、/login/、/home/不做认证 path = request.path not_need_auth = [ '/api/user/auth/register/', '/api/user/auth/login/', '/api/goods/home/', '/api/goods/market/', '/api/goods/foodtype/', ] if path in not_need_auth: return None token = request.data.get('token') if request.data.get( 'token') else request.query_params.get('token') if token: user_id = cache.get(token) if user_id: user = UserModel.objects.get(id=user_id) return user, token res = {'code': 1008, 'msg': '用户没登录,无法执行该操作'} raise ParamsException(res)