解决因为uWSGI部署产生的No Mode lNamed xxx 问题
1 celery不能使用的具体情况
- 当时用独立的celery模块为项目添加了定时、超时和异步任务,当时celery是可以使用的,超时以及定时任务都实现了效果,但是会遇到如下问题。
1.1 No Model named celery_task
- 前端和后端实现部署以后,每当调用到celery的代码,就会出现这样的问题
- 查阅了很多资料,最后发现必须要在项目函数内部,添加根路径才能识别。
1.1.1 项目目录
1.1.2 解决方案
- 在引入模块的地方加上文件夹根目录
- 一定要在内部导包
sys.path.insert(0, r'/home/worker/opwf_project')
from celery_task import tasks
tasks.send_email.delay(user_list)
1.2 No Named Celery
- 在解决完以上错误后,又显示找不到Celery方法
1.2.1 出现问题的地方
1.2.2 解决方案
- 将启动文件改成celery_lk.py
- 这样可以防止引入时和方法名重名
# 还需注意的地方,这样命名以后,就不能用以前文件夹启动celery的方法
# 启动命令改为
celery -A celery_task.celery_lk worker -l INFO
celery -A celery_task.celery_lk beat -l INFO
2 Django路径问题引入
2.1 路径问题引入
import sys
当前文件夹优先搜索(同名会覆盖)
BASE_DIR 指的是django项目根路径
print(os.path.abspath(__file__))
# 当前文件绝对路径
# /root/shiyanlou_project/syl/syl/settings.py
print(sys.path.insert(0,os.path.join(BASE_DIR,'apps')))
# /root/shiyanlou_project/syl/apps/
2.2 操作系统文件绝对路径
django静态文件查找,模板查找
# 去配置好的文件夹中查找指定的文件
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
STATIC_URL = '/static/'
# /teacher/shiyanlou_project/syl/apps/user/ # linux
# E:\_000\XSX
2.3 django导包路径
第一访问:当前文件夹
导包之前,包的上级路径,需要存在于python system的path
sys.path 这是一个列表
'''
sys.path.insert(0, os.path.join(BASE_DIR, 'apps'))
'''
from xxx import yyy 才能成功
第二访问才回去路径,列表的索引为0
2.4 django模型引用路径
想使用一个 models.py 文件中的模型
apps名称.model模型名
'users.User'
3 部署排错时一些常用命令
3.1 nginx命令
systemctl restart nginx # 重启nginx
tail -f /var/log/nginx/error.log # 查看nginx错误日志
tail -f/var/log/nginx/access.log # 查看接入日志
3.2 uwsgi重启
uwsgi --ini uwsgi.ini # 启动
cd /home/worker/opwf_project/uwsgi_conf # 切换到指定路径
tail -f * # 查看指定
ps -ef|grep uwsgi # 查看uwsgi启动端口
3.3 查看端口占用情况
netstat -anptu | grep 8888