zoukankan      html  css  js  c++  java
  • luffy--02 ---项目配置和数据库链接

    项目相关

    一般情况下,企业开发软件时会按照基线和定制两块并行方式只想项目开发工作。无论什么公司,都需要遵循一套成熟的产品研发过程体系,才能做出质量较号的产品

    一般一个项目需要经过如下阶段:

    项目启动阶段

    项目启动会的目标是明确开发目标。 项目启动会需要说明项目目标、阶段划分、组织结构、管理流程等关键事项。 目标不是孤立存在的,目标与计划相辅相成,目标指导计划,计划的有效性影响着目标的达成。 在执行目标的时候,考虑清楚自己的行动计划,怎么做才能更有效地完成目标,是每个人都要清楚的问题。目标越是不清晰或是过高,都会影响项目的实际结果。 确认项目组团队组成,包括产品经理、研发项目经理、研发工程师、测试团队、实施团队等。

    项目启动阶段一般还会进行如下事情: 项目评审:项目相关人员参与项目评审会议,一般会有项目评审会议纪要文档输出,以记录评审内容及结果。 需求调研:在项目启动阶段,一般需要产品经理大体了解需求,也即完成大体的需求调研,为下一步的需求分析提供大方向。

    需求设计阶段

    需求分析

    产品经理提供最简单也最接近成品的《产品原型》,线框图形式即可。 在这个过程中还可能产生的包括业务流程图和页面跳转流程图。业务流程图侧重在不同节点不同角色所进行的操作,页面跳转流程图主要指不同界面间的跳转关系。 产品经理面向整个团队,进行需求的讲解。 研发项目经理根据需求及项目要求,明确项目里程碑。根据项目里程表,完成产品开发计划,明确详细阶段的时间点,最后根据开发计划,进行项目任务分解,完成项目的分工。 研发工程师按照各自的分工,进入概要需求阶段。《概要需求》旨在让研发工程师初步理解业务,评估技术可行性。

    设计

    设计阶段的目标主要是对待开发系统的构架进行分析和设计,并建立系统构架的基线,以便为之后的实施工作提供一个稳定的基础。 设计阶段包括了系统架构的输出,一个好的系统架构设计可以帮助人类梳理业务逻辑且抓住核心需求,设计稳定可扩展的业务系统,评估业务开发周期和开发成本,有效的规避风险。 设计阶段一个非常重要的步骤是做总体设计。

    总体设计是整个系统的框架型设计,意义及其重大,一般情况下不能省略(只有维护项目可以省略总体设计,因为基准项目已经设计完毕),所有的产品开发项目均需要首先进行总体设计,它是设计首要步骤,决不允许本末倒置,不能出现先编码后设计的情况,这是软件开发的第二大痛点(第一大是需求不明确、任意变更需求)。 完成总体设计后,一般还会进行概要设计和详细设计。

    概要设计 概要设计的目的是描述系统的每个模块的内部设计,对总体设计和详细设计承担承上启下的作用。 概要设计按照结构化设计方法进行设计。基本思路为:按照问题域,将软件逐级细化,分解为不必再分解的的模块,每个模块完成一定的功能,为一个或多个父模块服务,也接受一个或多个子模块的服务。模块的概念,和编程语言中的子程序或函数是对应的。 概要设计阶段把软件按照一定的原则分解为模块层次,赋予每个模块一定的任务,并确定模块间调用关系和接口。 概要设计文档最重要的部分是分层数据流图、结构图、数据字典以及相应的文字说明等。以概要设计文档为依据,各个模块的详细设计就可以并行展开了。

    详细设计 详细设计阶段就是依据概要设计阶段的分解,设计每个模块内的算法、流程,为每个模块完成的功能进行具体的描述,要把功能描述转变为精确的、结构化的过程描述。 详细设计这个阶段,各个模块可以分给不同的人去并行设计。 概要设计阶段通常得到软件结构图,详细设计阶段常用的描述方式有:流程图、伪代码等。 而详细设计的目的是描述某一个模块内部的处理流程、开发方法和编码技巧。

    一般来说,详细设计需要完成如下内容的输出: 项目简介 模块说明(具体说明每一个模块内部的流程、功能、逻辑、消耗以及未解决问题) 接口设计(包括内部接口和外部接口) 数据结构设计(包括物理结构和逻辑结构) 可能需要的特殊处理。 可能需要的系统资源要求 软件的详细设计,最终是将软件系统的各个部分的具体设计方法、逻辑、功能采用文字方式进行表述。这样在实现过程中,编码人员原则上严格按此进行代码实现即可。

    开发阶段

    完成详细设计后,研发工程师根据详细设计文档正式进入编码阶段,这个过的大部分时间都用来写代码,对有些项目可能还需要进行技术预研、需求确认等。 对于大部分刚入职的开发新人,都是从这个步骤开始的。 这个过程中,有几点需要特别提醒:

    一、拿到需求,先实现核心功能,一般一个项目,核心功能的编码需要占据80%左右的开发时间,核心功能完成后,其他功能的完成上就没有那么紧急了,一旦核心功能的开发延期,对整个项目的风险就会增加。

    二、确保自己编写出的代码是可控制的。不要用偏门、复杂的技术。争取不要编写歧义比较大的代码,以致自己都理解不了。

    三、养成写注释的习惯。

    四、使用熟悉、成熟的技术,少用那些可能坑比较多的技术。特别是自己不熟悉的情况下,容易出现到处给自己挖坑的情形。

    五、多做日志记录,刚开始对业务和技术上不上很熟练,对自己编写的代码的执行效率也不很清楚,多记日志,有助于在程序出现问题时,快速帮助自己定位问题。 对于不少公司,对于新入职程序员,所提交的代码,一般都会需要做代码审核。 在团队中进行代码审查(Code Review)可以提升代码质量,分享项目知识、明确责任,最终达到构建更好的软件、打造更好的团队的目的。

    测试阶段

    研发工程师完成对应功能的开发后,一般会自测,自测感觉ok后,提交给测试工程师测试。 测试工程师根据详细设计文档设计测试用例进行项目测试。 测试若发现问题,提交相关bug但给研发工程师,研发工程师根据测试结果修改代码,完成后提交测试,测试通过后完成。 测试工程师测试通过后,编写《测试结果报告》,包括功能测试结果、压力测试结果等。 测试一般还分有单元测试、集成测试、系统测试、压力测试等。

    一般项目测试通过后,即可以做项目的交付,一般也可以称为项目上线。对有一些项目可能需要通过一些审批批准方可。 对于一些大型或是重要的项目,可能还需要开产品发布会。 在该阶段一般还要有项目交付文档的输出。

    项目发布

    测试通过,将项目交付客户。并由客户验收后完成项目。

    项目维护

    根据合同要求,是否要做项目的维护。

    文档输出

    根据项目不同,一般的工作流程也不同,如对于大部分项目,项目流程如下:

    对于快速迭代的项目,一般的工作流程如下图所示:

    商城项目(django+vue-cli)

    3.1 创建虚拟环境

    mkvirtualenv luffy

    如果自己的开发机子中存在多个版本的python,则可以指定解析器的版本

    mkvirtualenv luffy -p python3

    3.2 相关命令复习

    创建虚拟环境: mkvirtualenv  虚拟环境名称
    创建虚拟环境(指定python版本): mkvirtualenv -p python3 虚拟环境名称
    查看所有的虚拟环境:workon + 2次tab键
    使用虚拟环境: workon 虚拟环境名称
    退出虚拟环境  deactivate
    删除虚拟环境(必须先退出虚拟环境内部才能删除当前虚拟环境): rmvirtualenv  虚拟环境名称
    
    其他相关命令:
    查看虚拟环境中安装的包:  pip  freeze  或 pip list
    收集当前环境中安装包及其版本   pip  freeze > requiements.txt
    
    在部署项目服务器中安装项目使用的模块: pip install -r  requirements.txt

    提示:

    • 虚拟环境指挥管理环境内部的模块和python解释器,对源代码是毫无关系
    • 创建虚拟环境需要联网
    • 创建成功后会自动工作在这个虚拟环境中
    • 工作在虚拟环境上提示符最前面会出现虚拟环境名称

    3.3 依赖包安装

    pip install django
    
    pip install  djangorestframework
    
    pip install  Pymysql
    
    pip install  pillow
    
    pip install  django-redis

    4. 搭建项目

    4.1 创建项目

    django-admin startproject luffy

    4.3 打开项目

    在pycharm中打开项目

    设置虚拟环境

    启动django项目

    提示:在pycharm中如果要使用已经创建好的虚拟环境,则必须设置pycharm中的python解释器,设置为虚拟环境中的python。

    4.2 调整目录

    ├── docs/ # 项目相关资料保存目录
    ├── logs/ # 项目运行时/开发时日志目录
    ├── manage.py
    ├── luffy/ # 项目主应用,开发时的代码保存
    │ ├── apps/ # 开发者的代码保存目录,以模块[子应用]为目录保存
    │ ├── libs/ # 第三方类库的保存目录[第三方组件、模块]
    │ ├── settings/
    │ ├── dev.py # 项目开发时的本地配置
    │ ├── prop.py # 项目上线时的运行配置
    │ ├── urls.py # 总路由
    │ ├── utils/ # 多个模块[子应用]的公共函数类库[自己开发的组件]
    └── scripts/ # 保存项目运营时的脚本文件

    4.2.1 分不同环境进行项目配置

    开发者本地的环境、目录、数据库密码和线上的服务器都会不一样,所以我们的配置文件可以针对不同的系统分成多分.

    1. 在项目主应用下,创建一个settings的配置文件存储目录

    2. 根据线上线下两种情况分别创建2个配置文件 dev.py和prod.py

    3. 把原来项目主应用的 settings.py配置内容复制2份到dev.py和prod.py里面

    4. 把原来的settings.py配置文件修改文件名或者删除

    新的目录settings:

    ├── settings/ # 项目配置目录
    │ ├── dev.py/ # 开发项目配置
    │ ├── prop.py/ # 上线项目配置

    接下来,就可以根据在manage.py中根据不同的情况导入对应的配置文件了.

    #!/usr/bin/env python
    """Django's command-line utility for administrative tasks."""
    import os
    import sys
    
    
    
    def main():
        os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'luffy.settings.dev')
        try:
            from django.core.management import execute_from_command_line
        except ImportError as exc:
            raise ImportError(
                "Couldn't import Django. Are you sure it's installed and "
                "available on your PYTHONPATH environment variable? Did you "
                "forget to activate a virtual environment?"
            ) from exc
        execute_from_command_line(sys.argv)
    
    
    if __name__ == '__main__':
        main()

    4.3 创建代码版本

    cd进入到自己希望存储代码的目录路径,并创建本地仓库.git【pycharm直接打开终端就是项目根目录了。无须cd了】 新创建的本地仓库.git是个空仓库

    cd 目录路径
    git init

    4.3.1 配置用户名和邮箱

     

    git config --global user.name 'mark'
    git config --global user.email 'mark@163.com'

    4.4 在git平台创建工程

    公司一般都会有自己的代码仓库,一般都是自己搭建,也有使用第三方提供代码管理平台。

    常用的代码管理平台:github、gitee(码云)

    如果公司自己搭建的代码管理平台,gitlab框架

    1) 创建私有项目库

    2)克隆项目到本地

    注意:
    我们当前项目不需要这个步骤
    这个步骤是 当以后我们进入公司里面,参与人家已经在做的项目时,别人已经有仓库了,但是我们是新人加入项目中的,那么我们不需要在自己本地进行git init,直接git clone 复制别人的仓库代码

    git clone 仓库地址
    注意,如果当前目录下出现git仓库同名目录时,会克隆失败。

    3)创建并切换分支到dev

    # git branch dev      # 创建本地分支dev,dev是自定义
    # git checkout dev    # 切换本地分支代码
    git checkout -b dev   # 这里是上面两句代码的简写

    4.5git提交

    git add 代码目录 # 添加代码到上传队列
    git status # 查看当前项目的版本状态
    git commit -m '添加项目代码' # 提交代码到本地仓库, -m 表示本次提交的描述

    git push origin dev:dev   推送到远程

    如果推送代码,出现以下提示: git pull ....,则表示当前本地的代码和线上的代码版本不同.

    1. 把线上的代码执行以下命令,拉取到本地,进行同步
    git pull

    2. 根据提示,移除多余的冲突的文件,也可以删除.
    完成这些步骤以后,再次add,commit,push即可.

    接下来,我们就把上面创建好的本地项目提交到gitee码云上面

    # .表示当前目录下所有的文件或目录提交到上传队列[上传队列也叫"暂存区"]
    git add .
    
    # 把本地上传队列的代码提交到本地仓库
    git commit -m "项目初始化搭建"
    
    # 给本地的git版本控制软件设置项目的远程仓库地址
    git remote add origin https://gitee.com/jingjiedebifang/luffy
    
    # 提交代码给远程仓库
    git push -u origin master

    扩展:
    1. 通过 git status 可以查看当前项目的代码版本状态
    2. 通过 git reflog 可以查看代码版本日志[简单格式]
    3. 通过 git log 可以查看代码版本日志[详细格式]

    上面虽然成功移交了代码版本,但是一些不需要的文件也被提交上去了。

    所以,我们针对一些不需要的文件,可以选择从代码版本中删除,并且使用.gitignore把这些垃圾文件过滤掉。

    git rm 文件  # 删除单个文件
    git rm -rf 目录  # 递归删除目录
    
    # 以下操作建议通过ubuntu的终端来完成,不要使用pycharm提供,否则删除.idea还会继续生成。
    git rm -rf .idea
    git rm db.sqlite3
    # 注意,上面的操作只是从项目的源代码中删除,但是git是不知情的,所以我们需要同步。
    git add .
    git commit -m "删除不必要的文件或目录"
    git push -u origin master

    4.6 日志配置

    www.djangoproject.com官网里卖弄可以找到日志配置

    在settings/dev.py文件中追加如下配置:

    # 日志配置
    LOGGING = {
        'version': 1,
        'disable_existing_loggers': False,
        'formatters': {
            'verbose': {
                'format': '%(levelname)s %(asctime)s %(module)s %(lineno)d %(message)s'
            },
            'simple': {
                'format': '%(levelname)s %(module)s %(lineno)d %(message)s'
            },
        },
        'filters': {
            'require_debug_true': {
                '()': 'django.utils.log.RequireDebugTrue',
            },
        },
        'handlers': {
            'console': {
                'level': 'DEBUG',
                'filters': ['require_debug_true'],
                'class': 'logging.StreamHandler',
                'formatter': 'simple'
            },
            'file': {
                'level': 'INFO',
                'class': 'logging.handlers.RotatingFileHandler',
                # 日志位置,日志文件名,日志保存目录必须手动创建
                'filename': os.path.join(os.path.dirname(BASE_DIR), "logs/luffy.log"),
                # 日志文件的最大值,这里我们设置300M
                'maxBytes': 300 * 1024 * 1024,
                # 日志文件的数量,设置最大日志数量为10
                'backupCount': 10,
                # 日志格式:详细格式
                'formatter': 'verbose'
            },
        },
        # 日志对象
        'django': {
            'django': {
                'handlers': ['console', 'file'],
                'propagate': True, # 是否让日志信息继续冒泡给其他的日志处理系统
            },
        }
    }

    4.7 异常处理

    一般放在公共文件里面 ,可以新建一个文件 在 utils/exceptions.py

    from rest_framework.views import exception_handler
    
    from django.db import DatabaseError
    from rest_framework.response import Response
    from rest_framework import status
    
    import logging
    logger = logging.getLogger('luffy')
    
    
    def custom_exception_handler(exc, context):
        """
        自定义异常处理
        :param exc: 异常类
        :param context: 抛出异常的上下文
        :return: Response响应对象
        """
        # 调用drf框架原生的异常处理方法
        response = exception_handler(exc, context)
    
        if response is None:
            view = context['view']
            if isinstance(exc, DatabaseError):
                # 数据库异常
                logger.error('[%s] %s' % (view, exc))
                response = Response({'message': '服务器内部错误'}, status=status.HTTP_507_INSUFFICIENT_STORAGE)
    
        return response

    此时在dev.py配置文件中添加

    REST_FRAMEWORK = {
        # 异常处理
        'EXCEPTION_HANDLER': 'luffy.utils.exceptions.custom_exception_handler',
    }

    4.8 创建数据库

    create database luffycity default charset=utf8;
    
    create user markidentified by '123';
    grant all privileges on luffycity.* to 'mark'@'%';
    flush privileges;
    
    
    打开settings/dev.py文件,并配置
    DATABASES = {
        "default": {
            "ENGINE": "django.db.backends.mysql",
            "HOST": "127.0.0.1",
            "PORT": 3306,
            "USER": "mark",
            "PASSWORD": "123",
            "NAME": "luffycity",
        }
    }

    在项目主模块的(就是项目的主应用的 __init__.py中导入pymysql

    import pymysql
    
    pymysql.install_as_MySQLdb()

    调整错误

    数据库版本检测导致的错误

     

    数据库的版本检测代码注释掉。

    第二个错误也是因为数据库版本的默认编码导致,query返回的内容格式使用有误。

    新增一行代码,把query查询结果转换格式为 bytes类型

     

     

     

     

     

     

     

  • 相关阅读:
    编译原理笔记 2
    编译原理笔记 1
    初步学习计算机图形学 [闫令琪]
    复杂 Web 前端的设计
    使用 GitHub Actions 部署 .Net 5 程序
    ES 2020 Optional Chain (可选链)
    2020 Web 前端学习记录
    WPF TreeView 支持多选
    linux (CentOS 7)报错:yum 命令报错 “ Cannot find a valid baseurl for repo: base/7/x86_6 ”
    node.js 报错
  • 原文地址:https://www.cnblogs.com/yang950718/p/10860176.html
Copyright © 2011-2022 走看看