https://lion1ou.win/2017/01/18/#Json-Web-Token%EF%BC%88JWT%EF%BC%89
# REST framework JWT Auth文档
http://jpadilla.github.io/django-rest-framework-jwt/
#jwt的认证接口
url(r'^login/', obtain_jwt_token),

vue和jwt接口调试

AUTHENTICATION_BACKENDS = (
    'users.views.CustomBackend',
# 设置jwt有效期
import datetime
JWT_AUTH = {
    'JWT_EXPIRATION_DELTA': datetime.timedelta(days=7),
    'JWT_AUTH_HEADER_PREFIX': 'JWT',	# 前端携带的值前缀名 例:JWT 23478923423.dsfasdr23451efewsd
class CustomBackend(ModelBackend):
    自定义用户验证
    def authenticate(self, username=None, password=None, **kwargs):
            user = User.objects.get(Q(username=username)|Q(mobile=username))
            if user.check_password(password):
                return user		# 浏览器收到的将会是携带签名后的token
        except Exception as e:
            return None

云片网发送短信验证码

router.register(r'codes', SmsCodeViewset, base_name="codes")
class SmsCodeViewset(CreateModelMixin, viewsets.GenericViewSet):
    发送短信验证码
    serializer_class = SmsSerializer
    def generate_code(self):
        生成四位数字的验证码
        :return:
        seeds = "1234567890"
        random_str = []
        for i in range(4):
            random_str.append(choice(seeds))
        return "".join(random_str)
    def create(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        mobile = serializer.validated_data["mobile"]
        yun_pian = YunPian(APIKEY)
        code = self.generate_code()
        sms_status = yun_pian.send_sms(code=code, mobile=mobile)
        if sms_status["code"] != 0:
            return Response({
                "mobile":sms_status["msg"]
            }, status=status.HTTP_400_BAD_REQUEST)
        else:
            code_record = VerifyCode(code=code, mobile=mobile)
            code_record.save()
            return Response({
                "mobile":mobile
            }, status=status.HTTP_201_CREATED)
User = get_user_model()
class SmsSerializer(serializers.Serializer):
    mobile = serializers.CharField(max_length=11)
    def validate_mobile(self, mobile):
        验证手机号码
        :param data:
        :return:
        # 手机是否注册
        if User.objects.filter(mobile=mobile).count():
            raise serializers.ValidationError("用户已经存在")
        # 验证手机号码是否合法
        if not re.match(REGEX_MOBILE, mobile):
            raise serializers.ValidationError("手机号码非法")
        # 验证码发送频率
        one_mintes_ago = datetime.now() - timedelta(hours=0, minutes=1, seconds=0)
        if VerifyCode.objects.filter(add_time__gt=one_mintes_ago, mobile=mobile).count():
            raise serializers.ValidationError("距离上一次发送未超过60s")
        return mobile

user serializer和validator验证

router.register(r'users', UserViewset, base_name="users")
class UserViewset(CreateModelMixin, mixins.UpdateModelMixin, mixins.RetrieveModelMixin, viewsets.GenericViewSet):
    serializer_class = UserRegSerializer
    queryset = User.objects.all()
    authentication_classes = (JSONWebTokenAuthentication, authentication.SessionAuthentication )
    def get_serializer_class(self):
        if self.action == "retrieve":
            return UserDetailSerializer
        elif self.action == "create":
            return UserRegSerializer
        return UserDetailSerializer
    # permission_classes = (permissions.IsAuthenticated, )
    def get_permissions(self):
        if self.action == "retrieve":
            return [permissions.IsAuthenticated()]
        elif self.action == "create":
            return []
        return []
    def create(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        user = self.perform_create(serializer)
        re_dict = serializer.data
        payload = jwt_payload_handler(user)
        re_dict["token"] = jwt_encode_handler(payload)
        re_dict["name"] = user.name if user.name else user.username	# 重写方法,写入返回游览器的额外数据
        headers = self.get_success_headers(serializer.data)
        return Response(re_dict, status=status.HTTP_201_CREATED, headers=headers)
    def get_object(self):
        return self.request.user
    def perform_create(self, serializer):
        return serializer.save()
class UserRegSerializer(serializers.ModelSerializer):
    code = serializers.CharField(required=True, write_only=True, max_length=4, min_length=4,label="验证码",
                                 error_messages={
                                     "blank": "请输入验证码",
                                     "required": "请输入验证码",
                                     "max_length": "验证码格式错误",
                                     "min_length": "验证码格式错误"
                                 help_text="验证码")
    username = serializers.CharField(label="用户名", help_text="用户名", required=True, allow_blank=False,
                                     validators=[UniqueValidator(queryset=User.objects.all(), message="用户已经存在")])
    password = serializers.CharField(
        style={'input_type': 'password'},help_text="密码", label="密码", write_only=True,
    # def create(self, validated_data):
    #     user = super(UserRegSerializer, self).create(validated_data=validated_data)
    #     user.set_password(validated_data["password"])
    #     user.save()
    #     return user
    def validate_code(self, code):
        # try:
        #     verify_records = VerifyCode.objects.get(mobile=self.initial_data["username"], code=code)
        # except VerifyCode.DoesNotExist as e:
        #     pass
        # except VerifyCode.MultipleObjectsReturned as e:
        #     pass
        verify_records = VerifyCode.objects.filter(mobile=self.initial_data["username"]).order_by("-add_time")
        if verify_records:
            last_record = verify_records[0]
            five_mintes_ago = datetime.now() - timedelta(hours=0, minutes=5, seconds=0)
            if five_mintes_ago > last_record.add_time:
                raise serializers.ValidationError("验证码过期")
            if last_record.code != code:
                raise serializers.ValidationError("验证码错误")
        else:
            raise serializers.ValidationError("验证码错误")
    def validate(self, attrs):
        attrs["mobile"] = attrs["username"]
        del attrs["code"]
        return attrs
    class Meta:
        model = User
        fields = ("username", "code", "mobile", "password")

使用Django信号完成用户注册时的密码修改成非明文形式:

# -*- coding: utf-8 -*-
__author__ = 'bobby'
from django.db.models.signals import post_save
from django.dispatch import receiver
from rest_framework.authtoken.models import Token
from django.contrib.auth import get_user_model
User = get_user_model()
@receiver(post_save, sender=User)		# 使用post_save信号
def create_user(sender, instance=None, created=False, **kwargs):
    if created:
        password = instance.password
        instance.set_password(password)
        instance.save()
#手机号码正则表达式
REGEX_MOBILE = "^1[358]\d{9}$|^147\d{8}$|^176\d{8}$"
				
用户登录功能是一个信息系统必不可少的一部分,作为博客网站,同样需要管理员登录管理后台,游客注册登录评论等 大家好,我是落霞孤鹜,上一篇我们已经搭建好了前后端的框架的代码,并调通了前后端接口。从这一篇开始,进入到业务功能开发进程中。 首先我们需要实现的功能是用户登录用户登录功能虽然在系统开发中已经很成熟,但是当我们自己动手做的时候,会发现这个功能是那种典型的说起来容易,做起来复杂的功能,需要考虑处理的点很多。 一、需求分析 1.1 完整需求 一个完整的用户登录功能,需要考虑的点如下: 账号密码的.
      今天开始学用户登录手机注册了, 不过说实在的, 我听得很懵逼, 尤其用户论证的原理, 不管了, 先记下来怎么用吧,        我们参考drf官方手册操作的博客, 官网文档地址: https://www.django-rest-framework.org/api-guide/authentication/ 参考博客: https://www.cnblogs.com/derek...
REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework.authentication.BasicAuthentication', 'rest_framework.authentication.SessionA...
目录Web开发 ------ 基于Django+Vue网上购物商城(三)一、用户认证API接口1.REST 认证组件(1)具体代码(2) postman发送数据 测试(3)使用curl命令实现POST提交数据的测试2.REST JWT 认证组件(1) 安装模块包(2) 配置文件路由配置(3) postman发送数据 测试JWT 自定义手机登录组件 Web开发 ------ 基于Django+...
目录1. 开发环境2. 掌握的技术3. 课程系统构成4. Django REST framework 技能5. 开发中常见的问题6. 开发中常见问题的解决方案7. Django 进阶知识点8. vue 知识点9. 节安排10. 技术储备要求11. 系统功能 1. 开发环境 开发工具: Pycharm 开发环境: Python3.6+Django2.0.2 数据库: MySQL5.7 前端: ...
Vue + Django Rest Framework 前后端分离技术 彻底玩转restful api 开发流程 Django Rest Framework 的功能实现核心源码分析 Sentry 完成线上系统的错误日志的监控告警