luffy项目
luffy介绍
暂不介绍
项目搭建
虚拟环境
虚拟环境的创建和使用可以参考 项目搭建之虚拟环境,其内部所写的是python3.3版本后内置的venv功能搭建虚拟环境,而如果需要搭建python2的虚拟环境则不得不用virtualenv第三方模块。
virtualenv安装和初始化
安装virtualenv:
pip3 install virtualenv # 虚拟环境是它
pip3 install virtualenvwrapper-win # 对虚拟环境的加强,以后只需要简单的命令就可以使用和创建虚拟环境
配置虚拟环境管理器的工作目录:
-
在环境变量中新建:WORKON_HOME: D:\Virtualenvs
-
在D盘创建该文件夹,通过命令创建的虚拟环境,都会在这个文件夹下
-
在python解释器安装目录的scripts目录中找到virtualenvwrapper.bat执行一下
virtualenv创建和使用虚拟环境
创建并自动进入虚拟环境:
ps:mkvirtualenv.bat已经在python的scripts中,因为配置过环境变量,所以随意位置可执行
mkvirtualenv -p python luffy # 创建了一个以python解释器为准的纯净环境,环境名称luffy
退出虚拟环境
ps:deactive.bat在虚拟环境的scripts文件夹中,在虚拟环境中可以执行
deactive
查看和进入虚拟环境
ps:workon.bat在python的scripts中在win-cmd中任意位置可执行
workon # 查看所有虚拟环境名
workon luffy # 进入虚拟环境luffy
删除虚拟环境
rmvirtualenv
后端创建
在虚拟环境创建好后,可以引用虚拟环境创建django项目,注意因为虚拟环境初始是纯净的,没有按照各模块,所以需要记得提前在虚拟环境中安装django,并选择当前流行版本如3.2.2。
基于django项目调整目录
├── luffy_api # 项目根目录
├── logs/ # 项目运行时/开发时日志目录 - 包
├── manage.py # 脚本文件
├── luffy_api/ # 项目主应用,开发时的代码保存 - 包
├── apps/ # 开发者的代码保存目录,以模块[子应用]为目录保存 - 包
├── libs/ # 第三方类库的保存目录[第三方组件、模块] - 包
├── settings/ # 配置目录 - 包
├── dev.py # 项目开发时的本地配置
└── prod.py # 项目上线时的运行配置
├── urls.py # 总路由
└── utils/ # 多个模块[子应用]的公共函数类库[自己开发的组件]
└── scripts/ # 保存项目运行时的脚本文件,小的测试脚本 - 文件夹,不提交到git上
相较于django本身的项目目录,主要的变化有:
- 项目同名文件夹被作为项目主应用,所有可改动的代码都往里塞
- 配置文件修改成settings文件夹,存放不同应用环境的配置文件(测试环境和上线环境等)
- utils.py修改成utils包进一步细分写公共函数类库
- 注册软件从与主文件夹同级调整至主文件夹下的apps中
- 软件通过manage工具创建,注册时可能遇到注册名的问题,所以为了方便,需要在settings中配置下环境变量:将BASE_DIR和BASE_DIR'apps'的字符串格式加入sys.path
django配置文件
settings下的dev文件一般表示开发环境下的配置,以下是对django的一些配置的解读:
点击查看代码
from pathlib import Path
import os
import sys
# 项目根路径
BASE_DIR = Path(__file__).resolve().parent.parent
# 把 apps 路径加入到环境变量
sys.path.insert(0, os.path.join(BASE_DIR, 'apps'))
# 把BASE_DIR也加入到环境变量,以后直接从小路飞开始导起即可
sys.path.insert(0, str(BASE_DIR))
# 从大路飞开始导起(执行文件所在文件夹)
# 或者小路飞开始导起或者apps开始导起都可以(添加到环境变量)
# 秘钥,涉及到加密的django中
SECRET_KEY = 'django-insecure-!g(8l%fw_#t$pz$x4jdf#e3$b4+c%xzqyq@3zki08vj&i)z4k-'
# 项目是以debug模式运行,还是非debug模式运行
# 项目上线,要改成false
# 调试模式下,对开发者更友好:可以列出所有路径.报了错,前端能看到,但不适合给用户看到
DEBUG = False
# 允许我的项目部署在哪个ip地址上,* 表示允许部署在所有地址上
ALLOWED_HOSTS = ['*']
# 当DEBUG=False时必须指定ALLOWED_HOSTS
# django 是多个app组成的,里面配置app,默认带的app,django内置的app
# django 是一个大而全的框架,有很多内置app:
"""
admin后台管理,
auth权限管理,
contenttypes表中存app也表的关系,
sessions session表,django的session相关
messages:消息框架,flask讲闪现,是一样的东西
staticfiles:静态资源的
"""
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework',
# 因为添加了apps环境变量,所以可以这样注册
'home',
'user'
]
# 中间件
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware', # 安全相关中间件
'django.contrib.sessions.middleware.SessionMiddleware', # session相关中间件
'django.middleware.common.CommonMiddleware', # 带不带 / 问题
'django.middleware.csrf.CsrfViewMiddleware', # csrf 认证,生成csrf串
'django.contrib.auth.middleware.AuthenticationMiddleware', # 用户认证
'django.contrib.messages.middleware.MessageMiddleware', #消息框架相关
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
# 根路由
ROOT_URLCONF = 'luffy_api.urls'
# 模板文件(前后端分离的项目用不上)
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [BASE_DIR / 'templates'],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages',
],
},
},
]
# 项目运行的配置---》项目上线运行,使用uwsgi 运行 application()
WSGI_APPLICATION = 'luffy_api.wsgi.application'
# 存在环境变量中,代码中不能直接看到
name = os.environ.get('LUFFY_NAME', 'luffy')
password = os.environ.get('LUFFY_PASSWORD', 'Luffy123?')
# 拓展:有的公司,直接有个配置中心---》服务--》只用来存放配置文件
# 数据库配置,mysql 主从搭建完,读写分离
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'luffy',
'USER': name,
'PASSWORD': password,
'HOST': '127.0.0.1',
'PORT': 3306
},
}
# 忽略掉
AUTH_PASSWORD_VALIDATORS = [...]
# 国际化
LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'
USE_I18N = True
USE_L10N = True
USE_TZ = False
# 静态资源
STATIC_URL = '/static/'
# 建表自动都会创建一个自增字段
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
开启media访问
django项目中有个相对固定的配置方式
配置文件:
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
路由:
from django.views.static import serve
# settings.MEDIA_ROOT虽然是在settings/dev.py中配置的
# 但是所有的配置都会被最终合并到conf的settings中
from django.conf import settings
path('media/<path:path>', serve, {'document_root': settings.MEDIA_ROOT})
后台日志封装
这里采取logging模块的日志记录方式,在工作环境中,也许会有专门管理日志的服务去统一管理日志
如:sentry,是由django写的服务,目前开源。
日志组成可以参考 内置模块之logging模块--日志模块。
日志settings配置:
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': 'INFO',
'filters': ['require_debug_true'],
'class': 'logging.StreamHandler',
'formatter': 'simple'
},
'file': {
# 实际开发建议使用ERROR
'level': 'WARNING',
'class': 'logging.handlers.RotatingFileHandler',
# 日志位置,日志文件名,日志保存目录必须手动创建,
# 注:这里的文件路径要注意BASE_DIR代表的是小luffyapi
# 小luffyapi的dirname是大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, # 是否让日志信息继续冒泡给其他的日志处理系统
},
}
}
产生日志记录者:
# 在utils新建 common_logger.py ,得到日志对象
import logging
logger = logging.getLogger('django')
使用日志:
from utils import logger # utils包需要在__init__中导入logger以便这样调用
logger.info('info级别的日志')
logger.error('error级别的日志')
全局异常处理封装
在drf中,在APIView的视图类中,会进行三大认证+视图的全局异常捕获,我们可以对全局异常处理的函数进行改写和配置。
原处理异常函数可以处理drf异常,而我们在此基础上进行扩展,使他能处理更多的异常,并且在处理异常时,可以记录日志。
# 按照以下位置写函数和配置
REST_FRAMEWORK = {
'EXCEPTION_HANDLER': 'utils.common_exceptions.exception_handler',
}
处理函数异常的参考:
from rest_framework.views import exception_handler as drf_exception_handler
from rest_framework.response import Response
from utils import logger
def exception_handler(exc, context):
request = context.get('request')
view = context.get('view')
response = drf_exception_handler(exc, context)
if response is None:
# 说明drf没能处理异常
logger.error(f'用户【{request.user}】|ip【{request.META.get("REMOTE_ADDR")}】'
f'|视图【{view}】|错误【{exc}】')
return Response({'code': 888, 'msg': '服务器错误'})
logger.info(f'用户【{request.user}】|ip【{request.META.get("REMOTE_ADDR")}】'
f'|视图【{view}】|错误【{exc}】')
return response
响应格式封装
Response没有地方可以替换,但是我们可以继承它的Response类再写一个响应类,来帮助更方便的产生固定格式的响应类。
我们希望达到如下的效果:
-
默认有{code:100,msg:成功}这两个字段打头
-
如果有其他状态码则按code,msg传即可
-
原本data={返回对象}会被组织成{code:100,msg:成功,data:{..}}
-
如APIResponse(name='leethon')传参,则前端会收到
{code:100,msg:成功,name:leethon}的响应体。
from rest_framework.response import Response
class APIResponse(Response):
# 原Response有什么,我们就初始化什么
def __init__(self, code=100, msg='成功', status=None,
template_name=None, headers=None,
exception=False, content_type=None, **kwargs):
data = {'code': code, 'msg': msg}
# 如果有多余的参数,一律塞到data字典中
if kwargs:
data.update(kwargs)
# 派生老Response的初始化
super().__init__(data=data, status=status,
template_name=template_name, headers=headers,
exception=exception, content_type=content_type)
后端数据库建立
创建luffy数据库
对于一般程序员来说,开发人员有专门的用户,用户对于数据库的权限是有限的,那么我们可以在创建库后,再创建一个用户来模拟这种情况:
root登录mysql:
# 创建数据库
create database luffy;
# 查看mysql用户信息
select user,host from mysql.user;
# 将库的权限给一个新的mysql用户
grant 权限(create, update) on 库.表 to '账号'@'host' identified by '密码'
# 将库的所有权限给一个所有地址登录的luffy用户密码为luffy123?
grant all privileges on luffy.* to 'luffy'@'%' identified by 'Luffy123?';
# 刷新权限到硬盘
flush privileges;
以上:就创建了一个用户只对luffy库有增删改查所有权限
用户:luffy
密码:Luffy123?
项目连接库
这里后端是用django写的,原本Python2中可以使用mysqlDB连接mysql,在使用python3后,mysqlDB不能使用了,但django仍然默认连接mysqlDB,需要一个猴子补丁将其替换成可以使用的程序。则需要下载mysqlclient模块。
pip install mysqlclient
修改settings配置:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'luffy',
'USER': 'luffy',
'PASSWORD': 'Luffy123?',
'HOST': '127.0.0.1',
'PORT': 3306
}
}
这里的user和password配置仅为测试环境dev会用到的配置,而实际上线的库可能都是不一样的,所以暂不必担心代码泄露密码问题。
不过我们也可以在系统环境变量中存放用户名和密码等信息,用os模块获取来模拟这种情况:
name = os.environ.get('LUFFY_NAME', 'luffy')
password = os.environ.get('LUFFY_PASSWORD', 'Luffy123?')
创建用户表
class User(AbstractUser):
# 扩写手机号和头像字段
mobile = models.CharField(max_length=11, unique=True)
# 需要pillow包的支持
icon = models.ImageField(upload_to='icon', default='icon/default.png')
class Meta:
# 数据库中的表名
db_table = 'luffy_user'
verbose_name = '用户表'
verbose_name_plural = verbose_name
def __str__(self):
return self.username
前端搭建
全局css和全局配置文件
asserts文件夹
- 全局css
- 全局js
安装一些前端模块依赖
一些前端模块十分的常用,很多组件都会用到,可以将其添加到全局变量中。
- axios模块
- vue-cookies模块
- elementui
主页设计
由原型图分析接口
由接口分析表模型
标签:项目,创建,django,虚拟环境,模块,luffy,日志 From: https://www.cnblogs.com/Leethon-lizhilog/p/17164575.html接口单独列项目的场景