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()
(未完待续)
|