跳到主要内容

Frappe.call 调用例子

1, 客户端调用服务端例子

客户端JS调用例子

                frappe.call({
method:"erpnextcn.erpnextcn.doctype.invoice_check.invoice_check.verify_invoice3",
args: {
list: ["a","b","c"],
dict: {"a":"A","b":"B"},
list_of_dict: [{"a":"A","b":"B"},{"c":"C","d":"D"}]
}
})
.fail(fail => console.log("failure", fail))
.done(success => console.log("success", success.message));

服务端例子

@frappe.whitelist(allow_guest=True)
def verify_invoice3(*args, **kwargs):
for i in kwargs.items():
if i[0] not in ['cmd']: # cmd, data, method
try:
print("key = {0}, value = {1}, type_of_value = {2}".format(i[0],
json.loads(i[1]),
type(json.loads(i[1]))))
except Exception as e:
print ("ERROR", i[1]) # This will print what didn't decode as expected

return kwargs

调用结果

{
"list": "[\"a\",\"b\",\"c\"]",
"dict": "{\"a\":\"A\",\"b\":\"B\"}",
"list_of_dict": "[{\"a\":\"A\",\"b\":\"B\"},{\"c\":\"C\",\"d\":\"D\"}]",
"cmd": "erpnextcn.erpnextcn.doctype.invoice_check.invoice_check.verify_invoice3"
}

程序解释

这是一个 Python 函数,使用装饰器 @frappe.whitelist(allow_guest=True) 标记为白名单方法,并命名为 verify_invoice3

该函数接收任意数量的参数和关键字参数,并使用 for 循环遍历关键字参数(即命名关键字参数)中的每个元素。在循环体内,如果当前元素不是命令字符串 'cmd',则尝试将其值解析为 JSON 格式的对象(例如列表、字典等)。如果成功解析,就会打印出该元素的名称、值和值的类型;否则,将打印出错误消息并显示未能正确解码的值。

最后,该函数返回所有传递给它的关键字参数(即一个 dict 对象),这意味着它不对参数进行任何修改或处理。

下面是一些示例用法:

# 调用 verify_invoice3() 方法,传递一些关键字参数
result = verify_invoice3(a=1, b='hello', c=[1, 2, 3], d={'x': 10, 'y': 20})

# 输出结果
# key = a, value = 1, type_of_value = <class 'int'>
# key = b, value = hello, type_of_value = <class 'str'>
# key = c, value = [1, 2, 3], type_of_value = <class 'list'>
# key = d, value = {'x': 10, 'y': 20}, type_of_value = <class 'dict'>
print(result) # {'a': 1, 'b': 'hello', 'c': [1, 2, 3], 'd': {'x': 10, 'y': 20}}

在上面的示例中,我们调用了 verify_invoice3() 方法,并传递了一些关键字参数。该方法遍历每个关键字参数并打印出其名称、值和类型。最后,该方法返回所有传递给它的关键字参数作为一个 dict 对象。

请注意,

  1. 在使用该函数时,应该将所有要传递给它的关键字参数均以关键字参数的形式传递,并确保这些参数是有效的 JSON 格式对象。如果有任何无效的参数,则会导致解码错误。
  2. erpnextcn.erpnextcn.doctype.invoice_check.invoice_check.verify_invoice3 这个方法名的也很重要。 基本就是按照应用的路径来的, 请参照写,否则可能会调用不通。

2. 函数形参

*args 和 **kwargs 主要用于函数定义。

你可以将不定数量的参数传递给一个函数。不定的意思是:预先并不知道, 函数使用者会传递多少个参数给你, 所以在这个场景下使用这两个关键字。其实并不是必须写成 args 和 **kwargs。 (星号) 才是必须的. 你也可以写成 *ar 和 k 。而写成 *args 和kwargs 只是一个通俗的命名约定。

python函数传递参数的方式有两种:

  • 位置参数(positional argument)
  • 关键词参数(keyword argument)

*args 与 **kwargs 的区别,两者都是 python 中的可变参数:

  • *args 表示任何多个无名参数,它本质是一个 tuple
  • **kwargs 表示关键字参数,它本质上是一个 dict

如果同时使用 args 和 **kwargs 时,必须 args 参数列要在 **kwargs 之前。

>>> def fun(*args, **kwargs):
... print('args=', args)
... print('kwargs=', kwargs)
...
>>> fun(1, 2, 3, 4, A='a', B='b', C='c', D='d')
args= (1, 2, 3, 4)
kwargs= {'A': 'a', 'B': 'b', 'C': 'c', 'D': 'd'}

使用 *args

>>> def fun(name, *args):
... print('你好:', name)
... for i in args:
... print("你的宠物有:", i)
...
>>> fun("Geek", "dog", "cat")
你好: Geek
你的宠物有: dog
你的宠物有: cat

使用 **kwargs

>>> def fun(**kwargs):
... for key, value in kwargs.items():
... print("{0} 喜欢 {1}".format(key, value))
...
>>> fun(Geek="cat", cat="box")
Geek 喜欢 cat
cat 喜欢 box

3. 函数实参

如果函数的形参是定长参数,也可以使用 *args 和 **kwargs 调用函数,类似对元组和字典进行解引用:

>>> def fun(data1, data2, data3):
... print("data1: ", data1)
... print("data2: ", data2)
... print("data3: ", data3)
...
>>> args = ("one", 2, 3)
>>> fun(*args)
data1: one
data2: 2
data3: 3
>>> kwargs = {"data3": "one", "data2": 2, "data1": 3}
>>> fun(**kwargs)
data1: 3
data2: 2
data3: one