我的第一个python web开发框架(16)——产品分类管理

简介:

 产品分类管理的html页面之前忘记做了,这次附件里补上。

  好了先上图

  

  从页面效果图来看,我们需要开发列表获取接口、添加接口、单条记录获取接口、编辑接口和删除接口

  对于产品分类列表,我们将使用jqgrid前端表格框架,jqgrid与接口交互时,它会提交页面索引、页面大小、排序字段名以及顺序还是倒序排序这几个参数,而返回的结果也有格式约束。

  返回格式要求:

复制代码
{
    'records': 0,
    'total': 0,
    'page': 1,
    'rows': [],
}
复制代码

  产品分类列表获取接口

复制代码
 1 @get('/api/product_class/')
 2 def callback():
 3     """
 4     获取列表数据
 5     """
 6     # 页面索引
 7     page_number = convert_helper.to_int1(web_helper.get_query('page', '', False))
 8     # 页面显示记录数量
 9     page_size = convert_helper.to_int0(web_helper.get_query('rows', '', False))
10     # 排序字段
11     sidx = web_helper.get_query('sidx', '', False)
12     # 顺序还是倒序排序
13     sord = web_helper.get_query('sord', '', False)
14     # 初始化排序字段
15     order_by = 'sort asc'
16     if sidx:
17         order_by = sidx + ' ' + sord
18 
19     #############################################################
20     # 初始化输出格式(前端使用jqgrid列表,需要指定输出格式)
21     data = {
22         'records': 0,
23         'total': 0,
24         'page': 1,
25         'rows': [],
26     }
27     #############################################################
28     # 执行sql,获取指定条件的记录总数量
29     sql = 'select count(1) as records from product_class'
30     result = db_helper.read(sql)
31     # 如果查询失败或不存在指定条件记录,则直接返回初始值
32     if not result or result[0]['records'] == 0:
33         return data
34     # 保存总记录数量
35     data['records'] = result[0].get('records', 0)
36 
37     #############################################################
38     ### 设置分页索引与页面大小 ###
39     # 设置分页大小
40     if page_size is None or page_size <= 0:
41         page_size = 10
42     # 计算总页数
43     if data['records'] % page_size == 0:
44         page_total = data['records'] // page_size
45     else:
46         page_total = data['records'] // page_size + 1
47     # 记录总页面数量
48     data['total'] = page_total
49 
50     # 判断提交的页码是否超出范围
51     if page_number < 1 or page_number > page_total:
52         page_number = page_total
53     # 记录当前页面索引值
54     data['page'] = page_number
55 
56     # 计算当前页面要显示的记录起始位置
57     record_number = (page_number - 1) * page_size
58     # 设置查询分页条件
59     paging = ' limit ' + str(page_size) + ' offset ' + str(record_number)
60     ### 设置排序 ###
61     if not order_by:
62         order_by = 'id desc'
63     #############################################################
64 
65     # 组合sql查询语句
66     sql = "select * from product_class order by %(orderby)s %(paging)s" % \
67           {'orderby': order_by, 'paging': paging}
68     # 读取记录
69     result = db_helper.read(sql)
70     if result:
71         # 存储记录
72         data['rows'] = result
73 
74     if data:
75         # 直接输出json
76         return web_helper.return_raise(json.dumps(data, cls=json_helper.CJsonEncoder))
77     else:
78         return web_helper.return_msg(-1, "查询失败")
复制代码

  这段代码有点长,从功能上可以分为四段,第一段是接收客户端提交的参数;第二段获取当前查询条件下有多少条记录数量;第三段是处理分页,并组合查询sql语句;第四段是提交查询请求,并返回结果

  get方式提交,我们使用web_helper.get_query()函数获取参数值

  具体代码有详细注释,这里就不细说了,大家如果有不明白的地方留言或到群里问我。

  

  界面中的删除按钮对应的是删除接口

复制代码
 1 @delete('/api/product_class/<id:int>/')
 2 def callback(id):
 3     """
 4     删除指定记录
 5     """
 6     # 判断该分类是否已经被引用,是的话不能直接删除
 7     sql = """select count(*) as total from product where product_class_id=%s""" % (id,)
 8     # 读取记录
 9     result = db_helper.read(sql)
10     if result and result[0].get('total', -1) > 0:
11         return web_helper.return_msg(-1, "该分类已被引用,请清除对该分类的绑定后再来删除")
12 
13     # 编辑记录
14     sql = """delete from product_class where id=%s returning id"""
15     vars = (id,)
16     # 写入数据库
17     result = db_helper.write(sql, vars)
18     # 判断是否提交成功
19     if result:
20         return web_helper.return_msg(0, '成功')
21     else:
22         return web_helper.return_msg(-1, "删除失败")
复制代码

  在做删除前,需要判断一下这个分类是否已经被相关的产品引用绑定了,如果是的话,直接删除将会造成前端相关产品无法展示,所以需要做出提醒,让用户清除绑定后再进行删除操作。

  增改删操作都是对数据库的写操作,所以都使用db_helper.write()函数。

  在postgresql数据库中,returning是一个非常棒非常好用的函数,它可以指定返回的字段,即进行增改删操作后,将这些记录的指定字段值返回给我们,我们可以通过检查返回值是否存在来判定是否执行成功。而且在进行条件操作时,它能返回我们想要的主键id值,方便我们进行我们想要的操作,比如删除nosql缓存对应值。

 

  点击列表上面的添加按钮,会弹出一个小框,让用户输入新增记录值,如下图:

  

  接口代码:

复制代码
 1 @post('/api/product_class/')
 2 def callback():
 3     """
 4     新增记录
 5     """
 6     name = web_helper.get_form('name', '分类名称')
 7     is_enable = convert_helper.to_int0(web_helper.get_form('is_enable', '是否启用'))
 8 
 9     # 添加记录(使用returning这个函数能返回指定的字段值,这里要求返回新添加记录的自增id值)
10     sql = """insert into product_class (name, is_enable) values (%s, %s) returning id"""
11     vars = (name, is_enable)
12     # 写入数据库
13     result = db_helper.write(sql, vars)
14     # 判断是否提交成功
15     if result and result[0].get('id'):
16         return web_helper.return_msg(0, '成功')
17     else:
18         return web_helper.return_msg(-1, "提交失败")
复制代码

  post方式提交,我们使用web_helper.get_form()函数获取参数值

  

  编辑记录和添加记录一样,使用同一个窗口,但在接口上,它需要获取记录值和编辑后保存两个接口

  

复制代码
 1 @get('/api/product_class/<id:int>/')
 2 def callback(id):
 3     """
 4     获取指定记录
 5     """
 6     sql = """select * from product_class where id = %s""" % (id,)
 7     # 读取记录
 8     result = db_helper.read(sql)
 9     if result:
10         # 直接输出json
11         return web_helper.return_msg(0, '成功', result[0])
12     else:
13         return web_helper.return_msg(-1, "查询失败")
14 
15 @put('/api/product_class/<id:int>/')
16 def callback(id):
17     """
18     修改记录
19     """
20     name = web_helper.get_form('name', '分类名称')
21     is_enable = convert_helper.to_int0(web_helper.get_form('is_enable', '是否启用'))
22 
23     # 编辑记录
24     sql = """update product_class set name=%s, is_enable=%s where id=%s returning id"""
25     vars = (name, is_enable, id)
26     # 写入数据库
27     result = db_helper.write(sql, vars)
28     # 判断是否提交成功
29     if result and result[0].get('id'):
30         return web_helper.return_msg(0, '成功')
31     else:
32         return web_helper.return_msg(-1, "提交失败")
复制代码

  

  暂时还没有朋友说看不明白,所以就不往细说了,大家看代码注释,有人不明白提出后我再补上吧(最近太忙了,所以更新可能会有点慢,大家耐心等一等,我尽量抽空码完代码后更新上来的)。

  联系我们页面的前端代码与接口代码都在下载包中,大家自己比较一下自己处理的结果和我的是不是一样。

 





    本文转自 AllEmpty 博客园博客,原文链接:http://www.cnblogs.com/EmptyFS/p/7846746.html,如需转载请自行联系原作者





相关文章
|
17天前
|
安全 数据库 C++
Python Web框架比较:Django vs Flask vs Pyramid
【4月更文挑战第9天】本文对比了Python三大Web框架Django、Flask和Pyramid。Django功能全面,适合快速开发,但学习曲线较陡;Flask轻量灵活,易于入门,但默认配置简单,需自行添加功能;Pyramid兼顾灵活性和可扩展性,适合不同规模项目,但社区及资源相对较少。选择框架应考虑项目需求和开发者偏好。
|
5天前
|
API 数据库 数据安全/隐私保护
Flask框架在Python面试中的应用与实战
【4月更文挑战第18天】Django REST framework (DRF) 是用于构建Web API的强力工具,尤其适合Django应用。本文深入讨论DRF面试常见问题,包括视图、序列化、路由、权限控制、分页过滤排序及错误处理。同时,强调了易错点如序列化器验证、权限认证配置、API版本管理、性能优化和响应格式统一,并提供实战代码示例。了解这些知识点有助于在Python面试中展现优秀的Web服务开发能力。
22 1
|
1天前
|
存储 中间件 Go
探索Gin框架:快速构建高性能的Golang Web应用
探索Gin框架:快速构建高性能的Golang Web应用
|
1天前
|
安全 前端开发 JavaScript
在Python Web开发过程中:Web框架相关,如何在Web应用中防止CSRF攻击?
在Python Web开发中防范CSRF攻击的关键措施包括:验证HTTP Referer字段、使用CSRF token、自定义HTTP头验证、利用Web框架的防护机制(如Django的`{% csrf_token %}`)、Ajax请求时添加token、设置安全会话cookie及教育用户提高安全意识。定期进行安全审计和测试以应对新威胁。组合运用这些方法能有效提升应用安全性。
3 0
|
1天前
|
缓存 NoSQL 关系型数据库
在Python Web开发过程中:数据库与缓存,MySQL和NoSQL数据库的主要差异是什么?
MySQL与NoSQL的主要区别在于数据结构、查询语言和可扩展性。MySQL是关系型数据库,依赖预定义的数据表结构,使用SQL进行复杂查询,适合垂直扩展。而NoSQL提供灵活的存储方式(如JSON、哈希表),无统一查询语言,支持横向扩展,适用于处理大规模、非结构化数据和高并发场景。选择哪种取决于应用需求、数据模型及扩展策略。
10 0
|
2天前
|
开发框架 前端开发 数据库
Python从入门到精通:3.3.2 深入学习Python库和框架:Web开发框架的探索与实践
Python从入门到精通:3.3.2 深入学习Python库和框架:Web开发框架的探索与实践
|
2天前
|
数据采集 数据可视化 数据处理
Python从入门到精通的文章3.3.1 深入学习Python库和框架:数据处理与可视化的利器
Python从入门到精通的文章3.3.1 深入学习Python库和框架:数据处理与可视化的利器
|
4天前
|
XML Web App开发 测试技术
python的Web自动化测试
【4月更文挑战第16天】Python在Web自动化测试中广泛应用,借助Selenium(支持多浏览器交互)、BeautifulSoup(解析HTML/XML)、Requests(发送HTTP请求)和Unittest(测试框架)等工具。测试步骤包括环境搭建、编写测试用例、初始化浏览器、访问页面、操作元素、验证结果、关闭浏览器及运行报告。注意浏览器兼容性、动态内容处理和错误处理。这些组合能提升测试效率和质量。
11 6
|
5天前
|
SQL 中间件 API
Flask框架在Python面试中的应用与实战
【4月更文挑战第18天】**Flask是Python的轻量级Web框架,以其简洁API和强大扩展性受欢迎。本文深入探讨了面试中关于Flask的常见问题,包括路由、Jinja2模板、数据库操作、中间件和错误处理。同时,提到了易错点,如路由冲突、模板安全、SQL注入,以及请求上下文管理。通过实例代码展示了如何创建和管理数据库、使用表单以及处理请求。掌握这些知识将有助于在面试中展现Flask技能。**
12 1
Flask框架在Python面试中的应用与实战
|
8天前
|
SQL 安全 Go
如何在 Python 中进行 Web 应用程序的安全性管理,例如防止 SQL 注入?
在Python Web开发中,确保应用安全至关重要,主要防范SQL注入、XSS和CSRF攻击。措施包括:使用参数化查询或ORM防止SQL注入;过滤与转义用户输入抵御XSS;添加CSRF令牌抵挡CSRF;启用HTTPS保障数据传输安全;实现强身份验证和授权系统;智能处理错误信息;定期更新及审计以修复漏洞;严格输入验证;并培训开发者提升安全意识。持续关注和改进是保证安全的关键。
17 0