luffy后台项目创建

发布时间 2023-10-08 22:04:27作者: Maverick-Lucky

1. 项目创建

 1. 使用命令创建luffy项目

 2. 创建虚拟环境

  mkvirtualenv -p python310 luffy

 3. 安装django

  pip install django==3.1.12

 4. 命令创建项目

  django-admin startproject luffy_api

 5. pycharm创建

 2. 目录调整

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

1. 当调整好目录后,运行报错

  - 运行时,执行的是:python manage.py runserver

  -报错原因:django项目运行,要先加载:settings.py文件,我们将其改成了 dev.py,运行时找不到settings.py

2. 解决运行错误

  - 修改manage.py文件中的 os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'luffy_api.settings')  ,修改如下:

    修改后:os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'luffy_api.settings.dev')

  

  -命令行中运行,肯定不会报错

  -pycharm运行,可能会报错
  -删除之前的django-server,再创建一个,它会自动关联虚拟环境

  

  -如果还会报错,就在配置文件中,找到django,指定配置文件(如下图)

  

3. 创建app

  python manage.py startapp home   # 在哪执行,app就创建在哪

  切到apps目录下,创建app即可

  python ../../manage.py startapp home

  

4. 注册app

  - 在INSTALLED_APPS 直接写app的名字,会报错,报模块找不到的错误: No module named 'home'

    - 1. 模块就是没有

    - 2. 不在环境变量中

    - 3. 自己写了一个,跟模块名一样了

 - 只需要把apps路径加入到环境变量即可

  sys.path.insert(0,str(BASE_DIR))

  # 把apps文件夹加入环境变量,以后注册app,直接写名字即可

     sys.path.insert(0, os.path.join(BASE_DIR, 'apps'))

  

5. wsgi.py,asgi.py 配置文件也要改 ---》后面上线才用到

6. 验证现在配置文件用的是dev.py

from django.conf import settings
print(settings)  # luffy_api.settings.dev

  

 3. 封装logger

1. django 默认使用 python原生的日志模块,我们选择它

  - 以后不要在print输出了,都用日志输出

  - print输出,上线也会有输出,如果用日志,日志有级别,上线后把级别调高,开发阶段的输出就不在打印了

2. 可以使用第三 logru ,公司里可能会用

3. django中集成日志

  - 1.复制日志配置到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': {
            # 实际开发建议使用WARNING
            'level': 'DEBUG',  # 控制台只显示DEBUG以上,就是Info开始
            'filters': ['require_debug_true'],
            'class': 'logging.StreamHandler',
            'formatter': 'simple'
        },
        'file': {
            # 实际开发建议使用ERROR
            'level': 'INFO', #文件中只显示INFO以上,从WARNING
            'class': 'logging.handlers.RotatingFileHandler',
            # 日志位置,日志文件名,日志保存目录必须手动创建,注:这里的文件路径要注意BASE_DIR代表的是小luffyapi
            'filename': os.path.join(os.path.dirname(BASE_DIR), "logs", "luffy.log"),
            # 日志文件的最大值,这里我们设置300M
            'maxBytes': 300 * 1024 * 1024,
            # 日志文件的数量,设置最大日志数量为10
            'backupCount': 10,
            # 日志格式:详细格式
            'formatter': 'verbose',
            # 文件内容编码
            'encoding': 'utf-8'
        },
    },
    # 日志对象
    'loggers': {
        'django': {
            'handlers': ['console', 'file'],
            'propagate': True, # 是否让日志信息继续冒泡给其他的日志处理系统
        },
    }
}

  

  - 2. 在utils下新建 common_logger.py    

import logging
logger = logging.getLogger('django')

  

 -3. 在想使用日志的位置,导入直接使用即可,日志有级别,控制台和文件中打印的日志级别是不一样的

 from utils.common_logger import logger
        class LoggerView(APIView):
            def get(self, request):
                # 以后不要再用print输出了,都用日志输出
                logger.info('info级别')
                logger.warn('warn级别')
                logger.warning('warning级别')
                logger.error('error级别')
                logger.critical('critical级别')
                logger.debug('debug级别')
                return Response('看到我了')

  

  路由配置:

  

4. 封装全局异常

1.写一个函数(只要走到这,程序出异常了----》记录日志 ---》越详细越好)

from rest_framework.views import exception_handler
from rest_framework.response import Response
from utils.common_logger import logger
def common_exception_handler(exc, context):
    res = exception_handler(exc, context)
    if res:  # 有值:drf的异常,处理了,格式不是咱们想要的
        err = res.data.get('detail') or res.data or '未知错误,请联系系统管理员'
        response = Response({'code': 888, 'msg': '请求异常-drf:%s' % err})
    else:  # 其他异常,没有处理,自己处理格式
        response = Response({'code': 999, 'msg': '请求异常-其他:%s' % str(exc)})
    # 记录日志,越详细越好,  请求错误:请求地址是:%s,请求方式是:%s,请求用户ip地址是:%s,错误是:%s,执行的视图函数是:%s
    request = context.get('request')
    path = request.get_full_path()
    method = request.method
    ip = request.META.get('REMOTE_ADDR')
    user_id = request.user.pk or '未登录用户'
    err = str(exc)
    view = str(context.get('view'))
    logger.error(
        '请求错误:请求地址是:%s,请求方式是:%s,请求用户ip地址是:%s,用户id是:%s,错误是:%s,执行的视图函数是:%s' % (
        path, method, ip, user_id, err, view))
    return response

2. 在配置文件中配置一下:

REST_FRAMEWORK = {
    'EXCEPTION_HANDLER': 'utils.common_excepitons.common_exception_handler',
}

测试:drf异常:

在views中:

  

 结果:

5. 封装Response

之前使用drf的Response,我们需要自己构造返回字典

# 比如:
return Response(data={code:100,msg:成功,result:[{},{}]})
return Response(data={code:100,msg:成功,token:asdasd,username:lqz})

我们封装了APIResponse,以后使用,效果如下:

return APIResponse()---》{code:100,msg:成功}
return APIResponse(result=[{},{}])
return APIResponse(token=afasfd,username=lqz)

APIResponse:

6. 后台数据库创建

使用mysql作为数据库:

 - mysql在win上安装步骤:https://zhuanlan.zhihu.com/p/571585588

1. 创建数据库 ---- root 用户创建 ----》 后续使用代码操作数据库,不使用root用户,新建一个用户:luffy

  -如果使用root用户,一旦密码泄露,所有库都不安全了

  -如果新建一个luffy用户,只授予luffy库的权限,即便泄露了密码,只是这个库不安全了

2. 创建路飞用户,授予了luffy库所有表的所有权限

  - 查看用户:select user,host,authentication_string from mysql.user;

  - 创建用户:

  grant all privileges on luffy.* to 'luffy'@'%' identified by 'Luffy123?';
  grant all privileges on luffy.* to 'luffy'@'localhost' identified by 'Luffy123?';
  flush privileges;

3. 以后,操作luffy库,都用luffy用户登录,就不用root用户了

4. 项目中配置使用mysql数据库,使用luffy用户  

  DATABASES = {
  'default': {
  'ENGINE': 'django.db.backends.mysql',
  'NAME': 'luffy',
  'HOST': '127.0.0.1',
  'PORT': 3306,
  'USER': 'luffy',
  'PASSWORD': 'Luffy123?'
    }
  }

5. 运行会报错,因为没有装mysqlclient

  - 解决方式一:直接安装mysqlclient 

  - 解决方式二:使用pymysql

    - 安装,在配置文件中加入:

      import pymysql

      pymysql.install_as_MySQLdb()

6. 数据库的用户名,密码,都是直接写死在代码中的,如果代码泄露了,数据库也就被人看到了

  user=os.environ.get('LUFFY_USER','luffy')
  password=os.environ.get('LUFFY_PWD','Luffy123?')
  print(user)
  DATABASES = {
    'default': {
      'ENGINE': 'django.db.backends.mysql',
      'NAME': 'luffy',
      'HOST': '127.0.0.1',
      'PORT': 3306,
      'USER': user,
      'PASSWORD': password
    }
  }