我的第一个python web开发框架系列博文从17年6.7月份开始写(存了近十章稿留到9月份才开始发布),到今天结束,一年多时间,想想真不容易啊. 整个过程断断续续,中间有段时间由于工作繁忙停了好长时间,到今年6月份才稍微能挤出些时间来,想想自己年初定下的目标,咬咬牙重新开动,几个月坚持下来,比自己预计目标提前了3个多月时间完成了. 整个系列引用几个虚拟角色聊天的方式来展开说明,是因为很多开发常识,如果在代码中间冒然插入会感觉很突然,而使用聊天问问题的方式来展开说明,可能会更容易理解.当然后面…
接下来正式进入网站的功能开发.要完成后台管理系统登录功能,通过查看登录页面,我们可以了解到,我们需要编写验证码图片获取接口和登录处理接口,然后在登录页面的HTML上编写AJAX. 在进行接口开发之前,还有一个重要的事情要处理,那就是对站点进行初始化,如果不进行初始化,那么独立文件编写的接口将会找不到,要将异常错误写入日志文件也会找不到路径,下面先上代码. 打开main.py文件,改为下面代码(大家可以比较一下和之前代码有什么不同) #!/usr/bin/evn python # coding=u…
这是后台管理系统最后一个功能,产品管理,它的接口与页面功能与上一章差不多. 获取产品列表接口 @get('/api/product/') def callback(): """ 获取列表数据 """ # 设置查询条件 wheres = '' # 产品分类id product_class_id = convert_helper.to_int0(web_helper.get_query('product_class_id', '', is_check…
由于之前经验不是很丰富,写的C#系统太过复杂,所以一直想重写,但学的越多越觉得自己懂的越少,越觉的底气不足.所以一直不敢动手,在内心深处对自己讲,要静下心来认真学习,继续沉淀沉淀.这两年多以来找各种机会去参加各种沙龙或交流会,有空时就啃啃技术书籍,又或者看看一些文章或源友,努力向博客园大牛们学习. 由于工作关系,这两年很少接触C#,一直在做产品设计.项目设计.架构设计,15年底公司有机会参加了个小项目开发,使用的是python语言开发web版的TMS,从而一发不可收拾喜欢上了python.在体验…
小白与小美公司经过几次接触商谈,好不容易将外包签订了下来,准备开始大干一场.不过小白由于没有太多的项目经验,学过python懂得python的基本语法,在公司跟着大家做过简单功能,另外还会一些HTML和Jquery,对数据库一知半解,看来要完成这个项目也不是一件容易的事情.想到这些小白顿时头都大了起来,想要开干却无从下手,所以只能找对自己挺照顾的部门老大请教一下. 人物介绍:老菜,部门老大,IT老民工,有着十多年开发经验的码农,做过各种项目,开发经验十分丰富,是个热心助人的老好人. 小白:老大救…
在周末的一个早上,小白还在做着美梦,就收到了小美的连环追魂call,电话一直响个不停. 小白打着哈欠拿起电话:早上好美女. 小美:出事了出事了,我们公司网站一早访问是一片空白,什么内容都没有了,你赶急上去看看是怎么回事. 小白一听到马上紧张了起来,赶紧说:好的,我先看看,一会回电话给你. 小白说完赶紧打开电脑,登录网站查看,发现网站内容不见了,然后登录后台查看,发现后台产品记录都不见了,公司简介和联系我们也是空白的...... 小白赶紧打通小美电话,和她沟通了起来:这是什么时候发现的?你们网站最…
由于我们前后台系统没有分开,所以前台页面调用接口时,可以直接使用后台管理系统已经完成的接口,不过后台管理系统接口的访问加上了登录验证,所以需要将前台要用到的接口进行处理,让它们设置到白名单当中 我们打开main.py文件,在勾子函数中@hook('before_request')中找到下面代码 # 过滤不用做任何操作的路由(即过滤不用进行判断是否登录和记录日志的url) if path_info in ['/favicon.ico', '/', '/api/verify/']: return 这…
在上一章中,我们已经创建好ORM的基类了,接下来要做的就是将基类的常用方法一一实现. 首先我们来看看之前项目中,最常见的获取指定主键的记录实体 @get('/api/product/<id:int>/') def callback(id): """ 获取指定id的产品记录实体 """ sql = """select * from product where id = %s"""…
几个复杂的ORM方式都已介绍完了,剩下一些常用的删除.获取记录数量.统计合计数.获取最大值.获取最小值等方法我就不一一详细介绍了,直接给出代码大家自行查看. #!/usr/bin/env python # coding=utf-8 from common import db_helper class LogicBase(): """逻辑层基础类""" def __init__(self, db, is_output_sql, table_name…
小白中午听完老菜讲的那些话后一直在思考,可想来想去还是一头雾水,晕晕呼呼的一知半解,到最后还是想不明白,心想:老大讲的太高深了,只能听懂一半半,看来只能先记下来,将明白的先做,不明白的等以后遇到再学. 到晚上下班后回到家里,打开电脑开始写起代码来......(传送门: python开发环境搭建 ) 要写一个web服务,首先要做的就是实现程序的入口,所以先来个Hello World吧 1.创建项目 先在电脑创建这个目录 E:\Python\simple\code (一定要全英文,因为IDE有可能不…
小白中午听完老菜讲的那些话后一直在思考,可想来想去还是一头雾水,晕晕呼呼的一知半解,到最后还是想不明白,心想:老大讲的太高深了,只能听懂一半半,看来只能先记下来,将明白的先做,不明白的等以后遇到再学. 到晚上下班后回到家里,打开电脑开始写起代码来......(传送门: python开发环境搭建 ) 要写一个web服务,首先要做的就是实现程序的入口,所以先来个Hello World吧 1.创建项目 先在电脑创建这个目录 E:\Python\simple\code (一定要全英文,因为IDE有可能不…
第一部分说明 第一部分大概有20来章,主要讲的是一些开发常识.开发前中后期准备内容.开发环境与服务器部署环境安装设置.python基础框架结构与功能等内容,代码会比较简单. 本系列会以故事的方式,向大家描述一位有点开发基础的程序猿,怎么将一个小系统,根据需求的增加,以及对技术的追求,慢慢的通过重构,在解决各种技术难题的过程中,完善自己的架构,开发出一个功能比较完善的开发框架.代码开始会写的比较简单.入门级的,然后会根据需求慢慢重构成有体系的框架. 主人公:小白——计算机专业刚毕业的程序猿,有点内…
PS:本系列内容进度节奏会放的很慢,每次知识点都尽量少一点,这样大家接触的知识点少了,会更容易理解,因为少即是多.另外,对于后面代码部分,虽然尽量不用那些复杂的封装和类,但它并不表示看了就能全部记住,并懂得每个函数的用法,在什么时候去调用,清楚它输入的参数类型.能处理的参数类型和输出的结果是什么.它需要动手去调用,去大量的测试,这样才能真正掌握.对于初学者,最好将这些函数和测试用例全都照着录入一次,你会有不一样的体会,我自己去学习一个新框架时,都会尽量将底层的代码亲手录入一次,而不是用复制粘贴.…
PS:原先是想直接进入功能开发,要用到什么函数时再创建,这样也容易熟悉每个函数的由来和使用方法,但考虑到这样操作,到时会经常在不同文件间切换,不好描述,容易造成混乱,所以还是使用函数库这种方式来说明. 下面来说说工具函数包,如果想要快速学会一个新的框架,首先要做的事情就是熟悉工具函数包,一方面,能快速知道有哪些基本功能可以直接调用,不用重复造轮子:另一方面,查看项目代码时,会比较快的进入角色,能看明白很多代码是做什么用的,因为工具函数包被调用的机率是最大的. 那么怎么学习呢?当然是有节奏有计划的…
string_helper.py是字符串操作包,主要对字符串进行检查.过滤和截取等处理. #!/usr/bin/evn python # coding=utf-8 import re def check_string(text, pattern): """ 检查字符串是否符合指定规则 :param text: 需要检查的字符串 :param pattern: 正式表达式,如:'^[a-zA-Z]+$' :return: 含有指定字符时返回真,否则为假 ""…
完成登录以后,就会进入后台管理系统的主界面,因为这个是小项目,所以导航菜单全部固化在HTML中,不能修改.一般后台还会有一个欢迎页或关键数据展示的主页面,小项目也没有多大的必要,所以登录后直接进入公司介绍编辑页面. 首先我们来看一下公司介绍页面内容 看上去功能好像很简单,其实我们要处理的东西还是挺多的. 从页面上看,我们需要有一个记录读取的接口,来获取公司介绍的内容,并展示在页面上.当然现在数据库里面没有记录存在,所以我们还需要向数据库的信息表(infomation)中插入一条公司介绍的记录,这…
这个小网站终于成功上线,小白除了收获一笔不多的费用外,还得到女神小美的赞赏,心中满满的成就感.这一天下班后,他请老菜一起下馆子,兑现请吃饭的承诺,顺便让老菜点评一下. 小白:老大,在你的指导下终于完成了我人生当中第一个项目,非常感谢. 老菜:挺不错的,在这么短时间完成了一个项目,值得祝贺一下. 小白:老大,代码你看了没有,你觉得有什么问题或需要改进的地方吗? 老菜:你自己完成后,重新查看代码有什么想法? 小白:嗯,我觉得有好多地方代码都是一样的,重复的,复制粘贴后改起来容易出错,其他的有些地方感…
前面的菜单.部门.职位与管理员管理功能完成后,接下来要处理的是将它们关联起来,根据职位管理中选定的权限控制菜单显示以及页面数据的访问和操作. 那么要怎么改造呢?我们可以通过用户的操作步骤来一步步进行处理,具体思路如下: 1.用户在管理端登录时,通过用户记录所绑定的职位信息,来确定用户所拥有的权限.我们可以在登录接口中,将该管理员的职位id存储到session中,以方便后续的调用. 2.登录成功后,跳转进入管理界口,在获取菜单列表时,需要对菜单列表进行处理,只列出当前用户有权限的菜单项. 3.在点…
书接上一回,小白和老菜聊到代码的版本控制和接口文档 小白:为什么要做版本控制,我不弄版本控制不也完成了项目了吗?要做版本控制不是很麻烦,又要安装服务又要提交代码,代码又不是多人用开发,还要写文档...... 老菜:这就是你这些小白的思维,只看眼前不思长远.对于任何一个项目,你都不可能绝对的说它永远都是一个小项目:而项目完成后,同时也面临着不停的变更与修改,你不可能永远记得这个项目任何细节,随着时间的流逝,很多关键点与细节在你的记忆中就会变得越来越模糊,到时要重新修改时你就头大了.我之前有位同事,…
写到这里,基本的ORM功能就完成了,不知大家有没有发现,这个ORM每个方法都是在with中执行的,也就是说每个方法都是一个完整的事务,当它执行完成以后也会将事务提交,那么如果我们想要进行一个复杂的事务时,它并不能做到,所以我们还需要对它进行改造,让它支持sql事务. 那么应该怎么实现呢?我们都知道要支持事务,就必须让不同的sql语句在同一个事务中执行,也就是说,我们需要在一个with中执行所有的sql语句,失败则回滚,成功再提交事务. 由于我们的逻辑层各个类都是继承ORM基类来实现的,而事务的开…
小白做好前端html设计后,马上开始进入数据库结构设计步骤. 在开始之前,小白回忆了一下老大在公司里培训时讲过的数据库设计解说: 对于初学者来说,很多拿到原型时不知道怎么设计数据表结构,这是很正常的事,可以通过借鉴别人的项目总结经验,慢慢就会了. 拿到原型后,我们要认真观察原型里显示的内容有那些,考虑一下这些内容中那些是不变的,即写死在页面中的,那些是需要后台更改变动的,将这些变动的记录下来,添加到数据字典中.在记录这些字段时,还要做的事就是分类,一个类别就是一个数据表.(当然如果初学者很牛的话…
中午吃饭时间到了,小白赶紧向老菜坐的位置走过去. 小白:老大,中午请你吃饭. 老菜:哈哈...又遇到问题了吧,这次得狠狠宰你一顿才行. 小白:行行行,只要您赏脸,米饭任吃,嘻嘻,我们边走边聊. ...... 小白:老大,我照您上次讲的办法都做完了,一步步执行,方向和条理清晰了很多,现在马上要进入编码了,所以想让您再指点一下. 老菜:嗯嗯,做的还不错嘛,孺子可教也. 编码相关的一些内容也是老生常谈的东西,它就好像起一座高楼大厦,如果没有设计图纸,没有将基础打好,那么可想而知建造出来的质量怎么样了.…
PS:再次说明一下,原本不想写的太啰嗦的,可之前那个系列发布后发现,好多朋友都想马上拿到代码立即能上手开发自己的项目,对代码结构.基础常识.分类目录与文件功能结构.常用函数......等等什么都不懂,然后就想使用,我真的很无语,还有一些朋友有十几年开发经验也会问一些很基础的问题,我都不知道怎么回答了.一下子拿到整个项目的代码,初学者要上手并不是那么容易的事情,很多代码经过层层封装后,反复跳转调用,不弄晕就很不容易了,所以得一步步来,了解整个代码的发展历程,知道它是怎么变化的,了解常用代码函数的使…
和老大聊完后,小白回家接收到相关工具函数包后,就按要求开始干活,首先要做的是熟悉配置参数和了解工具函数有哪些实用的工具. 由于这个项目比较简单,所以不用创建那么多分类,只需要api.common.config.log和test五个目录就可以了 打开PyCharm,在前面的Hello World项目里分别创建好上面的目录(如下图),然后将相关文件拷贝到相应文件夹里 config文件夹里是const.py文件,这是一个存储常量的配置文件,在开发的过程中,可以将各种常量配置统一放到这里来,方便管理.…
db_helper.py是数据库操作包,主要有两个函数,分别是read()数据库读操作函数和write()数据库写操作函数.这个包的代码是从小戴同学分享的博文改造过来的. #!/usr/bin/env python # coding=utf-8 import psycopg2 from common import log_helper from config import const # 初始化数据库参数 db_name = const.DB_NAME db_host = const.DB_HO…
mail_helper.py是邮件操作包,用来发送邮件的. #!/usr/bin/evn python # coding=utf-8 import smtplib from email.mime.text import MIMEText from traceback import format_exc from config import const # 初始化邮件参数 smtp = const.SMTP port = const.PORT user = const.EMAIL_USER pas…
产品分类管理的html页面之前忘记做了,这次附件里补上. 好了先上图 从页面效果图来看,我们需要开发列表获取接口.添加接口.单条记录获取接口.编辑接口和删除接口 对于产品分类列表,我们将使用jqgrid前端表格框架,jqgrid与接口交互时,它会提交页面索引.页面大小.排序字段名以及顺序还是倒序排序这几个参数,而返回的结果也有格式约束. 返回格式要求: { 'records': 0, 'total': 0, 'page': 1, 'rows': [], } 产品分类列表获取接口 @get('/a…
好不容易小白将系统开发完成,对于发布到服务器端并没有什么经验,于是在下班后又找到老菜. 小白:老大,不好意思又要麻烦你了,项目已经弄完,但要发布上线我还一头雾水,有空帮我讲解一下吗? 老菜:嗯,系统上线并不一件简单的事情,它可大可小.如果准备不充分,有可能会很多问题出现.你认为写好代码后要怎么发布? 小白:呃,完成开发后,上传到服务器,然后浏览器可以正常访问... 老菜:看来得普及一下上线的相关知识才行. 正规的产品上线一般可以按下面几个步骤来进行: 1. 开发人员自测(开发环境) 2. 测试人…
后台权限和底层框架的改造终于完成了,小白也终于可以放下紧悬着的心,可以轻松一下了.这不他为了感谢老菜,又找老菜聊了起来. 小白:多谢老大的帮忙,系统终于改造完成了,可以好好放松一下了. 老菜:呵呵,对于后台管理系统功能,你觉得已经完工了吗?没有什么遗漏的吗? 小白:啊......权限管理完成后不就完了吗?还有功能要弄的吗? 老菜:如果光从使用角度来说,也可能说完成了,但还有一些细节还需要处理的,比如说日志和异常. 小白:前面不是做过日志处理了,将所有的异常都自动写到日志中,方便开发人员分析查看,…
后台管理员的管理功能,它主要用来管理后台的登录账号,绑定权限,当然如果想将后台管理扩展成企业相关管理系统,比如用于公司人事管理,在这个基础上进行适当扩展就可以了. 我们先看看界面效果(也可以看着数据字典来写页面和接口) 看起来功能项还是不少,管理员也可以直接改为员工管理.列表没有什么特别的地方,所以接口也比较简单,不详细讲解.当然你也可以在这个基础上增加一下按姓名.手机.账号.部门和职位等查询条件上去 @get('/api/system/manager/') def callback(): "&…