首页 > 其他分享 >luffy项目

luffy项目

时间:2023-02-28 15:56:26浏览次数:41  
标签:项目 创建 django 虚拟环境 模块 luffy 日志

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本身的项目目录,主要的变化有:

  1. 项目同名文件夹被作为项目主应用,所有可改动的代码都往里塞
  2. 配置文件修改成settings文件夹,存放不同应用环境的配置文件(测试环境和上线环境等)
  3. utils.py修改成utils包进一步细分写公共函数类库
  4. 注册软件从与主文件夹同级调整至主文件夹下的apps中
  5. 软件通过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文件夹

  1. 全局css
  2. 全局js

安装一些前端模块依赖

一些前端模块十分的常用,很多组件都会用到,可以将其添加到全局变量中。

  • axios模块
  • vue-cookies模块
  • elementui

主页设计

由原型图分析接口

由接口分析表模型

接口单独列项目的场景

标签:项目,创建,django,虚拟环境,模块,luffy,日志
From: https://www.cnblogs.com/Leethon-lizhilog/p/17164575.html

相关文章

  • 路飞项目前端配置
    目录路飞项目前端配置一,前端设置全局css,js全局css全局js二,安装axios三,安装vue-cookies四,安装elementui路飞项目前端配置一,前端设置全局css,js清理出一个干净的项目全......
  • 拥抱下一代前端工具链-Vue老项目迁移Vite探索
    作者:京东物流邓道远背景描述随着项目的不断维护,代码越来越多,项目越来越大。调试代码的过程就变得极其痛苦,等待项目启动的时间也越来越长,尤其是需要处理紧急问题的时候,切换......
  • springboot+mybatis+redis+mysql项目搭建,含示例Demo
    转载自:https://blog.csdn.net/qq_40772342/article/details/105049322========== redis在web开发中使用的场景很多,其中缓存是其中一个很重要的使用场景,之所以用作缓存,......
  • 安装node并创建vue项目
    1.多版本管理工具 nvmhttps://github.com/coreybutler/nvm-windows/releasesnvm-setup.zip2.打开nvm文件夹下的settings.txt文件node_mirror:https://npm.taobao......
  • 用 Visual Studio 升级 .NET 项目
    现在,你已可以使用VisualStudio将所有.NET应用程序升级到最新版本的.NET!这一功能可以从VisualStudio扩展包中获取,它会升级你的.NETFramework或.NETCore网页......
  • liunx部署flask项目
    如何在linux上部署flask项目 Python3.7+virtualenv+uwsgi+git+mysql-5.6.45+nginx 源码编译安装所需要的环境yuminstallgccyuminstall-yzlibzlib-de......
  • 目标责任成本数据无法保存的情况反查-案例:英德路灯项目
    起因事件的起因源于“英德路灯”项目的无法保存。会提示其他支出板块超额了。已签合同大于支出,存在没有合同走账的情况。解决方案从入口查:查找对应板块所有汇总板块......
  • 6_2Bootstrap项目搭建
    boostrap中文网:https://www.bootcss.com/boostrap4下载地址:https://v4.bootcss.com/docs/getting-started/download/ 生产环境下选择预编译的CSS和JS文件,这是压缩......
  • 6_2Bootstrap项目搭建
    boostrap中文网:https://www.bootcss.com/boostrap4下载地址:https://v4.bootcss.com/docs/getting-started/download/ 生产环境下选择预编译的CSS和JS文件,这是压缩......
  • 服务器上进行项目部署
    服务器部署java项目【yzh2022.9】服务器需要注意的是,【jdk、tomcat】我们不仅需要打开防火墙,同时如果是阿里云的服务器,安全组【docker..】也必须开放端口号才能进行访问......