Django REST framework认证权限和限制

认证、权限和限制

身份验证是将传入请求与一组标识凭据(例如请求来自的用户或其签名的令牌)相关联的机制。然后 权限 和 限制 组件决定是否拒绝这个请求。

简单来说就是:

认证确定了你是谁

权限确定你能不能访问某个接口

限制确定你访问某个接口的频率

认证

REST framework 提供了一些开箱即用的身份验证方案,并且还允许你实现自定义方案。

个人 敲码log:

1.

# Create your models here.
class UserInfo1(models.Model):
    id = models.AutoField(primary_key=True)  # 创建一个自增的主键字段
    # 创建一个varchar(64)的唯一的不为空的字段
    name = models.CharField(null=False, max_length=20)
    pwd = models.CharField(max_length=32,default=123)

class Token(models.Model):
    user = models.OneToOneField("UserInfo1",on_delete=models.CASCADE)
    token = models.CharField(max_length=128)

2.

# 我需要一个随机字符串
def get_random_str(user):
    import hashlib, time
    ctime = str(time.time())
    # 封装bytes类型一个MD5的加密对象
    md5 = hashlib.md5(bytes(user, encoding="utf8"))
    # md5.update 是拼接的效果,随机生成md5值
    md5.update(bytes(ctime, encoding="utf8"))
    return md5.hexdigest()


# 认证、权限和限制
class LoginModelView(APIView):
    def post(self, request):
        name = request.data.get("name")
        pwd = request.data.get("pwd")

        user = models.UserInfo1.objects.filter(name=name, pwd=pwd).first()
        res = {"state_code": 1000, "msg": None}
        if user:
            # 返回了一个usermd5 加密的字符串
            random_str = get_random_str(user.name)
            """
            当存在token时,则更新,不存在则创建,defaults: 是由 (field, value) 对组成的字典,用于更新对象。 
            返回一个由 (object, created)组成的元组,
            object: 是一个创建的或者是被更新的对象,
            created: 是一个标示是否创建了新的对象的布尔值。                      
            """
            token = models.Token.objects.update_or_create(user=user, defaults={"token": random_str})
            res["token"] = random_str
        else:
            res["state_code"] = 1001  # 错误状态码
            res["msg"] = "用户名或者密码错误"

        import json
        # 这是因为json.dumps 序列化时对中文默认使用的ascii编码.想输出真正的中文需要指定ensure_ascii=False:
        # 如果你这样的话就能把中文转成json字符串,而不是 \u4e2d\u56fd
        return Response(json.dumps(res,ensure_ascii=False))

Django update_or_create

update_or_create(defaults=None, **kwargs)
defaults 的值不同则创建,相同则更新

Member.objects.update_or_create(defaults={'user':1}, others={'field1':1,'field2':1})
当存在user=1时,则更新,不存在则创建

update_or_create 用法:

update_or_create(defaults=None, **kwargs)

kwargs: 来更新对象或创建一个新的对象。

defaults: 是由 (field, value) 对组成的字典,用于更新对象。

 

返回一个由 (object, created)组成的元组,

object: 是一个创建的或者是被更新的对象,

created: 是一个标示是否创建了新的对象的布尔值。

 

update_or_create: 方法通过给出的kwarg



猜你喜欢

转载自www.cnblogs.com/Rivend/p/11844648.html