| Django背景2005年发布的django,前身是2003年开始的,一只于Kansas的World online小组在维护一堆报社官网的过程中积累了大量实践后,有意识的整合为快速可定制的CMS系统,2005年从文档到工具链都成熟的时候开始开源发布。 Django的来源决定了它本身就与其他框架不同,这是有先有的实践成功的案例再发布的,这就导致从一开始,它的目的都非常实用务实。 项目流程1.需求分析需求分析(包含developer的评审),评审后,将需求转化为系统功能点,评估开发时长,反馈给产品经理/项目经理,设定开发团队ddl,避免无效开发。理解,各个环节的理解,尤其对需求的理解至关重要,差之毫厘谬以千里。
 系统的实现当以满足用户需求为第一要义,无法满足需求的产品也没有开发和维护的必要(现存技术手段允许的前提下)
 1.1需求文档是开发与产品交流的产物。必不可少。中长期项目,文档是必要的,追溯需求,追溯问题。以blog为例:需求描述:
  以此简单的需求描述为例,缺乏细节,仅以此为纲势必会出现与产品的构思不符的东西,从而产生无谓的返工。需求评审和分析是必要的。
 1.2需求评审、分析经验丰富的产品经理来说,做任何需求都需要足够细致,落实到每个功能点,需要原型稿,可通过原型对每一个功能点逐一核对对技术,评审目的有三:
 1.明确所有需求,避免歧义
 2.明确技术可行性,避免延期或需求修改
 3.确认工期,是否需要分期开发
 还是以博客为例。博客需求评审环节如下:
  
  
  评审过后,所有开发都有必要理解产品经理的需求,需求点的作用及背景,通过消化需求点来开发,而不是单纯的用代码翻译需求文档。
 用户需求第一,技术复杂度第二。有了详实的需求列表后,在进行功能分析
 功能分析根据需求列表,推导,博客所需功能点如下:
  
  模块划分有了足够细致的功能列表,开发应当能确定做出什么样的功能来,但还需要有人来整体梳理,把相关的功整理成一个模块,抽象出实体这个过程就需要建模,建立系统模型及数据模型。可以用到UML,统一建模语言。常用建模方法,通过UML画例图,整理需求,然后画出序列图,整理系统各模块交互逻辑,最后通过模型来实现。除此以外,针对数据模型部分,需要先画出ER图,entity Relationship Diagram,实体关系图,来理清楚不同数据模型之间的关系。好的ER工具可以直接生成建表语句及模型代码。
 产品经理需要整理出所有的用户需求,输出产品需求文档PRD给开发人员,开发人需要提取出实体以及各模块之间的交互关系。
 通过xmind来梳理功能点,拆分成为一个个独立的任务并将其放到Trello的card上或者Jira任务中,方便管理开发进度。
 博客为例,实体关系:
  梳理清楚后,通过在线ER工具,将结构化出来,可以通过PonyORM,是python的一个库,提供的在线工具来画出对象实体模型:
 
  接下来做的才是真正的模块划分,之前是更清晰的了解需求实体及关系,这里需要对模块和模块之间解耦,对于同时的多人协作项目来说,可以分配独立模块进行开发。
 譬如,用户端功能可以分为下四类:
 
  管理后台的功能分为下两类:
 
  实际上从开发角度说,管理后台在模块划分的时候还可以进行横向活纵向划分 横向是指按照模型层业务层页面曾划分任务,每个模块是一个独立的层,好处是每一层只涉及当前层的操作,比如模型models都是在做跟数据库交互的工作,缺点是相互之有依赖,需要先行定好接口才能开发。
 纵向就是把文章管理的部分,模型业务和页面划分到一起,按照业务的方式划分,好处是每块内容相互独立,没有依赖,缺点是每个模块都有人是做的从前到后的开发。
 
  2.WSGI-Web框架基础WSGI, Web Server Gateway Interface ,web服务器网关接口。python定义的网管协议,规定了web server如何与app交互。协议目的,包正在python种,所有web server程序,能通过统一的协议跟web框架,进行交互。理解WSGI的运作非常重要,python大部分web框架实现了此协议,也是用WSGI来部署
 2.1 简单的web server了解WSGI前,先看socket的web服务代码,通过监听本地8000端口,接收客户端发来的数据,返回对应的HTTP响应: import socket
EOL1 = b'\n\n'
EOL2 = b'\n\r\n'
body = '''Hello, world <h1> from 鸡蛋仔 </h1>'''
response_params = [
	'HTTP/1.0 200 OK',
	'Date: Sun, 3 March 2022 01:01:01 GMT',
	'Content-Type: text/plain; charset = utf-8',
	'Content-Length: {}\r\n'.format(len(body.encode())),
	body,
]
response = '\r\n'.join(response_params)
def handle_connection(conn, addr):
	request = b""
	while EOL1 not in request and EOL2 not in request:
		request +=conn.recv(1024)
	print(request)
	conn.send(response.encode())
	conn.close()
def main():
	
	serversocket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
	serversocket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
	serversocket.bind(('127.0.0.1',8000))
	serversocket.listen(5)
	print('http://127.0.0.1:8000')
	try:
		while True:
			conn, address = serversocket.accept()
			handle_connection(conn, address)
	finally:
		serversocket.close()
if __name__=='_main_':
	main()
 (未完待续) |