最近在看管理平台的源代码,没有文档和注释的代码看起来真是酸爽。但更难过的是python做后端没接触过,还有好多不熟悉的框架和包,让我的阅读进程变得异常艰难,对于我来说好多新概念。好了,废话不多说,一个一个啃哇!
Django
Django是python的一个开放源代码的优秀的Web框架。
ZeroRPC
ZeroRPC是python的一个包,在介绍它之前,首先介绍一下RPC远程过程调用。简单讲就是本地计算机调用远程计算机上的一个函数。
一个电脑程序触发远程计算机上的子程序的运行,和在本地调用方法一样,不需要程序员单独写与远程计算机交户的代码。即,无论子例程执行程序的本地代码还是远程代码,程序员编写的代码是相同的。这是一种客户机-服务器交互形式(调用者是客户机,执行者是服务器),通常通过请求-响应消息的传递方式实现。RPC是一种进程间通信(inter-process communication,IPC),因为不同进程有不同的地址空间。如果在同一主机上,它们即使物理地址空间相同,也会有不同的虚拟地址空间,如果位于不同的主机上,则物理地址空间是不同的。
Django搭建的系统需要找支持python的rpc服务。比较优秀的服务有SimpleXMLRPCServer和zerorpc。
zerorpc的底层使用ZeroMQ和MessagePack,速度快,响应时间短,并发度高。
在后端写代码时,会同时写server服务端和client客户端的代码,server上定义一些类和函数,然后通过.bind绑定url,client通过.connect来连接server绑定的url从而实现调用server里定义的类和函数。
ConfigParser
该模块可以将配置文件转化成对象,读配置文件,返回section,option对应的值。
配置文件sample.ini:
[book]
title:ConfigParser模块教程
time:2018-08-10 09:46:55
[size]
size:1024
[other]
blog:csdn.net
book,size,other都是section;title,time,size,blog都属于option
配置文件转化:
import ConfigParser
import string
config=ConfigParser.ConfigParser()
config.read(u'sample.ini')
print config.get("size","size")
#输出结果为1024
SQLAlchemy
数据表是一个二维表,把一个表的内容用python的数据结构表示,可以用一个list表示多行,每一个list元素是一个tuple元组。但是这样很难看出表结构,所以把一个tuple用class实例来表示,可以更容易的看出表结构,这是ORM技术,Object-Relational Mapping,把关系数据库表结构映射到对象上。在Python中,这个转换实现方法最有名的框架是SQLAlchemy。
SQLAlchemy是Python编程语言下的一款ORM框架,该框架建立在数据库API之上,使用关系对象映射进行数据库操作,简言之便是:将对象转换成SQL,然后使用数据API执行SQL并获取执行结果.
第一步,导入SQLAlchemy并初始化DBSession
# 导入:
from sqlalchemy import Column, String, create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
# 创建对象的基类:
Base = declarative_base()
# 定义User对象:
class User(Base):
# 表的名字:
__tablename__ = 'user'
# 表的结构:
id = Column(String(20), primary_key=True)
name = Column(String(20))
# 初始化数据库连接:
engine = create_engine('mysql+mysqlconnector://root:password@localhost:3306/test')
# 创建DBSession类型:
DBSession = sessionmaker(bind=engine)
Session:
数据库的Session主要目的是建立与数据库的会话,维护你加载和关联的数据库对象,是数据库查询的一个入口。在SQLAlchemy中,数据库的查询操作是通过查询query对象来实现。Session提供了创建Query对象的接口。
Query对象返回的结果是一组同一映射对象组成的集合,机和中的一个对象,对应与数据库表中的一行,所谓同一映射,只如果两个对象ID相同,则认为他们对应的是相同的对象。
要实现数据库查询,需要建立与数据库的连接。需要用到Engine对象。一个Engine可能关联一个Session对象,也可能关联一个数据库表。
创建session
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
some_engine = create_engine('nysql://username:password@localhost/mydb?charset=utf8')
session = sessionmaker(bind=some_engine) #创建一个session工厂
session = Session() #通过调用工厂方法来创建一个session对象
参数含义:dialect+driver:dialect+driver://username:password@host:port/database + “?param=xxxx”,如字符集“charset=utf8”(这是中文字符乱码的解决方案)如:engine = create_engine(“mysql+pymysql://root:oldboy@192.168.159.134:3306/day15?charset=utf8”, max_overflow=5)表示创建引擎,并在此基础上通过pymysql插件,连接数据库。同时创建数据库连接池,设置为5
create_engine支持连接池,
pool_size 连接数,
max_overflow 最多多几个连接,
pool_recycle 连接重置周期,
pool_timeout 连接超时时间
连接池是创建和管理一个连接的缓冲池的技术,这些连接准备好被任何需要它们的线程使用.每一次数据访问请求都必须经历建立数据库连接、打开数据库、存取数据和关闭数据库连接等步骤,而连接并打开数据库是一件既消耗资源又费时的工作,如果频繁发生这种数据库操作,系统的性能必然会急剧下降,甚至会导致系统崩溃。数据库连接池技术是解决这个问题最常用的方法。
数据库连接池的主要操作如下:
(1)建立数据库连接池对象(服务器启动)。
(2)按照事先指定的参数创建初始数量的数据库连接(即:空闲连接数)。
(3)对于一个数据库访问请求,直接从连接池中得到一个连接。如果数据库连接池对象中没有空闲的连接,且连接数没有达到最大(即:最大活跃连接数),创建一个新的数据库连接。
(4)存取数据库。
(5)关闭数据库,释放所有数据库连接(此时的关闭数据库连接,并非真正关闭,而是将其放入空闲队列中。如实际空闲连接数大于初始空闲连接数则释放连接)。
(6)释放数据库连接池对象(服务器停止、维护期间,释放数据库连接池对象,并释放所有连接)。
SQLAlchemy默认所使用的连接池为sqlalchemy.pool.QueuePool。当目前总连接数没有超过配置的上限且池中没有现成可用的连接的情况下,一个新的连接会被建立并返回给调用创建新连接的方法的程序。
session的生命周期
Session通常在我们需要对数据库进行操作时创建,一旦一个session创建成功,可以在这个session下完成多个使物,session的创建和关闭不定,但session不应该在操作事务的方法中创建
Alembic对数据库版本管理的使用方法
对于SQLALCHEMY ORM 定义的数据库,数据库的设计不一定能一步到位,在项目运行中ORM的定义model版本更改后,需要使用SQL修改数据库,当数据库结构复杂且存储数据较多时,更改起来就比较麻烦,alembic就是为了解决这个问题而产生的。通过alembic可以放心修改model中表的结构内容,数据库的具体修改交给alembic。用它实现模型类和数据库的同步更新。
代码模块化
还有比较重要的就是后端代码的模块话。python类,接口,继承,需要玩的出神入化啊,涉及到具体代码,就不多说了。
配置文件
这些个文件貌似我要努力看懂啊,弄懂每个含义。
参考资料:
https://blog.csdn.net/hedan2013/article/details/54863830
https://blog.csdn.net/yypsober/article/details/50818959
https://baike.baidu.com/item/连接池/1699713?fr=aladdin
https://blog.csdn.net/Yaokai_AssultMaster/article/details/80958052
https://www.cnblogs.com/koka24/p/5327280.html
https://www.cnblogs.com/yefeiyang/p/6271549.html
http://docs.sqlalchemy.org/en/latest/orm/extensions/declarative/api.html#sqlalchemy.ext.declarative.DeferredReflection
https://blog.csdn.net/Nero_G/article/details/53033342
https://www.cnblogs.com/turingbrain/p/6372086.html
http://www.runoob.com/django/django-tutorial.html