分析一个Django,从视图开始
整体项目
结构如图示
![image-20230729145731813](https://img2023.cnblogs.com/blog/3232290/202307/3232290-20230729181204706-1115612907.png)
views.py
def get_json_values(request):
Gzm_s = ''
Zk_s = ''
Zj_s = ''
Ex_Guid = TGuid_StopeClass() # 创建一个实例
在get_json_values
函数中,将空字符串分配给三个变量:Gzm_s
,Zk_s
和 Zj_s
。然后创建 TGuid_StopeClass
类的实例,并将其赋值给变量 Ex_Guid
。
什么叫“类的实例”:
通过实例化(即创建)一个类来得到的对象。用于描述对象的属性和行为。而类的实例则是基于这个类创建的具体对象,它具有类所定义的属性和行为。
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def say_hello(self):
print(f"Hello, my name is {self.name} and I am {self.age} years old.")
# 创建类的实例
person1 = Person("Alice", 30)
person2 = Person("Bob", 25)
定义了一个名为 Person
的类,它有两个属性 name
和 age
,以及一个方法 say_hello
。然后我们通过类来实例化两个对象,person1
和 person2
。每个实例都有自己的 name
和 age
属性,并且可以调用 say_hello
方法。
例如,
print(person1.name) # 输出: Alice
print(person2.age) # 输出: 25
person1.say_hello() # 输出: Hello, my name is Alice and I am 30 years old.
person2.say_hello() # 输出: Hello, my name is Bob and I am 25 years old.
继续看views:
# 从前端获取数据
if Ex_Guid.Ex_InitModel(Gzm_s, Zk_s, Zj_s):
result_dict = Ex_Guid.Output_str("ZK")
else:
result_dict = Ex_Guid.warning
这部分代码检查 Ex_Guid
实例的 Ex_InitModel
方法是否返回 True
。Ex_InitModel
用来初始化 Gzm_s
,Zk_s
和 Zj_s
这三个变量。
初始化之后使用参数 "ZK" 调用 Ex_Guid
实例的 Output_str
方法,结果赋给变量 result_dict
。否则,它将 Ex_Guid.warning
(一条警告消息)赋值给 result_dict
。
return JsonResponse(result_dict, safe=False)
最后,该视图返回一个JSON响应。
初始化函数init
接下来进入Ex_InitModel
的函数:
def Ex_InitModel(self, Gzm_str, Zk_str, Zj_str):
Gzm_bool = self.Ini_Gzm(Gzm_str)
Zk_bool = self.Ini_Zk(Zk_str)
Zj_bool = self.Ini_Zj(Zj_str)
Ex_InitModel
接收四个参数:self
(指向类实例自身的引用)、Gzm_str
、Zk_str
和 Zj_str
。这里的 self
是习惯用法;
接下来调用三个方法:Ini_Gzm
、Ini_Zk
和 Ini_Zj
,并传递相应的参数 Gzm_str
、Zk_str
和 Zj_str
进去。
self.successed = True if (Gzm_bool and Zk_bool and Zj_bool) else False
return self.successed
使用 and
运算来判断三个方法的返回值是否全部为 True
,然后将结果赋值给实例的属性 self.successed
。如果三个方法的返回值都为 True
,那么 self.successed
将被赋值为 True
,否则将被赋值为 False
。
最后,方法返回 self.successed
;(这意味着调用这个方法后,可以通过得到的返回值来判断整个初始化过程是否成功)
![image-20230729151748231](https://img2023.cnblogs.com/blog/3232290/202307/3232290-20230729181205119-1903317479.png)
工作面
先以Gzm为例,
def Ini_Gzm(self, str):
if str == '':
str2_1 = "GZM:16,12011工作面,二煤,4.5,综采,0,3.4,600,214,1640,100,1,25,20000,0.3,2,3"
str2_2 = "GZM_D:5,2902工作面,4,2.6,综采,2.4,12,5,470,550,510,300,650,3,1,2,1,1,1,1,1,2,2,0,0,0,0,100"
str = str2_1
先检查传入的参数 str
是否为空字符串。如果是空字符串,则将两个字符串 str2_1
和 str2_2
分别赋值给 str2_1
和 str2_2
变量。然后将 str2_1
的值赋值给参数 str
,即方法中的 str
变量,后面再使用。
if str.startswith("{") and str.endswith("}"):
# 第一种,json输入方法
if not self.Ex_Gzm.Base_Input(str): sys.exit()
if self.Ex_Gzm.Keyword == 'GZM':
self.Ex_Gzm.S_Input(str)
return True
elif self.Ex_Gzm.Keyword == 'GZM_D':
self.Ex_Gzm.ES_Input(str)
return True
else:
self.warning.append('GZM拼写错误或缺失;')
return False
接下来,代码检查 str
是否以 {
开头且以 }
结尾。如果满足这个条件,那么执行 if
语句块中的代码。
在这里,代码使用了一个 self.Ex_Gzm
实例来调用三个不同的方法:Base_Input
、S_Input
和 ES_Input
,并传递参数 str
给它们。
- 如果
Base_Input
方法的返回值为False
,则调用sys.exit()
来终止程序运行(退出程序)。 - 如果 关键字是
'GZM'
,则调用S_Input
方法,并返回True
。 - 如果关键字是
'GZM_D'
(更长的那串),则调用ES_Input
方法,并返回True
。 - 否则,将一条错误信息添加到
self.warning
列表,并返回False
。
else:
# 第二种,字符串输入方法
if str.startswith('GZM_D'):
self.Ex_Gzm.Keyword = 'GZM_D'
self.Ex_Gzm.ES2_Input(str)
return True
elif str.startswith('GZM'):
self.Ex_Gzm.Keyword = 'GZM'
self.Ex_Gzm.S2_Input(str)
return True
else:
self.warning.append('GZM拼写错误;')
return False
如果 str
不是以 {
开头或者不是以 }
结尾,那么执行 else
语句块中的代码。
先看是否以 'GZM_D'
开头或者以 'GZM'
开头。如果满足这些条件,那么执行相应的 if
语句块中的代码,其余原理同上;
钻孔
接下来是ZK:
![image-20230729152454410](https://img2023.cnblogs.com/blog/3232290/202307/3232290-20230729181205498-1469496767.png)
-
def Ini_Zk(self, str):
Ini_Zk
的方法接收两个参数:self
和str,str
是方法的第二个参数; -
if str == '':
检查传入的参数
str
是否为空。如果str
是空字符串,那么执行if
; -
定义一个包含钻孔信息的字符串
str
, 是默认的钻孔信息数据。如果传入的
str
为空,那么将使用这个默认的钻孔信息数据来初始化str
; -
if str.startswith('ZK'):
检查
str
是否以'ZK'
开头。如果满足这个条件,那么执行if
; -
self.Ex_Zk.Keyword = 'ZK'
将类实例的属性
self.Ex_Zk.Keyword
的值设为 `'ZK'; -
self.Ex_Zk.Zk_Input(str)
调用类实例的
Ex_Zk
属性的方法Zk_Input
,并将参数str
传递给它; -
return True
最后返回
True
,表示成功处理了'ZK'
类型的数据;如果
str
不是以'ZK'
开头,那么执行else
;self.warning.append('ZK拼写错误;')
将'ZK拼写错误;'
添加到类实例的self.warning
列表;return False
最后返回False
,表示没有成功处理'ZK'
输出函数
最后来到output:
def Output_str(self, Key):
if Key == 'GZM':
if self.Ex_Gzm.Keyword == 'GZM_D':
return self.Ex_Gzm.ES_Output()
elif self.Ex_Gzm.Keyword == 'GZM':
return self.Ex_Gzm.S_Output()
elif Key == 'ZK':
return self.Ex_Zk.Zk_Output()
elif Key == 'ZJ':
return self.Ex_Zj.Zj_Output()
"""
根据传入的 Key 参数,决定调用不同属性的不同方法,从而输出对应类型的数据。如果 Key 参数为 'GZM',那么会调用 Ex_Gzm 属性的 S_Output 或 ES_Output 方法输出 'GZM' 或 'GZM_D' 类型的数据; 如果 Key 参数为 'ZK',那么会调用 Ex_Zk 属性的 Zk_Output 方法输出 'ZK' 类型的数据; 如果为 'ZJ',那么会调用 Ex_Zj 属性的 Zj_Output 方法输出 'ZJ' 类型的数据。
"""
以ZJ为例:
![image-20230729153629324](https://img2023.cnblogs.com/blog/3232290/202307/3232290-20230729181205895-1048344496.png)
# 接收 input_str,是一个 JSON 字符串,使用 json.loads() 将其解析为字典或列表;
# 调用 self.value_Zj_Input(data) 方法,将解析后的数据传递给它,然后返回 True,表示成功处理了输入数据;
def Zj_Input(self, input_str):
data = json.loads(input_str)
self.value_Zj_Input(data)
return True
# 接收一个参数 data(字典)检查 data 字典中是否包含特定键值来赋值。如果 data 字典中包含【键】 'Zj_Name',则将【值】赋给 self.Zj_Name;
def value_Zj_Input(self, data):...
# 第二种text解析方法
# 接受的是文本字符串,先将 "ZJ:" 替换为空然后使用 split(',') 将剩余字符串按逗号分隔,并形成一个列表 Zj_info;
# try 和 except 块将列表中的每个元素转换,转换失败(出现 ValueError)触发 except 调用 sys.exit() 来退出
def Zj2_Input(self, input_str):
Zj_info = input_str.replace('ZJ:', '').split(',')
try:...
except json.JSONDecodeError:
sys.exit()
TBase
![image-20230729180522310](https://img2023.cnblogs.com/blog/3232290/202307/3232290-20230729181206297-1019738798.png)
名为 TBase
的类,其中:
class TBase(object):
def __init__(self):
self.Visible = True
self.Enabled = True
self.Keyword = ''
self.Name = ''
-
这是一个名为
TBase
的类定义,继承自object
。什么是“object”
object
是 Python 中的一个内置基类。所有的类都直接或间接地继承自object
,它是 Python 中所有类的基类。在 Python 3 中,即使没有显式地指定父类,所有的类也会默认继承自object
,比如下面这两种方式是等价的:# 不指定父类,默认继承自 object class TBase: # 类定义... # 指定父类为 object class TBase(object): # 类定义...
-
在类的构造函数
__init__
中,初始化了四个属性:self.Visible
:布尔,默认True
self.Enabled
:布尔,默认True
self.Keyword
:字符串,默认空''
self.Name
:字符串,默认空''
def Base_Input(self, str):
data = json.loads(str)
self.Visible = data['Visible'] if ('Visible' in data) else True
self.Enabled = data['Enabled'] if ('Enabled' in data) else True
self.Keyword = data['Keyword'] if ('Keyword' in data) else ''
self.Name = data['Name'] if ('Name' in data) else ''
return True
-
Base_Input
方法:这是一个类方法,用于将传入的 JSON 字符串
str
解析为 Python 的字典或列表。然后为类实例赋值。- 如果 JSON 数据中包含键
'Visible'
,则将对应的值赋给self.Visible
;否则,将self.Visible
设置为默认值True
; - 后三者同理;
- 最后,方法返回
True
,表示成功处理了输入数据。
- 如果 JSON 数据中包含键
def Base_Output(self):
data = {
'Visible': self.Visible,
'Enabled': self.Enabled,
'Keyword': self.Keyword,
'Name': self.Name
}
return data
Base_Output
用于输出类实例的数据。打包为一个字典data
,包含了四个键值对,分别对应Visible
、Enabled
、Keyword
和Name
属性的值。然后将这个字典返回。
综上可得,这个类 TBase
主要用于处理属性的输入和输出。