虚拟环境相关

anaconda

  1. 创建虚拟环境: conda create -n 虚拟环境名称 python=版本号
  2. 查看所有虚拟环境: conda env list
  3. 使用虚拟环境: conda activate 虚拟环境名称
  4. 退出当前虚拟环境: conda deactivate
  5. 删除虚拟环境(必须先退出虚拟环境内部才能删除当前虚拟环境):
  6. conda remove -n 虚拟环境名称 --all
  7. 在当前虚拟环境安装模块 conda install -c conda-forge 包名==版本号
  8. 在当前虚拟环境移除模块 conda remove 包名
  9. 其他相关命令:
  10. 查看虚拟环境中安装的包: pip freeze 或者 pip list
  11. 收集当前环境中安装的包及其版本: pip freeze > requirements.txt
  12. 在部署项目的服务器中安装项目使用的模块: pip install -r requirements.txt

目录结构

  1. luffycity/ # 工程目录
  2. ├── docs/ # 项目相关资料保存目录
  3. ├── 技术开发文档.md # touch 技术开发文档.md
  4. ├── requirements.txt
  5. ├── luffycity.sql
  6. ├── luffycityweb/ # 前端项目目录[该目录先不用创建]
  7. ├── luffycityapi/ # api服务端项目目录
  8. ├── manage.py
  9. ├── logs/ # 项目运行时/开发时日志目录
  10. ├── luffycityapi/ # 项目主应用,开发时的代码保存
  11. ├── apps/ # 开发者的代码保存目录,以模块[子应用]为目录保存
  12. ├── libs/ # 第三方类库的保存目录[别人写好的,开源的第三方组件、模块]
  13. ├── settings/
  14. ├── dev.py # 项目开发时的本地配置[不需要上传到线上或者服务器]
  15. ├── prod.py # 项目上线时的运行配置
  16. ├── urls.py # 总路由
  17. └── utils/ # 项目各个子应用所使用的公共函数类库[自己开发的组件]
  18. └── scripts/ # 保存项目运营时的维护项目脚本文件

git 分支命名规则

分支前缀 描述
master 生产环境分支,将来可以部署到生产环境(公司的外网服务器)的代码
release 预发布环境分支,将来可以部署到预发布环境的代码,也可以是rel
develop 开发环境分支,也可以是dev
feature 新功能,新增业务分支,也可以是feat
hotfix 修复bug问题、漏洞分支,也可以是fix
test 测试相关分支
  1. release/feature/xxx # 表示待发布分支下的xxx业务功能相关代码
  2. develop/feature/xxx # 表示开发分支下的xxx业务的新功能代码
  3. develop/test/xxx # 表示开发分支下的正在测试的xxx业务功能的代码
  4. develop/hotfix/xxx # 表示开发分支下的修复xxx业务相关功能的bug
  5. # 当然,分支名称并不是固定的,只要能让开发人员一目了然,名字都可以换,所以也可以这样:
  6. release/xxx # 表示待发布的xxx业务新功能代码
  7. feature/xxx # 表示正在开发的xxx业务功能代码
  8. test/xxx # 表示正在测试的xxx业务功能代码
  9. hotfix/user # 表示正在修复bug的xxx业务功能的代码

ssh远程链接git

  1. # 例如我的码云账号是 xx@qq.com,那么该账号生成ssh秘钥对(基于rsa加密算法生成的秘钥对,公钥和私钥)
  2. ssh-keygen -t rsa -C "xx@qq.com"
  3. # 查看生成的秘钥对中的公钥(私钥id_rsa保存在自己电脑不要乱动,公钥id_rsa.pub需要复制文件内容到码云平台)
  4. cat /home/moluo/.ssh/id_rsa.pub
  5. # 把公钥进行复制到码云平台上 https://gitee.com/profile/sshkeys

项目日志配置

这里我们基于django开发, Django 使用 Python 内置的logging 模块处理系统日志。
django官方日志配置文档:https://docs.djangoproject.com/zh-hans/3.2/topics/logging/
日志信息从严重程度由高到低,一共分了5个等级。
由loging模块默认提供了5个操作方法,分别可以记录以下5个等级日志的。

  1. CRITICALfatal): 致命错误,程序根本跑不起来。
  2. ERROR 运行错误,程序运行发生错误的地方时就会退出程序。
  3. WARNING 运行警告,程序运行发生警告的地方时会显示警告提示,但是程序会继续往下执行。
  4. INFO 运行提示,一般的系统信息,并非日志
  5. DEBUG 调试信息,排查故障时使用的低级别系统信息

在settings/dev.py文件中追加如下配置:

  1. # 日志
  2. LOGGING = {
  3. 'version': 1, # 使用的日志模块的版本,目前官方提供的只有版本1,但是官方有可能会升级,为了避免升级出现的版本问题,所以这里固定为1
  4. 'disable_existing_loggers': False, # 是否禁用其他的已经存在的日志功能?肯定不能,有可能有些第三方模块在调用,所以禁用了以后,第三方模块无法捕获自身出现的异常了。
  5. 'formatters': { # 日志格式设置,verbose或者simple都是自定义的
  6. 'verbose': { # 详细格式,适合用于开发人员不在场的情况下的日志记录。
  7. # 格式定义:https://docs.python.org/3/library/logging.html#logrecord-attributes
  8. # levelname 日志等级
  9. # asctime 发生时间
  10. # module 文件名
  11. # process 进程ID
  12. # thread 线程ID
  13. # message 异常信息
  14. 'format': '{levelname} {asctime} {module} {process:d} {thread:d} {message}',
  15. 'style': '{', # 变量格式分隔符
  16. },
  17. 'simple': { # 简单格式,适合用于开发人员在场的情况下的终端输出
  18. 'format': '{levelname} {message}',
  19. 'style': '{',
  20. },
  21. },
  22. 'filters': { # 过滤器
  23. 'require_debug_true': {
  24. '()': 'django.utils.log.RequireDebugTrue',
  25. },
  26. },
  27. 'handlers': { # 日志处理流程,console或者mail_admins都是自定义的。
  28. 'console': {
  29. 'level': 'DEBUG', # 设置当前日志处理流程中的日志最低等级
  30. 'filters': ['require_debug_true'], # 当前日志处理流程的日志过滤
  31. 'class': 'logging.StreamHandler', # 当前日志处理流程的核心类,StreamHandler可以帮我们把日志信息输出到终端下
  32. 'formatter': 'simple' # 当前日志处理流程的日志格式
  33. },
  34. # 'mail_admins': {
  35. # 'level': 'ERROR', # 设置当前日志处理流程中的日志最低等级
  36. # 'class': 'django.utils.log.AdminEmailHandler', # AdminEmailHandler可以帮我们把日志信息输出到管理员邮箱中。
  37. # 'filters': ['special'] # 当前日志处理流程的日志过滤
  38. # }
  39. 'file': {
  40. 'level': 'INFO',
  41. 'class': 'logging.handlers.RotatingFileHandler',
  42. # 日志位置,日志文件名,日志保存目录logs必须手动创建
  43. 'filename': BASE_DIR.parent / "logs/luffycity.log",
  44. # 单个日志文件的最大值,这里我们设置300M
  45. 'maxBytes': 300 * 1024 * 1024,
  46. # 备份日志文件的数量,设置最大日志数量为10
  47. 'backupCount': 10,
  48. # 日志格式:详细格式
  49. 'formatter': 'verbose'
  50. },
  51. },
  52. 'loggers': { # 日志处理的命名空间
  53. 'django': {
  54. 'handlers': ['console','file'], # 当基于django命名空间写入日志时,调用那几个日志处理流程
  55. 'propagate': True, # 是否在django命名空间对应的日志处理流程结束以后,冒泡通知其他的日志功能。True表示允许
  56. },
  57. }
  58. }

异常处理

新建utils/exceptions.py用于保存异常处理的工具函数代码。

  1. from rest_framework.views import exception_handler
  2. from django.db import DatabaseError
  3. from rest_framework.response import Response
  4. from rest_framework import status
  5. import logging
  6. logger = logging.getLogger('django')
  7. def custom_exception_handler(exc, context):
  8. """
  9. 自定义异常处理
  10. :param exc: 异常类
  11. :param context: 抛出异常的上下文
  12. :return: Response响应对象
  13. """
  14. # 调用drf框架原生的异常处理方法
  15. response = exception_handler(exc, context)
  16. if response is None:
  17. view = context['view']
  18. if isinstance(exc, DatabaseError):
  19. # 数据库异常
  20. logger.error('[%s] %s' % (view, exc))
  21. response = Response({'message': '服务器内部错误'}, status=status.HTTP_507_INSUFFICIENT_STORAGE)
  22. return response
  1. settings/dev.py配置文件中添加自定义异常处理的配置。
  2. # drf配置
  3. REST_FRAMEWORK = {
  4. # 自定义异常处理
  5. 'EXCEPTION_HANDLER': 'luffycityapi.utils.exceptions.custom_exception_handler',
  6. }

数据库配置

创建数据库

  1. mysql -uroot -p123
  2. create database luffycity;
  3. # 如果使用的数据库是低于8.0,使用下面的语句
  4. # create database luffycity default charset=utf8mb4;

为数据库分配管理员

为当前项目创建数据库用户[这个用户只能看到这个数据库

  1. # 8.0版本以上的mysql/MariaDB10.3
  2. # 创建用户:create user '用户名'@'主机地址' identified by '密码';
  3. create user 'luffycity_user'@'%' identified by 'luffycity'; # %表示任意主机都可以通过当前账户登录到mysql
  4. # 分配权限:grant 权限选项 on 数据库名.数据表 to 'luffycity_user'@'%' with grant option;
  5. grant all privileges on luffycity.* to 'luffycity_user'@'%' with grant option;
  6. # create user 'xiaoming'@'%' identified by 'xiaoming';
  7. # grant select,insert on homework.* to 'xiaoming'@'%' with grant option;
  8. # mysql8.0/MariaDB10.3版本以下,创建数据库用户并设置数据库权限给当前新用户,并刷新内存中的权限记录
  9. create user luffycity_user identified by 'luffycity';
  10. grant all privileges on luffycity.* to 'luffycity_user'@'%';
  11. flush privileges;

使用pycharm连接mysql数据库。

配置mysql数据库连接

连接池可以提升项目在使用数据库过程中的性能。dbutils和db-connecion-pool

  1. # pip install pymysql # 常见的数据库连接驱动:如果已经安装了,就不必要执行了。
  2. pip install django-db-connection-pool
  3. pip install cryptography

打开settings/dev.py文件,并配置

  1. DATABASES = {
  2. # 'default': {
  3. # 'ENGINE': 'django.db.backends.sqlite3',
  4. # 'NAME': BASE_DIR / 'db.sqlite3',
  5. # }
  6. 'default': {
  7. # 'ENGINE': 'django.db.backends.mysql',
  8. 'ENGINE': 'dj_db_conn_pool.backends.mysql',
  9. 'NAME': 'luffycity',
  10. 'PORT': 3306,
  11. 'HOST': '127.0.0.1',
  12. 'USER': 'luffycity_user',
  13. 'PASSWORD': 'luffycity',
  14. 'OPTIONS': {
  15. 'charset': 'utf8mb4', # 连接选项配置,mysql8.0以上无需配置
  16. },
  17. 'POOL_OPTIONS' : { # 连接池的配置信息
  18. 'POOL_SIZE': 10, # 连接池默认创建的链接对象的数量
  19. 'MAX_OVERFLOW': 10 # 连接池默认创建的链接对象的最大数量
  20. }
  21. }
  22. }

在项目主应用下的 luffycityapi.__init__.py中导入pymysql,如果使用的是MySQLdb(mysqlclient),不要加下面的这段代码。

  1. import pymysql
  2. pymysql.install_as_MySQLdb()

缓存配置

文档:https://django-redis-chs.readthedocs.io/zh_CN/latest/
安装django-redis。

  1. pip install django-redis

在settings/dev.py配置中添加一下代码:

  1. # redis configration
  2. # 设置redis缓存
  3. CACHES = {
  4. # 默认缓存
  5. "default": {
  6. "BACKEND": "django_redis.cache.RedisCache",
  7. # 项目上线时,需要调整这里的路径
  8. # "LOCATION": "redis://:密码@IP地址:端口/库编号",
  9. "LOCATION": "redis://:123456@127.0.0.1:6379/0",
  10. "OPTIONS": {
  11. "CLIENT_CLASS": "django_redis.client.DefaultClient",
  12. "CONNECTION_POOL_KWARGS": {"max_connections": 100},
  13. }
  14. },
  15. # 提供给admin运营站点的session存储
  16. "session": {
  17. "BACKEND": "django_redis.cache.RedisCache",
  18. "LOCATION": "redis://:123456@127.0.0.1:6379/1",
  19. "OPTIONS": {
  20. "CLIENT_CLASS": "django_redis.client.DefaultClient",
  21. "CONNECTION_POOL_KWARGS": {"max_connections": 100},
  22. }
  23. },
  24. # 提供存储短信验证码
  25. "sms_code":{
  26. "BACKEND": "django_redis.cache.RedisCache",
  27. "LOCATION": "redis://:123456@127.0.0.1:6379/2",
  28. "OPTIONS": {
  29. "CLIENT_CLASS": "django_redis.client.DefaultClient",
  30. "CONNECTION_POOL_KWARGS": {"max_connections": 100},
  31. }
  32. }
  33. }
  34. # 设置用户登录admin站点时,记录登录状态的session保存到redis缓存中
  35. SESSION_ENGINE = "django.contrib.sessions.backends.cache"
  36. # 设置session保存的位置对应的缓存配置项
  37. SESSION_CACHE_ALIAS = "session"

django-redis提供了get_redis_connection的方法,通过调用get_redis_connection方法传递redis的配置名称可获取到redis的连接对象,通过redis连接对象可以执行redis命令
https://redis-py.readthedocs.io/en/latest/
使用范例:

  1. from django_redis import get_redis_connection
  2. // 链接redis数据库
  3. redis_conn = get_redis_connection("sms_code")

linux命令相关

  1. tar zxf filename 解压 tar

python 源码编译安装

解压Python3.10的压缩包,进入并安装到/usr/local/python3.10目录下面:
注意,这里的openssl用的是系统自带的,所以openssl的root是/usr

  1. ./configure --with-openssl=/usr --enable-optimizations --prefix=/usr/local/python3.10
  2. make
  3. sudo make install

卸载 python3.4 软件包, 并删除配置文件

  1. 卸载旧的 Python 3
  2. 查看当前 Python3 的版本
  3. xiets@ubuntu:~$ python3 -V
  4. Python 3.4.3
  5. 卸载 Python3.4
  6. sudo apt-get --purge remove python3.4



下载 Python 3.X

  1. Linux 版的 Python 通常以源码编译的方式安装,到 Python 官网下载新版的 Python3
  2. Python3 官网下载地址: https://www.python.org/downloads/source/
  3. 这里下载的是 Python 3.7.1 版本,如下图:
  4. 获取到下载链接后,直接使用 curl 命令下载即可:
  5. sudo curl -O https://www.python.org/ftp/python/3.7.1/Python-3.7.1.tar.xz
  6. 下载保存到当前目录,源码包文件名为: Python-3.7.1.tar.xz

安装 Python 3.X

  1. 3.1 解压源码包
  2. sudo tar Jxvf Python-3.7.1.tar.xz
  3. 解压到当前文件夹,得到Python-3.7.1文件夹。
  4. 3.2 安装所需要的 编译器 依赖
  5. 如果都已安装,可以忽略,参考: https://github.com/pyenv/pyenv/wiki/Common-build-problems


更新安装源(Source)

  1. sudo apt-get update

同时安装多个软件包(已安装的会自动忽略), -y 表示对所有询问都回答 Yes

  1. sudo apt-get install -y gcc make build-essential libssl-dev zlib1g-dev
  2. libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev
  3. libncursesw5-dev xz-utils tk-dev libffi-dev liblzma-dev



编译安装(安装到 /usr/python3 )

创建安装目录

  1. sudo mkdir /usr/python3

进入 解压后的 源码文件夹

  1. cd Python-3.7.1

配置, 检查安装环境, 生成 Makefile 文件, 指定安装到 /usr/python3

  1. sudo ./configure --enable-optimizations --prefix=/usr/python3

编译和安装(需要一段时间, 耐心等待)

  1. sudo make && sudo make install

./configure 时如果报错没有生成 Makefile 文件,根据报错信息安装相应的编译器或依赖,再重新执行;
make && make install 时如果还需要其他依赖,根据报错信息逐一安装依赖后再重新执行。

进入 python3 安装的 bin 目录

  1. cd /usr/python3/bin

查看 python3 的版本

  1. ./python3 -V
  2. ./pip3 -V


添加 Python 环境变量


为了方便并优先使用 Python 3.7 的命令,把/usr/python3/bin目录添加到 PATH。
打开全局环境变量配置文件

  1. sudo vim /etc/profile
  2. 添加下面代码到/etc/profile配置文件
  3. #把 /usr/python3/bin 放在前面, 优先使用里面的命令
  4. export PATH=/usr/python3/bin:$PATH
  5. #执行 source 命令,让刚配置的环境变量立即生效
  6. source /etc/profile


任意目录下执行如下命令:

  1. python3 -V
  2. pip3 -V