内容回顾
虚拟环境
两个模块
virtualenv —>virtualenv.exe 用来创建虚拟环境
virtualenvwrapper-win—>virtualenvwrapper.bat 批处理文件,命令简化
命令:
创建 mkvirtualevn -p python 名称
查看 workon
进入 workon 名称
退出虚拟环境 deactivate
环境变量:cmd窗口中,敲命令行能够执行,在当前路径下有这个命令,环境变量中有
创建路飞前后台
后台》pycharm 在虚拟环境上先把django 3.2.2装好;django-admin创建项目,切换到虚拟环境中
前台使用vue-cli创建好
包导入
from 或者 import 路径必须从环境变量开始
sys.path
相对导入(相当于执行的脚本文件),绝对导入(跟是环境变量)
包下都有_init_.py 》可以直接导入包也就是导入的这个文件
例如requests》import requests》把init导入了》requests.能点出来的都是init中的
我们写包,想给外部用的,都在init中注册一下,以后别人用,简单
调整目录
目录结构调整,做的清晰一些
配置文件路径改变了,现在不能运行了》修改路径
开发阶段 manage.py
上线阶段 wsgi.py asgi.py uwsgi
创建app都在apps文件夹下,想注册,只写app名字
把apps路径加入到环境变量
项目根路径(小路飞路径),加入到环境变量
内容详情
后台日志封装
以后,项目肯定要记录日志
日志都可以打印到控制台
日志可以写到日志文件中
日志存储到某个库中
所有项目日志统一管理 sentry:django写的服务,收集日志的,可以展示 开源的
以后项目调试都用日志logger.info(),不在用print打印了,只需要调整日志级别,低级别的日志就不打印了,于是日志输出不用删掉
操作步骤:django中集成日志步骤,django使用的就是python内置的模块
第一步:在配置文件中加入 日志配置 –大字典
这个变量名必须叫这个,因为django它默认是加载这个
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
'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')
也可在__init__.py
中注册一下,以后可以直接导入utils即可使用了
from .common_logger import logger
第三步:在任意想用日志的地方,导入即可
from utils.common_logger import logger
# 或者用这个
# from utils import logger 必须要在__ini__.py中注册才行
logger.info('info级别的日志')
logger.error('error级别的日志')
django可能会有的小bug
如果debug等级日志不打印不记录,那么把这个加上都,文件记录日志的就能生效了,但是控制台打印的还是不能生效
正常项目不会用这么低,因为django用的debug日志太多了,对于我们来说也没什么用所有就info就行了
'django': {
'handlers': ['default', 'console'], # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
'propagate': True, # 向上(更高level的logger)传递
'level': 'DEBUG', # 如果debug等级日志不打印不记录,那么把这个加上都,记录日志的都能生效了
# 正常项目不会用这么低,因为django用的debug日志太多了,对于我们来说也没什么用所有就info就行了
},
前后端分离的rbac项目演示
# 后台:
https://gitee.com/liuqingzheng/rbac_manager
# 前端:
https://gitee.com/liuqingzheng/vue_admin
全局异常处理封装
前端要接收的格式,要统一,无论后端是否出错
三大认证,视图类的方法中只要出了异常,就会执行一个函数,但是这个函数只能处理drf的异常》我们需要自己写一个函数,既能处理drf异常,又能处理django异常,这样统一返回格式,前端看到的格式都统一了
使用步骤
第一步:在utils中新建common_exceptions.py
第二不:写函数
from rest_framework.views import exception_handler as drfexception_handler
from rest_framework.response import Response
from utils import logger
def exception(exc, context):
response = drfexception_handler(exc, context)
request = context.get('request')
id = request.user.id
ip = request.META.get('REMOTE_ADDR')
path = request.get_full_path()
if response:
logger.info('用户id:【%s】,用户ip:【%s】,错误路径:【%s】,错误信息:【%s】' % (id, ip, path, response.data.get('detail')))
res = {'code': 666, 'msg': response.data.get('detail', '系统错误请联系管理员')}
else:
logger.error('用户id:【%s】,用户ip:【%s】,错误路径:【%s】,错误信息:【%s】' % (id, ip,path, str(exc)))
res = {'code': '888', 'msg': '系统错误请联系管理员'}
return Response(res)
第三步:配置配置文件,以后只要出了异常,都会走我们的函数
REST_FRAMEWORK = {
'EXCEPTION_HANDLER': 'utils.common_exceptions.exception_handler',
}
第四步:大胆写代码,即便报错,程序也不会嘣,并且会记录日志,并处理成统一格式
封装Response
本身drf有response,但是公司规定,前端收到的格式都是固定的
{code:100,msg:提示,data:{}/[]}
{code:100,msg:提示,token:asdfasd,user:lqz}
所有对Response进行封装,封装后,code,msg可以不传,不传就用默认的
使用步骤
第一步:在utils下新建common_response.py
第二步:封装APIResponse
from rest_framework.response import Response
class APIResponse(Response):
def __init__(self, code=100, msg='成功', status=None, headers=None, **kwargs):
data = {'code': code, 'msg': msg}
if kwargs: # 有值,说明,传了 除了code msg status headers 以外的,咱们都要返回给前端,放到这个data中
data.update(kwargs)
super().__init__(data=data, status=status, headers=headers)
# 不要return,你可以这样做 self.data=data self.status=status
第三步:导入使用,视图函数的方法,返回时,都使用我们自己的
luffy数据库创建
创建用户创建库
创建luffy数据库,之前项目操作数据库,都是使用root用户,root用户权限太高了,在公司里,一般不会给root用户权限
如果开发人员是root权限,数据安全性就很差
开发人员,专门创建一个用户,用户只对当前项目的库有操作权限
创建一个luffy库,创建luffy用户,luffy用户只对luffy库有操作权限
创建luffy数据库
管理员连接数据库
mysql -uroot -proot
创建数据库
create database luffy01 default charset=utf8mb4;
查看用户
select user,host,password from mysql.user;
只有root用户,要创建luffy用户
5.7往后版本
select user,host,authentication_string from mysql.user;
创建路飞用户,授予luffy库所有权限
设置权限账号密码
授权账号命令:
grant 权限(create, update) on 库.表 to '账号'@'host' identified by '密码'
配置任意ip都可以连入数据库的账户
grant all privileges on luffy01.* to 'luffy'@'%' identified by 'Luffy123?';
由于数据库版本的问题,可能本地还连接不上,就给本地用户单独配置
grant all privileges on luffy01.* to 'luffy'@'localhost' identified by 'Luffy123?';
刷新权限
flush privileges;
只能操作luffy数据库的账户
账户:luffy
密码:Luffy123?
使用项目连接数据库
项目操作mysql,需要安装模块
pymysql
mysqlDB
mysqlclient
历史:原来py2上有个操作mysql的模块叫mysqlDB,但到了py3没有支持py3,django默认使用这个模块去连接mysql,默认使用mysqlDB连接 mysqlDB不支持py3,运行报错
我们使用pymysql,作为连接mysql的数据库模块,但是需要加代码
imprort pymysql
pymysql.install_as_mysqldb() # 猴子补丁
django 2.2.2以后,还使用吗pymysql,需要改django源代码
统一使用mysqlclient来作为操作msyql的底层库
基于py2的mysqldb,在py3上重写了,但是名字改了成了mysqlclient
使用mysqlclient,只需要安装这个模块,不需要再些任何代码,直接用即可
但是 :mysqlclient这个模块不好装,看人品
win 一般人品好,直接pip install mysqlclient就装好了
人品不好,装不了,centos部署项目,可能会有问题
pip install mysqlclient
配置文件修改,连接mysql,使用路飞用户
用户密码写再环境变量,不写死可以有效保证密码不泄露
name = os.environ.get('LUFFY_NAME', 'luffy')
password = os.environ.get('LUFFY_PASSWORD', 'Luffy123?')
# 拓展:有的公司,直接有个配置中心---》服务--》只用来存放配置文件
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'luffy',
'USER': name,
'PASSWORD': password,
'HOST': '127.0.0.1',
'PORT': 3306
}
}
软件开发模式
瀑布模式:bbs项目就是安装这种模式
需求分析》设计》创建数据库所有都创建》开发(3个月)》交给测试》测试通过》上线
敏捷开发
需求分析》设计》只设计一个板块》开发(2周)》交给测试》运维上线(测试环境)
设计》只设计一个板块》开发2周》交给测试》运维上线(测试环境)
一个spring周期
scrum敏捷开发项目管理
User模块用户表
你决定使用auth表扩写,项目一定不要先迁移,先建好用户表再迁移
已经迁移完了,再想用auth的user表
删库,删迁移文件所有app
删admin和auth的迁移文件
用户表使用auth表扩写
# 用户表使用auth表扩写 pip install Pillow
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
# 遇到的问题,明明小luffyapi已经加入到环境变量,程序运行没问题,但是表迁移,就报错,找不到模块
-打印了看一下,确实环境变量有,但是不是个字符串,是个对象
-程序运行,是没问题
-迁移有问题:配置文件中转成字符串,就解决了
django的配置文件
pathlib # 3.6以后处理文件路径模块,原来是os
面试题,md5是对称加密还是非对称加密
对称加密:加密的密钥和解密的密钥是同一个
非对称加密:加密使用公钥加密,解密使用私钥解密,使用公钥是不能解密的
MD5是摘要算法,没有解密这一说
运行django ,泡在0.0.0.0上,局域网内,所有人都能访问
from pathlib import Path
import os
import sys
# 项目根路径
# 我们就是要让小路飞路径作为项目根路径
BASE_DIR = Path(__file__).resolve().parent.parent # 项目根路径, 小路飞luffy_api路径 D:\pythonProject03\luffy_api\luffy_api
# print(BASE_DIR)
# 把 apps 路径加入到环境变量
sys.path.insert(0, os.path.join(BASE_DIR, 'apps'))
# 把BASE_DIR也加入到环境变量,以后直接从小路飞开始导起即可
sys.path.insert(0, str(BASE_DIR))
# print(sys.path)
# 以后从大路飞开始导起,或者小路飞开始导起,或者apps开始导起都可以
# 秘钥,涉及到加密的django中,都会用它
SECRET_KEY = 'django-insecure-!g(8l%fw_#t$pz$x4jdf#e3$b4+c%xzqyq@3zki08vj&i)z4k-'
# 项目是以debug模式运行,还是非debug模式运行
# 项目上线,要改成false
# debug=True 代码可以热更新
# 调试模式下,对开发者更友好:可以列出所有路径.报了错,前端能看到
DEBUG = False
# 它搭配debug=False,它的意思是,允许我的项目部署在哪个ip地址上,* 表示允许部署在所有地址上
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',
# 'luffy_api.apps.home', # luffy_api在环境变量,直接从这一层开始导起, 太长了,以后就想 注册 home
# 'luffy_api.apps.user'
'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 = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
]
# 国际化
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访问
配置文件加入
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
总路由种设置
# re_path('^media/(?P<path>.*)', serve, {'document_root': settings.MEDIA_ROOT})
path('media/<path:path>', serve, {'document_root': settings.MEDIA_ROOT})
# 访问
http://127.0.0.1:8000/media/icon/default.png
导入配置文件以后都使用
from django.conf import settings
扩展
# 期终架构相关
-前端---》看人家开源的前端项目,看不懂
-第一种情况,vue+java====》分析有哪些接口,drf复写出来
-第二种情况: 你新建前端项目,你看到它哪个页面好看,copy你里面去只要template和style
-js东西自己写
# https://zhuanlan.zhihu.com/p/370167569
# windows安装 mysql 5.7
https://zhuanlan.zhihu.com/p/571585588
标签:封装,配置文件,用户,django,luffy,contrib,path,日志
From: https://www.cnblogs.com/clever-cat/p/17162308.html