backend.md 3.5 KB

编码规范

原则上要求按照PEP8规范来执行

目录结构

apps: 存放app
    account: 具体的app目录, view目录里面代码只处理request请求,具体逻辑调用service里面的类方法来完成
loonflow: 项目路由入口
    __init 
    urls.py
    wsgi.py
requirements:库依赖
    common.txt:通用依赖
    dev.txt: 开发环境依赖
    pro.txt: 生产环节依赖
    test.txt: 测试环境依赖
service:服务层目录,主要是一些具体的逻辑,如数据库操作,缓存操作等等
settings:配置文件目录
    __init__.py
    common.py: 通用配置
    dev.py: 开发环境配置
    pro.py: 生产环境配置
    test.py: 测试环境配置
static: 静态文件目录
media: 存放用户上传的目录,生产环境部署时建议存放到其他路径, 方便迁移
manage.py
uwsgi.py
README.md:说明性文字

注释规范

class AccountService(BaseService):
    """
 用户相关服务
 """
 def __init__(self):
        pass
 
 @auto_log
 def get_user_auth_type(self, username):
    """
    获取用户登录类型
    :param username:
    :return:
    """
    user_info = MyUser.objects.filter(username=username)
    if user_info:
        auth_type = user_info[0].auth_type
    else:
        auth_type = '2'
        return auth_type, ''

函数返回值规范

函数返回一个元祖, 第一个参数是布尔类型(True, False)或者对象, 第二是message信息(可以是对错误信息的描述)
推荐使用auto_log装饰器来做异常处理。 内如如下
def auto_log(func):
    """
    自动记录日志的装饰器:
    :param func:
    :return:
    """
    @functools.wraps(func)
    def _deco(*args, **kwargs):
        try:
            real_func = func(*args, **kwargs)
            return real_func
        except Exception as e:
            logging.error(traceback.format_exc())
            return False, e.__str__()
    return _deco

代码提交

migrations目录下除了init.py以外文件不要提交,否则多人提交,导致本地数据库同步会有问题

更加Pythonic的模型写法

通用字段使用CommonModel抽象模型,如:(不过因为此方法定义的model,migrate生成的数据库,字段顺序不好灵活控制,暂时未实际遵循)

from django.db import models
from django.utils.translation import ugettext_lazy as _

class CommonModel(models.Model):
    creator = models.CharField(verbose_name=_('创建人'), max_length=100)
    created = models.DateTimeField(verbose_name=_('创建时间'), auto_now=True)
    modified = models.DateTimeField(verbose_name=_('修改时间'), auto_now=True)
    deleted = models.BooleanField(verbose_name=_('己删除'), default=False)

    class Meta:
        abstract = True

真实的模型继承该抽象模型即可,如:

from django.db import models
from django.utils.translation import ugettext_lazy as _
from common.common_model import CommonModel


class TicketRecord(CommonModel):
    title = models.CharField(verbose_name=_('标题'), max_length=200, blank=True)
    workflow = models.IntegerField(verbose_name=_('关联工作流程'))
    sn = models.BigIntegerField(verbose_name=_('流水号'))
    current_state = models.IntegerField(verbose_name=_('当前状态'))
    items = models.TextField(verbose_name=_('工单内容'), help_text='工单内容,以json数据表示')
    description = models.TextField(verbose_name=_('工单描述'))

    class Meta:
        db_table = 'ticket_record'