当前项目使用的是 python 3.5
,如果你不清楚其与 2.7
版本的差异,可以参考这里:https://blog.csdn.net/samxx8/article/details/21535901
建议使用 vscode
环境开发本项目。在 .vscode
目录中,已经做好了 autopep8
自动格式化以及 python debug
环境的配置
$ sudo apt-get install python3-pip
$ pip3 install virtualenv
$ cd /workspace/sc-data-center
$ virtualenv --no-site-packages -p /usr/bin/python3 venv
导入依赖包
$ venv/bin/pip install --upgrade pip # 升级 pip
$ venv/bin/pip install -r requirements.txt
$ venv/bin/pip install -r requirements_dev.txt # 开发环境使用这个
如果在后续开发过程中,有新增依赖包,请运行更新命令
$ venv/bin/pip freeze > requirements.txt
也可以选择使用 pyenv 来替代管理 virtualenv,会更便捷,但可能会出现像我一样遇到的问题:无法检测到系统已安装的 lib
$ sudo apt-get install pyenv
$ pyenv install 3.5.5rc1
添加到 ~/.bash_profile 末尾
export PYENV_ROOT="${HOME}/.pyenv"
if [ -d "${PYENV_ROOT}" ]; then
export PATH="${PYENV_ROOT}/bin:${PATH}"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
fi
刷新 path
$ pyenv rehash
$ source ~/.bash_profile
安装项目
$ cd /workspace/celery-task-server
$ echo 'celery-task-server' > .python-version
$ pyenv virtualenv 3.5.5rc1 celery-task-server
$ cd -
$ cd /workspace/celery-task-server # 重新进入该目录,将自动激活 python 版本环境
$ python --version # 查看 python 版本
$ pip install -r requirements_dev.txt
该项目中应用到了一些重要的包,这些包提供了不同的项目功能支持。为了兼顾 php 的开发习惯,同时在项目中引入了一些与 php 类似的包。
如果某些包无法查看参考文档(可能因为墙的原因),建议直接通过参考 venv/lib/python3.5/site-packages
下的包源代码来学习使用这些包。
这是本项目最重要的一个包,提供任务调度功能,相关帮助信息请参考:http://docs.celeryproject.org/en/latest/index.html
app/tasks
目录用于存放 celery 所有的 tasks!
这个包提供了像 php var_dump 一样的功能,但在调试比较大的对象时,可能会导出溢出操作,慎重!
from var_dump import var_dump
from var_dump import var_export
d = dict(x=1, y=2)
var_dump(d)
'''
#0 dict(2)
['y'] => int(2)
['x'] => int(1)
'''
print(var_export(d))
'''
#0 dict(2) ['y'] => int(2) ['x'] => int(1)
'''
这是目前 python 中最好用的日期时间处理包,参考文档见:http://arrow.readthedocs.io/
注意:
在输出日期时间字符时,记得加上 to(CONST.TZ)
,例如:arrow.Arrow.fromtimestamp(1524641352).to('Asia/Shanghai').format()
这是一个仿 php Carbon 的包,参考文档地址:https://pendulum.eustace.io/docs/
注意:
你可以使用这个类来做一些日期时间的计算,但需要注意的是,这个类的时区并不准!
因为当你使用 pendulum.now().set(tz='Asia/Shanghai').format('%Y-%m-%d %H:%M:%S %z')
输出当前时间时会发现,这并不是一个正确的时间!你应该使用 arrow
这个日期时间包!
这也是一个跟目前 laravel/symfony 框架中 Command 类似的一个包,可以直接查看项目中的示例来熟悉这个包。参考文档地址:http://cleo.readthedocs.io
这个包完全模仿了 laravel database & eloquent,大部分的使用方法都是类似的。同时,这个包集成了 cleo
,并提供了许多与 laravel 相同的 make 功能,代码位置在 venv/lib/python3.5/site-packages/orator/commands
参考文档:
- orator
- laravel database & eloquent
这是一个仿 php laravel 框架 Collection 的包,能够让我们便捷的操作 python 的 tuple
, list
, map
(不支持 dict
)。
可以参考这些文档:
- https://github.com/sdispater/backpack
- https://laravel-china.org/docs/laravel/5.6/collections (laravel)
使用参考:
from backpack import collect
d = [dict(x=1, y=2), dict(x=3, y=4)]
print(collect(d).all()) # [{'y': 2, 'x': 1}, {'y': 4, 'x': 3}]
print(collect(d).first()) # {'y': 2, 'x': 1}
print(collect(d).where('x', 1).all()) # [{'y': 2, 'x': 1}]
print(collect(d).pluck('x').all()) # [1, 3]
这个包提供了事件管理与分发,并通过 decorator 修饰符来定义事件的行为。参考文档:https://github.com/riga/pymitter
使用参考:
from pymitter import EventEmitter
ee = EventEmitter(wildcards=True)
@ee.on("myevent.foo")
def handler1():
print("handler1 called")
@ee.on("myevent.bar")
def handler2():
print("handler2 called")
@ee.on("myevent.*") # 可使用通配符来定义事件触发
def hander3():
print("handler3 called")
ee.emit("myevent.foo")
# -> "handler1 called"
# -> "handler3 called"
ee.emit("myevent.bar")
# -> "handler2 called"
# -> "handler3 called"
ee.emit("myevent.*")
# -> "handler1 called"
# -> "handler2 called"
# -> "handler3 called"
.
├── app (项目目录)
│ ├── commands (commands 命令目录)
│ ├── helpers (项目支持函数目录)
│ │ ├── application.py (项目相关)
│ │ ├── common.py (通用函数)
│ │ ├── constants.py (常量定义)
│ │ ├── database.py (数据库相关)
│ │ ├── datetime.py (日期时间相关函数)
│ │ ├── dictionary.py (dict 辅助函数)
│ │ └── valid.py (验证函数)
│ ├── logics (业务逻辑代码目录)
│ ├── providers (服务提供者目录)
│ ├── tasks (celery 任务代码目录)
│ ├── tests (单元测试代码目录)
│ ├── command.py (command入口)
│ ├── unittests.py (单元测试入口)
│ └── utils (工具库)
├── bin (项目管理脚本目录)
│ ├── celery.beat.sh (celery beat 调度器管理脚本)
│ ├── celery.flower.sh (celery web 控制台管理脚本)
│ ├── celery.profile.sh (celery 项目环境配置)
│ ├── celery.run.sh (celery 通用命令运行脚本)
│ ├── celery.sh (beat/worker 共用管理脚本)
│ └── celery.worker.sh (celery worker 管理脚本)
├── config (配置文件存放目录)
│ ├── database.yaml
│ ├── *.yaml
│ └── testing (测试环境目录)
│ │ └── database.yaml
│ └── production
│ └── database.yaml
├── docs (项目文档目录)
├── logs (日志目录,按日期存放)
├── .python-version (pyenv 环境识别文件)
├── requirements_dev.txt (开发环境包依赖文件)
└── requirements.txt (生产环境包依赖文件)