zoukankan      html  css  js  c++  java
  • 10.django的一些方法理解

    django get_object_or_404

    get_object_or_404是django的django shortcuts的方法,用来查询数据,或者抛出一个DoesNotExist的异常

    用的是orm中的get方法,

    def get_object_or_404(klass, *args, **kwargs):
    需要三个参数
    klass 是一个model对象或者是一个manage,query对象
    *arg和**kwargs是查询使用到的参数(在klass中查询)
    from django.shortcuts import get_object_or_404
    product = get_object_or_404(Student,pk=1)
    Student是要查询的model,后面的pk=1是查询条件,你可以根据你需要查询的情况来写条件
    from django.http import Http404
    
    try:
        product = Product.objects.get(pk=1)
    except MyModel.DoesNotExist:
        raise Http404

    2.关于rest_framework中serializer的to_internal_value方法

    我们可以重写这个方法:

    def to_internal_value(self, data): 
    其中的data是为经过is_valid验证的数据,就是传入的数据
    在函数中我们为你可以对数据做一些操作,或者验证某些东西
    代码中可以继承父类中的方法super(UpdateCertificateSerializer, self).to_internal_value(data) def to_internal_value(self, data):if "payload" in data:
            # 在其中我对data中的数据,重新复制了一个数据(因为我需要进行签名验证)
                data["payload"] = "%s" %({
                    "project_name": data["project_name"],
                    "project_where_to_put": data["project_where_to_put"],
                    "project_desc": data["project_desc"],
                },)
                try:
            # 这一块代码是我项目中的,我对数据进行了验证 ids
    = data.get("ids") channel = get_object_or_404(Channel, channel_orders__order_order_items__uuid=ids[0]) for uuid in ids: ch = get_object_or_404(Channel, channel_orders__order_order_items__uuid=uuid) if channel != ch: raise serializers.ValidationError( detail={"ids": ["order_item出错"]}, code="ids" )
               # 这个函数是我进行签名验证的函数 check_and_get_payload(data, channel.key)

              # 返回的对象必须是一个可迭代对象,
              # 1.如果格式是下面这种则会经过validate(self.attrs)方法,而不经过validate_id(self,id)方法
              # return check_and_get_paload(data, channel.key)

              # 2.如果的形式如下,之后会经过 validate_id(self,id)和validate(self, attrs)
    return super(UpdateCertificateSerializer, self).to_internal_value(data) # 建议使用这种 except Exception as e: print(e) raise InvalidValue() else: return super(UpdateCertificateSerializer, self).to_internal_value(data)
    # 验证签名
    def check_and_get_payload(data, key):
        payload = data.get("payload")
        if not isinstance(payload, bytes):
            payload = payload.encode(encoding="utf8")
        signature = sign(payload, key)
        if data["signature"].encode(encoding="utf8") == signature:
            return data
    
    
    # 对payload和key进行base64加密
    def sign(message, key):
        if not isinstance(key, bytes):
            key = key.encode(encoding="utf8")
        h = hmac.new(key, message, sha1)
        return base64.urlsafe_b64encode(h.digest())
  • 相关阅读:
    百度地图API显示多个标注点带百度样式信息检索窗口的代码
    百度地图API显示多个标注点并添加百度样式检索窗口
    百度地图API显示多个标注点并添加百度样式检索窗口
    生了一场闷气
    追求效率还是追求真理
    在VC++应用程序中读取文本数据
    一种创建子视图窗口的办法
    学会从已知推出未知
    unresolved external symbol __beginthreadex错误的解决——谈谈在Win32 Consle Application如何使用MFC类
    为何能在视图类能更新界面
  • 原文地址:https://www.cnblogs.com/liuzhanghao/p/11004215.html
Copyright © 2011-2022 走看看