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())
10.django的一些方法理解的更多相关文章
- 10.Django基础八之cookie和session
一 会话跟踪 我们需要先了解一下什么是会话!可以把会话理解为客户端与服务器之间的一次会晤,在一次会晤中可能会包含多次请求和响应.例如你给10086打个电话,你就是客户端,而10086服务人员就是服务器 ...
- Android 自定义 view(四)—— onMeasure 方法理解
前言: 前面我们已经学过<Android 自定义 view(三)-- onDraw 方法理解>,那么接下我们还需要继续去理解自定义view里面的onMeasure 方法 推荐文章: htt ...
- 合并多个python list以及合并多个 django QuerySet 的方法
在用python或者django写一些小工具应用的时候,有可能会遇到合并多个list到一个 list 的情况.单纯从技术角度来说,处理起来没什么难度,能想到的办法很多,但我觉得有一个很简单而且效率比较 ...
- 安装office2010提示要安装MSXML6.10.1129.0解决方法
系统win7 32位 安装office2010出现了错误,提示要安装MSXML6.10.1129.0解决方法 1.下载MSXML6.10.1129.0进行安装 2.若本机已安装过不管用: a.在运行里 ...
- python得到一个10位随机数的方法及拓展
https://blog.csdn.net/qq_33324608/article/details/78866760 无意中看到一个写10位随机数的方法,很有想法,然后就从学了一下随机数,相关东西都记 ...
- django drf 10大请求序列化方法
## 整体单改 路由层.模型层.序列化层不需要做修改,只需要处理视图层:views.py ```python"""1) 单整体改,说明前台要提供修改的数据,那么数据就需要 ...
- 10 Django之Ajax请求
一.什么是Ajax技术? 异步的JavaScript和XML.使用Javascript语言与服务器进行异步交互,传输的数据为XML(更多的使用json数据).Ajax不是一门新的编程语言,而是一种使用 ...
- 对iOS后台模式最多10分钟运行时间的进一步理解
在app进入后台时,系统初始默认是只有10s的处理时间,但如果10s不够,我们可以主动申请,网上流传最多的一个说法是10分钟. 但这种说法有个前提: 那就是iOS7之前,是这样 但从iOS7开始,我们 ...
- Android 自定义 view(三)—— onDraw 方法理解
前言: 上一篇已经介绍了用自己定义的属性怎么简单定义一个view<Android 自定义view(二) -- attr 使用>,那么接下来我们继续深究自定义view,下一步将要去简单理解自 ...
随机推荐
- SQL子连接案例
子查询 何时使用子查询 1. 子查询作为数据源 2. 数据加工 需求:根据不同顾客的所有的账户余额划分区间,进行分组 sql语句实现如下: select 'Small Fry' name , 0 lo ...
- LPVOID 指针 转 int
1 DWORD WINAPI SockUDP::RecvThread(LPVOID lparam){ //套接字 正确:int sock= *(int*)(lparam); 错误:int ...
- spring boot-16.使用redis做缓存
spring boot 自动配置了多种 缓存管理器,按照下面的顺序查找,如果容器中有相应的组件,则使用相应的缓存管理器. Generic JCache (JSR-107) EhCache 2.x Ha ...
- Javascript设计原则
Javascript设计原则 在面向对象的程序设计思想中, 我们能够遵循一些原则能够让我们开发代码时结构层次清晰, 更具说服力, 可谓是事半功倍. 做到这一点我们掌握一些程序设计原则是非常有利的, 如 ...
- dp入门题(数塔)
http://acm.hdu.edu.cn/showproblem.php?pid=2084 题意: 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 在上 ...
- PHP手册在7.1迁移页面给出了替代方案,就是用OpenSSL取代MCrypt.
/** * [AesSecurity aes加密,支持PHP7.1] */ class AesSecurity { /** * [encrypt aes加密] * @p ...
- jmeter---linux安装运行
安装jdk 安装jmeter 配置环境变量: export JAVA_HOME=/usr/java/1.8.0_181 export CLASSPATH=.:JAVA_HOME/lib/dt.jar: ...
- 【iOS】正則表達式抓取网页数据制作小词典
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/xn4545945/article/details/37684127 应用程序不一定要自己去提供数据. ...
- Jade学习(二)之语法规则上
语法 ⚠️实例均结合node jade缩进代表层级 html <html></html> html <html> head <head> style & ...
- Java获取文件的后缀名。
/** * 详细步骤 */ private static void test1() { //获取文件的原始名称 String originalFilename = "tim.g (1).jp ...