iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >我的第一个python web开发框架(
  • 543
分享到

我的第一个python web开发框架(

第一个框架python 2023-01-30 22:01:51 543人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

  前面ORM模块我们已经完成了开发,接下来要做的就是对项目代码进行重构了。因为对底层数据库操作模块(db_helper.py)进行了改造,之前项目的接口代码全都跑不起来了。   在写ORM模块时,我们已经对产品接口的分页查询、新增、修改

  前面ORM模块我们已经完成了开发,接下来要做的就是对项目代码进行重构了。因为对底层数据库操作模块(db_helper.py)进行了改造,之前项目的接口代码全都跑不起来了。

  在写ORM模块时,我们已经对产品接口的分页查询、新增、修改、获取指定产品实体接口已经重构好了,还剩下删除接口未完成

 1 @delete('/api/product/<id:int>/')
 2 def callback(id):
 3     """
 4     删除指定记录
 5     """
 6     # 编辑记录
 7     sql = """delete from product where id=%s returning id"""
 8     vars = (id,)
 9     # 写入数据库
10     result = db_helper.write(sql, vars)
11     # 判断是否提交成功
12     if result:
13         return WEB_helper.return_msg(0, '成功')
14     else:
15         return web_helper.return_msg(-1, "删除失败")

  如果前面代码有认真学习的小伙伴看到这段代码,要改成ORM方式应该很容易实现了

  只需要将第7行到第10行替换对应的调用代码就可以了

 1 @delete('/api/product/<id:int>/')
 2 def callback(id):
 3     """
 4     删除指定记录
 5     """
 6     # 实例化product表操作类ProductLogic
 7     _product_logic = product_logic.ProductLogic()
 8     result = _product_logic.delete_model(id)
 9     # 判断是否提交成功
10     if result:
11         return web_helper.return_msg(0, '成功')
12     else:
13         return web_helper.return_msg(-1, "删除失败")

  首先是初始化产品逻辑层操作类,然后调用delete_model()这个方法就可以了

  当你习惯这种写法以后,你会发现实现各个接口会变得非常的简单与方便,开发速度比之前也提升了很多

  产品分类相关接口(product_class.py)与产品相关接口(product.py)功能差不多,具体实现我就不一一讲解了,大家可以自己试试

 

  产品分类的删除分类接口大家会看到它的代码与产品删除接口差不多,不过多了一个该分类是否已经被引用的一个判断,对于这个下面专门说明一下

 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, "删除失败")

  这段代码后半部分可以参考产品的删除接口实现,前半部分需要调用产品方法进行判断处理。

  在编写时我们会发现,我们的ORM并没有直接判断记录是否存在的方法,只有一个用于获取指定条件记录数的方法。

  一般来说,我们在开发时发现ORM没有自己想要的方法时,我们需要做以下思考:

  1.有没有替代可以实现的方法存在

  2.该功能是否是常用的功能,能否封装成公共方法,如果可以就将它封装到逻辑层基类(ORM模块)中去,让所有继承的子类都拥有这个功能

  3.如果它只是对指定表单操作时才用到,就将它封装到该逻辑层子类,方便该子类要用到时可以随时调用

  这段代码的要求是判断指定的分类是否被产品引用,抽象出来的意思就是判断指定条件的记录是否存在,对于这个功能有开发经验的小伙伴很容易判断它是很多地方都有可能要用到的通用方法,所以我们需要在ORM中增加一下这个方法。而我们ORM已经存在get_count()这个获取记录数的方法存在了,我们可以通过调用这个方法来判断记录数量是否大于0,来得出指定条件的记录是否存在这样的结果。

    def exists(self, wheres):
        """检查指定条件的记录是否存在"""
        return self.get_count(wheres) > 0

  有了这个方法,我们就可以继续对产品分类删除接口进行改造了

 1 @delete('/api/product_class/<id:int>/')
 2 def callback(id):
 3     """
 4     删除指定记录
 5     """
 6     # 实例化product表操作类ProductLogic
 7     _product_logic = product_logic.ProductLogic()
 8     # 判断该分类是否已经被引用,是的话不能直接删除
 9     if _product_logic.exists('product_class_id=' + str(id)):
10         return web_helper.return_msg(-1, "该分类已被引用,请清除对该分类的绑定后再来删除")
11 
12     # 实例化product_class表操作类product_class_logic
13     _product_class_logic = product_class_logic.ProductClassLogic()
14     result = _product_class_logic.delete_model(id)
15     # 判断是否提交成功
16     if result:
17         return web_helper.return_msg(0, '成功')
18     else:
19         return web_helper.return_msg(-1, "删除失败")

  通过这个例子,大家在实际开发过程中,可以灵活的根据自己需要,来增加或改造对应的底层方法,积累你自己的底层框架代码,那么随着开发时间的增加,你开发起各种功能来就会越加得心应手了。

 

  细心的朋友会发现,ORM模块的缓存部分,多了一个get_model_for_cache_of_where()方法,下面我来说明一下它的用途。

  我们在开发时,除了通过主键id来获取记录实体以外,在有的数据表中,还会存在第二个主键,或多个主键的情况,我们需要通过这些主键来获取对应的记录实休,比如说管理员或用户表中的登录账号字段;订单表中的订单编码字段等。

  正常情况下,我们直接通过get_model()方法就可以读取对应的记录了,如果我们想减少数据库的查询,直接在缓存中如何使用呢?直接存取记录实体,由于这些额外的主键并没有与ORM中的编辑与删除操作关联,即在进行编辑与删除操作时不会同步更新用其他主键存储的实体内容,这样就会产生脏数据。所以我们可以换一种思路来实现,我们可以将这些额外的主键和对应的值生成缓存组合key,里面存储对应的记录实体id,也就是说在存储记录实体时,还是使用原来的主键id存储该实体,然后用额外主键和对应值生成缓存组合key中存储主键id,在获取记录实体时,先用这个组合key提取对应的id,再用这个id来获取记录实体。这个说明好像有点绕,大家自己debug一下就很容易明白其中的原理了,下面看代码:

 1     def get_model_for_cache_of_where(self, where):
 2         """
 3         通过条件获取记录实体————条件必须是额外的主键,也就是说记录是唯一的(我们经常需要使用key、编码或指定条件来获取记录,这时可以通过当前方法来获取)
 4         :param where: 查询条件
 5         :return: 记录实体
 6         """
 7         # 生成实体缓存key
 8         model_cache_key = self.__table_name + encrypt_helper.md5(where)
 9         # 通过条件从缓存中获取记录id
10         pk = cache_helper.get(model_cache_key)
11         # 如果主键id存在,则直接从缓存中读取记录
12         if pk:
13             return self.get_model_for_cache(pk)
14 
15         # 否则从数据库中获取
16         result = self.get_model(where)
17         if result:
18             # 存储条件对应的主键id值到缓存中
19             cache_helper.set(model_cache_key, result.get(self.__pk_name))
20             # 存储记录实体到缓存中
21             self.set_model_for_cache(result.get(self.__pk_name), result)
22             return result

  下面改造调用例子(请查看login.py第35行附近)

1     ##############################################################
2     ### 获取登录用户记录,并进行登录验证 ###
3     ##############################################################
4     sql = """select * from manager where login_name='%s'""" % (username,)
5     # 从数据库中读取用户信息
6     manager_result = db_helper.read(sql)
7     # 判断用户记录是否存在
8     if not manager_result:
9         return web_helper.return_msg(-1, '账户不存在')

  我们可以改造为:

1     ##############################################################
2     ### 获取登录用户记录,并进行登录验证 ###
3     ##############################################################
4     _manager_logic = manager_logic.ManagerLogic()
5     # 从数据库中读取用户信息
6     manager_result = _manager_logic.get_model_for_cache_of_where('login_name=' + string(username))
7     # 判断用户记录是否存在
8     if not manager_result:
9         return web_helper.return_msg(-1, '账户不存在')

 

  还有登录接口最底部,更新管理员最后登录时、登录ip和累加登录次数需要改造,具体代码如下:

1 ##############################################################
2     ### 更新用户信息到数据库 ###
3     ##############################################################
4     # 更新当前管理员最后登录时间、Ip与登录次数(字段说明,请看数据字典)
5     sql = """update manager set last_login_time=%s, last_login_ip=%s, login_count=login_count+1 where id=%s"""
6     # 组合更新值
7     vars = ('now()', ip, manager_id,)
8     # 写入数据库
9     db_helper.write(sql, vars)

  我们可以更改为:

 1     ##############################################################
 2     ### 更新用户信息到数据库 ###
 3     ##############################################################
 4     # 更新当前管理员最后登录时间、Ip与登录次数(字段说明,请看数据字典)
 5     fields = {
 6         'last_login_time': 'now()',
 7         'last_login_ip': string(ip),
 8         'login_count': 'login_count+1',
 9     }
10     # 写入数据库
11     _manager_logic.edit_model(manager_id, fields)

  对于字段值,如果为字符串、具体时间、JSON等类型的,也就是说需要用单撇号括起来的,我们就需要调用string_helper模块的string方法进行转换,它可以为变量增加单撇号,如果直接赋字符串值,生成的sql语句是没有单撇号的,这里要注意一下

  如果是数值类型,直接写值就可以了,当然直接赋字符串值也没有关系,因为生成sql是不会自动添加单撇号的

  如果要赋postgresql系统变量,如now(),直接像上面这样写就可以了

  如果字段是数值型,要让它进行计算,直接像上面这样写也行,可以是多个字段用加号连起来。当然你也可以将字段时读出来进行计算后再赋值提交也没有问题

  具体操作需要大家自己多debug,多测试使用才知道怎么应用到真实项目中。

 

 

  本文对应的源码下载

 

版权声明:本文原创发表于 博客园,作者为 AllEmpty 本文欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则视为侵权。

python开发QQ群:669058475(本群已满)、733466321(可以加2群)    作者博客:Http://www.cnblogs.com/EmptyFS/

--结束END--

本文标题: 我的第一个python web开发框架(

本文链接: https://www.lsjlt.com/news/179250.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 我的第一个python web开发框架(
      前面ORM模块我们已经完成了开发,接下来要做的就是对项目代码进行重构了。因为对底层数据库操作模块(db_helper.py)进行了改造,之前项目的接口代码全都跑不起来了。   在写ORM模块时,我们已经对产品接口的分页查询、新增、修改...
    99+
    2023-01-30
    第一个 框架 python
  • 37 个 Python Web 开发框架总结
    Q:Web 框架到底是什么?A:Web 框架主要用于网站开发。开发者在基于 Web 框架实现自己的业务逻辑。Web 框架实现了很多功能,为实现业务逻辑提供了一套通用方法。Q:Web 框架有什么作用?A:使用 Web 框架,很多的业务逻辑外的...
    99+
    2023-05-14
    Python Web 开发框
  • web开发框架Flask学习一
    flask框架 用Python做Web开发的三大框架特点 Django 主要特点是大而全,集成了很多的组件,例如:Admin Form Model等,不管你用不用的到,他都会为 ...
    99+
    2023-01-30
    框架 web Flask
  • Spring框架 vs. Python:哪个更适合Web开发?
    Spring框架和Python都是非常受欢迎的Web开发工具。但是,在选择一个开发工具时,您需要考虑许多因素。在本文中,我们将比较Spring框架和Python,并讨论它们在Web开发方面的优缺点。 Spring框架是一个Java开发框架,...
    99+
    2023-09-16
    bash spring load
  • Python开发自定义Web框架
    文章目录 开发自定义Web框架1.开发Web服务器主体程序2.开发Web框架主体程序3.使用模板来展示响应内容4.开发框架的路由列表功能5.采用装饰器的方式添加路由6.电影列表页面的开发案例...
    99+
    2023-10-04
    python 服务器 后端
  • python中web开发框架有哪些
    python中的web开发框架有Django、web.py、Bottle、Flask常见的几种DjangoDjango是一个开放源代码的Web应用框架,由Python编写,其采用了MTV框架模式,具有易维护、高度可定制和可扩展的特点。web...
    99+
    2024-04-02
  • Python web开发框架Pyramid怎么用
    要使用Python web开发框架Pyramid,你需要按照以下步骤进行操作: 安装Pyramid:使用pip命令安装Pyram...
    99+
    2023-10-23
    Python Pyramid
  • Web开发最佳的Python框架有哪些
    这篇文章将为大家详细讲解有关Web开发最佳的Python框架有哪些,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Python 时目前最流行和代码最高效的编程语言之一。Python框架能帮助你...
    99+
    2023-06-19
  • Python中的Web开发框架怎么使用
    这篇文章主要介绍了Python中的Web开发框架怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Python中的Web开发框架怎么使用文章都会有所收获,下面我们一起来看看吧。在开始之前,我们先要安装好需要...
    99+
    2023-07-06
  • Python Web开发用Flask还Django框架好
    本篇内容主要讲解“Python Web开发用Flask还Django框架好”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python Web开发用Flask还Django框架好”吧!是否有考虑过...
    99+
    2023-06-02
  • Python使用Web框架Flask开发项目
    目录一、简介二、安装三、从 Hello World 开始3.1 Hello World3.2 修改Flask的配置3.3 调试模式3.4 绑定IP和端口3.5 本节源码四、获取 UR...
    99+
    2024-04-02
  • 如何用Python写一个简单的Web框架
    如何用Python写一个简单的Web框架,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。一、概述在Python中,WSGI(Web Server Gateway ...
    99+
    2023-06-17
  • ASP、Django、Linux:哪个是最好的Web开发框架?
    Web开发框架是现代Web应用程序开发的核心。它们提供了一种简单而直观的方法来组织代码、构建功能和管理数据。ASP、Django、Linux是目前最受欢迎的Web开发框架之一,但哪个是最好的呢?在本文中,我们将深入探讨这些框架的优缺点,并为...
    99+
    2023-09-20
    django linux 文件
  • PHP 和 Django:哪个是更好的 Web 开发框架?
    Web 开发框架是现代 Web 应用程序开发的核心。许多编程语言都有自己的 Web 开发框架。在 PHP 和 Django 之间,很多人都在争论哪个更好。在本文中,我们将探讨 PHP 和 Django 的优缺点,以帮助您决定哪个框架更适合...
    99+
    2023-08-28
    django ide 对象
  • python实现一个简单的web应用框架
    目录引言写应用框架需要写底层服务器么uwsgi基本使用安装uwsgi配置uwsgiuwsgi常用配置uwsgi启服和停服启动一个demo写一个简单的web应用框架总结引言 本篇文章所...
    99+
    2023-05-18
    python web应用框架 python web
  • 利用Python创建第一个Django框架程序
    目录一.环境变量二.创建Django框架程序三.控制台四.实现Django的应用五.启动项目六.小结一.环境变量 右键我的电脑–>>属性–>...
    99+
    2024-04-02
  • web开发框架Flask学习二
    jinja2模板规范 在当前项目中创建一个文件为templates的文件夹,将其设置为模板文件夹,新建的html为模板页面, 在视图函数中使用render_template(".html的文件", my_...
    99+
    2023-01-30
    框架 web Flask
  • web开发框架之Django基础
      在脚本中如何进行Django的运行 if __name__ == '__main__': import os import django # 注意路径(当前所在的位置,要加载Django的配置文件) ...
    99+
    2023-01-30
    框架 基础 web
  • web前端框架开发是啥
    Web前端框架,是一种助力Web前端开发的工具,它们在JavaScript编程语言基础之上,往往提供了一些抽象层和约束,以便开发人员能够更加迅速地编写出高质量的Web前端应用。Web前端框架有多种,比如目前最为流行的React、Angula...
    99+
    2023-05-20
  • Python开发自定义Web框架的示例详解
    目录开发自定义Web框架1.开发Web服务器主体程序2.开发Web框架主体程序3.使用模板来展示响应内容4.开发框架的路由列表功能5.采用装饰器的方式添加路由6.电影列表页面的开发案...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作