2018.10.24_PYTHON_CLASS23

本文介绍了Django框架中的模板系统,包括DTL和Jinja2的使用,详细讲解了DTL模板与普通HTML的区别,以及如何使用render_to_string和render方法进行模板渲染。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

模版介绍笔记:

在之前的章节中,视图函数只是直接返回文本,而在实际生产环境中其实很少这样用,因为实际的页面大多是带有样式的HTML代码,这可以让浏览器渲染出非常漂亮的页面。目前市面上有非常多的模板系统,其中最知名最好用的就是DTL和Jinja2。DTL是Django Template Language三个单词的缩写,也就是Django自带的模板语言。当然也可以配置Django支持Jinja2等其他模板引擎,但是作为Django内置的模板语言,和Django可以达到无缝衔接而不会产生一些不兼容的情况。因此建议大家学习好DTL。

DTL与普通的HTML文件的区别:

DTL模板是一种带有特殊语法的HTML文件,这个HTML文件可以被Django编译,可以传递参数进去,实现数据动态化。在编译完成后,生成一个普通的HTML文件,然后发送给客户端。

渲染模板:

渲染模板有多种方式。这里讲下两种常用的方式。

  1. render_to_string:找到模板,然后将模板编译后渲染成Python的字符串格式。最后再通过HttpResponse类包装成一个HttpResponse对象返回回去。示例代码如下:
from django.template.loader import render_to_string
 from django.http import HttpResponse
 def book_detail(request,book_id):
     html = render_to_string("detail.html")
     return HttpResponse(html)
  1. 以上方式虽然已经很方便了。但是django还提供了一个更加简便的方式,直接将模板渲染成字符串和包装成HttpResponse对象一步到位完成。示例代码如下:
 from django.shortcuts import render
 def book_list(request):
     return render(request,'list.html')
你解读一下下面这个程序 from pysat.sat_test import TestCase, CaseInfo from pysat.sat_result import ResultInfo from pysat import sat_conf from pysat import rpc3 import logging logger = logging.getLogger(__name__) _gcfg = sat_conf.TestbedConfig() def get_config(name): '''get the testbed config info, return the value''' return _gcfg.get(name.lower()) # return _gcfg.get('testbed.cd_bvt_smbrouter.' + name.lower()) class Test(TestCase): def __init__(self): TestCase.__init__(self) self.logger = logging.getLogger(self.__class__.__name__) self.case_info = CaseInfo() self.case_info.name = 'test' self.case_info.id = 'FG999999' self.case_info.version = '202306271536' self.case_info.author = 'zhaohongmei@tp-link.com.hk' self.case_info.runtime = '8min' self.case_info.testbeds = self.get_testbed_list() self.case_info.description = ''' ''' def add_task(self): self.register_case(self.FG999999__test, self.case_info) def FG999999__test(self): try: self.logger.info('[Pre-condition]: Process db data') result = ResultInfo() dut_wan_static_ip = get_config('dut_wan_static_ip') self.logger.info(f'dut_wan_static_ip is {dut_wan_static_ip}') if dut_wan_static_ip == '192.168.202.2': result.add_result(passfail=ResultInfo.PASS, actual_result=dut_wan_static_ip, expected_result='192.168.202.2', test_comment='从数据库读取dut_wan_static_ip数据', item_id='step1') else: result.add_result(passfail=ResultInfo.FAIL, actual_result=dut_wan_static_ip, expected_result='192.168.202.2', test_comment='从数据库读取dut_wan_static_ip数据', item_id='step1') return result except Exception as e: result = ResultInfo() result.add_result(passfail=ResultInfo.FAIL, test_comment='Test fail: %s' % e) self.break_test('Test fail: %s' % e) def clean_test(self): try: self.logger.info('[clean_test] start to clean test...') except Exception as e: self.logger.error('[clean_test] clean test failed: %s' % e) raise e
最新发布
08-16
<think>我们正在分析一个基于pysat框架的Python自动化测试脚本。这个脚本的主要功能是执行一个测试用例,从测试床配置中获取DUT(被测设备)的WAN口静态IP地址,并验证其值是否符合预期(192.168.202.2)。下面将详细解释脚本的各个部分。 ### 1. 脚本基础信息 ```python #!/usr/bin/env python # -*- coding: UTF-8 -*- ``` - 第一行指定了脚本的解释器为Python(使用环境变量中的python)。 - 第二行指定了脚本的编码为UTF-8,确保中文字符正常显示。 ### 2. 版权信息 ```python ############################################################################### # Copyright (C), 2018, TP-Link Technologies Co., Ltd. # # File Name: FG999999__test.py.py # Author : zhaohongmei # History: # 1. 2024-06-27, zhaohongmei, create ############################################################################### ``` - 这是脚本的版权信息,包括公司名称、文件名、作者和创建历史。 ### 3. 导入模块 ```python from pysat.sat_test import TestCase, CaseInfo from pysat.sat_result import ResultInfo from pysat import sat_conf from pysat import rpc3 import logging ``` - `TestCase`和`CaseInfo`:pysat框架中用于定义测试用例和用例信息的类。 - `ResultInfo`:用于存储测试结果信息的类。 - `sat_conf`:用于读取测试床配置的模块。 - `rpc3`:可能用于远程过程调用的模块(在本脚本中未使用)。 - `logging`:Python标准日志模块,用于记录测试过程中的日志。 ### 4. 日志设置 ```python logger = logging.getLogger(__name__) ``` - 获取当前模块的日志器,用于记录日志。 ### 5. 测试床配置 ```python _gcfg = sat_conf.TestbedConfig() def get_config(name): '''get the testbed config info, return the value''' return _gcfg.get(name.lower()) ``` - `_gcfg`是测试床配置对象,通过`sat_conf.TestbedConfig()`创建。 - `get_config`函数用于根据配置项名称(不区分大小写)获取配置值。 ### 6. 测试类定义 ```python class Test(TestCase): ``` - 定义测试类`Test`,继承自`TestCase`(pysat框架的测试用例基类)。 #### 6.1 初始化方法 ```python def __init__(self): TestCase.__init__(self) self.logger = logging.getLogger(self.__class__.__name__) self.case_info = CaseInfo() self.case_info.name = 'test' self.case_info.id = 'FG999999' self.case_info.version = '202306271536' self.case_info.author = 'zhaohongmei@tp-link.com.hk' self.case_info.runtime = '8min' self.case_info.testbeds = self.get_testbed_list() self.case_info.description = ''' ''' ``` - 调用基类`TestCase`的初始化方法。 - 设置当前类的日志器。 - 创建`CaseInfo`对象,设置测试用例的基本信息: - `name`:测试用例名称('test') - `id`:测试用例ID('FG999999') - `version`:版本号('202306271536') - `author`:作者信息 - `runtime`:预计运行时间(8分钟) - `testbeds`:通过`get_testbed_list()`方法获取测试床列表(基类方法) - `description`:测试用例描述(这里为空) #### 6.2 添加任务方法 ```python def add_task(self): self.register_case(self.FG999999__test, self.case_info) ``` - `add_task`方法将测试用例(`self.FG999999__test`方法)和用例信息(`self.case_info`)注册到测试框架中。 #### 6.3 测试用例方法 ```python def FG999999__test(self): try: self.logger.info('[Pre-condition]: Process db data') result = ResultInfo() dut_wan_static_ip = get_config('dut_wan_static_ip') self.logger.info(f'dut_wan_static_ip is {dut_wan_static_ip}') if dut_wan_static_ip == '192.168.202.2': result.add_result(passfail=ResultInfo.PASS, actual_result=dut_wan_static_ip, expected_result='192.168.202.2', test_comment='从数据库读取dut_wan_static_ip数据', item_id='step1') else: result.add_result(passfail=ResultInfo.FAIL, actual_result=dut_wan_static_ip, expected_result='192.168.202.2', test_comment='从数据库读取dut_wan_static_ip数据', item_id='step1') return result except Exception as e: result = ResultInfo() result.add_result(passfail=ResultInfo.FAIL, test_comment='Test fail: %s' % e) self.break_test('Test fail: %s' % e) ``` - 这是具体的测试执行方法,命名为`FG999999__test`(用例ID对应)。 - 步骤: 1. 记录日志,表示进入前置条件处理。 2. 创建`ResultInfo`对象用于存储测试结果。 3. 通过`get_config`获取配置项`dut_wan_static_ip`的值。 4. 判断获取的值是否等于`192.168.202.2`: - 如果相等,添加一条结果为`PASS`的记录,包括实际值、期望值、测试注释和步骤ID。 - 如果不相等,添加一条结果为`FAIL`的记录。 5. 返回结果对象`result`。 - 异常处理: - 如果执行过程中发生异常,创建新的结果对象,并添加一条`FAIL`记录,记录异常信息。 - 调用`self.break_test`中断测试(可能为框架提供的中断方法)。 #### 6.4 清理方法 ```python def clean_test(self): try: self.logger.info('[clean_test] start to clean test...') except Exception as e: self.logger.error('[clean_test] clean test failed: %s' % e) raise e ``` - `clean_test`方法用于测试后的清理工作,这里仅记录开始清理的日志,实际清理逻辑可根据需要扩展。 - 异常处理:记录清理失败的错误日志并抛出异常。 ### 7. 工作原理总结 该脚本基于pysat测试框架,主要流程如下: 1. **初始化测试用例信息**:在`__init__`方法中设置用例的基本信息(ID、名称、版本等)。 2. **注册测试任务**:通过`add_task`方法将测试方法(`FG999999__test`)和用例信息注册到框架。 3. **执行测试**:框架调用`FG999999__test`方法执行测试: - 从测试床配置中读取`dut_wan_static_ip`的值。 - 验证该值是否为`192.168.202.2`,并记录验证结果。 4. **清理阶段**:测试结束后执行`clean_test`进行清理(本脚本中仅记录日志)。 5. **结果报告**:通过`ResultInfo`对象收集测试结果,由框架生成测试报告。 ### 8. 关键组件作用 - **`TestCase`**:测试用例的基类,提供测试框架所需的基本结构和生命周期方法。 - **`CaseInfo`**:存储测试用例的元数据(如ID、名称、作者等)。 - **`ResultInfo`**:存储测试步骤的结果(通过/失败、实际结果、预期结果等)。 - **`sat_conf`**:提供访问测试床配置的能力,支持从外部配置源(如数据库)获取配置项。 - **日志模块**:记录测试执行过程中的关键信息,便于调试和审计。 ### 9. 测试流程图示 ```mermaid graph TD A[初始化测试类] --> B[设置用例信息] B --> C[注册测试任务] C --> D[框架调度执行] D --> E[执行FG999999__test方法] E --> F{获取配置值} F -->|成功| G[验证配置值] G -->|匹配| H[记录PASS结果] G -->|不匹配| I[记录FAIL结果] F -->|异常| J[记录FAIL结果并中断] H & I & J --> K[返回结果对象] K --> L[清理阶段] L --> M[生成测试报告] ``` ### 10. 注意事项 - 测试床配置项的名称在`get_config`函数中被转换为小写,因此配置文件中应使用小写或函数能处理大小写不敏感。 - 测试中断方法`break_test`可能由框架提供,用于在发生严重错误时停止测试。 §§相关问题§§ 1. pysat框架中如何管理多个测试用例的执行顺序? 2. 如何扩展pysat测试框架以支持数据驱动测试? 3. 在pysat框架中如何集成外部测试报告系统(如Allure)? 4. 测试床配置(sat_conf)支持哪些配置源(如数据库、文件等)? 5. 如何为pysat测试框架编写自定义的清理逻辑?</think>### 基于pysat框架的Python测试脚本详解 #### 1. **脚本结构概览** ```mermaid graph TD A[脚本头] --> B[模块导入] B --> C[全局配置] C --> D[测试类定义] D --> E[初始化方法] D --> F[测试用例] D --> G[清理方法] ``` #### 2. **核心组件解析** ##### 2.1 脚本头配置 ```python #!/usr/bin/env python # -*- coding: UTF-8 -*- ``` - `#!/usr/bin/env python`:指定使用系统环境中的Python解释器执行 - `# -*- coding: UTF-8 -*-`:确保支持中文字符集 - 版权信息块:包含作者、创建时间等元数据[^2] ##### 2.2 模块导入 ```python from pysat.sat_test import TestCase, CaseInfo from pysat.sat_result import ResultInfo from pysat import sat_conf import logging ``` - **TestCase**:测试用例基类,提供测试生命周期管理 - **CaseInfo**:存储测试用例元数据(名称、ID、作者等) - **ResultInfo**:测试结果记录容器 - **sat_conf**:测试床配置管理模块 - **logging**:Python标准日志模块[^1] ##### 2.3 全局配置 ```python _gcfg = sat_conf.TestbedConfig() def get_config(name): return _gcfg.get(name.lower()) ``` - 初始化测试床配置对象`_gcfg` - `get_config()`函数封装配置获取逻辑,统一转换为小写键名 ##### 2.4 测试类定义 ```python class Test(TestCase): def __init__(self): # 初始化基类 self.case_info = CaseInfo() self.case_info.name = 'test' self.case_info.id = 'FG999999' ... def add_task(self): self.register_case(self.FG999999__test, self.case_info) ``` - 继承`TestCase`基类实现自定义测试类 - 初始化`CaseInfo`对象设置测试元数据: - `name`:测试名称 - `id`:唯一测试标识符 - `version`:测试版本 - `author`:作者信息 - `runtime`:预估执行时间 - `add_task()`注册测试用例到框架 ##### 2.5 测试用例实现 ```python def FG999999__test(self): try: result = ResultInfo() dut_wan_static_ip = get_config('dut_wan_static_ip') if dut_wan_static_ip == '192.168.202.2': result.add_result(passfail=ResultInfo.PASS, ...) else: result.add_result(passfail=ResultInfo.FAIL, ...) return result except Exception as e: result.add_result(passfail=ResultInfo.FAIL, ...) self.break_test(...) ``` - **核心逻辑**: 1. 从测试床配置获取`dut_wan_static_ip`值 2. 验证是否等于`192.168.202.2` 3. 根据结果添加PASS/FAIL记录 - **结果记录**: - `passfail`:测试结果状态(PASS/FAIL) - `actual_result`:实际获取值 - `expected_result`:预期值 - `test_comment`:步骤描述 - `item_id`:步骤标识符 - **异常处理**:捕获异常并记录FAIL结果 ##### 2.6 清理方法 ```python def clean_test(self): try: self.logger.info('[clean_test] start to clean test...') except Exception as e: self.logger.error('Clean failed: %s' % e) raise e ``` - 测试后执行资源清理 - 独立异常处理确保清理失败不影响主结果 #### 3. **测试执行流程** ```mermaid sequenceDiagram participant Framework participant TestClass participant Config Framework->>TestClass: 调用add_task() TestClass->>Framework: 注册测试用例 Framework->>TestClass: 执行FG999999__test() TestClass->>Config: get_config('dut_wan_static_ip') Config-->>TestClass: 返回IP值 alt 值匹配 TestClass->>Result: 记录PASS else 值不匹配 TestClass->>Result: 记录FAIL end TestClass->>Framework: 返回ResultInfo Framework->>TestClass: 调用clean_test() ``` #### 4. **关键设计特点** 1. **配置驱动测试**: ```python dut_wan_static_ip = get_config('dut_wan_static_ip') ``` 通过`sot_conf`实现测试数据代码分离 2. **结构化结果记录**: ```python result.add_result(passfail=ResultInfo.PASS, actual_result=value, expected_result='192.168.202.2', test_comment='验证WAN IP') ``` 提供标准化的结果输出格式 3. **异常安全机制**: ```python try: # 测试逻辑 except Exception as e: result.add_result(passfail=ResultInfo.FAIL) self.break_test() ``` 确保异常时仍能记录结果并中断测试 4. **日志追踪**: ```python self.logger.info(f'dut_wan_static_ip is {dut_wan_static_ip}') ``` 使用标准logging模块记录执行过程 #### 5. **典型应用场景** 此脚本适用于: - 网络设备配置验证(如路由器WAN口IP) - 硬件测试自动化 - 持续集成中的配置检查 - 质量保证团队的回归测试
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值