Home >  > 京东python开发六 后续工作(tmux)

京东python开发六 后续工作(tmux)

0

一、完善后台功能
前期开发中,因为几乎没有用到后台,所以对后没有做什么开发。后来在使用的过程中发现有些事情还得后台来做,比如:
(1)、主机商通知网页中含有敏感关键词的信息,需要修改某个产品描述,这时只根据商品ID去查询,需要一页一页地去翻页,非常浪费时间。
(2)、由于之前没有做过多的逻辑判断,首页的商品优惠券过期了,还显示在那儿,幸好之前数据库中预留了“is_recommand”字段,所以可以通过这个字段来控制,不过这时又要进入后台管理。

1、添加后台显示内容

在admin.py添加如下内容:

# Register your models here.
class GoodsAdmin(admin.ModelAdmin):
    list_display=('skuid', 'name','category', 'coupon_amount','click_num', 'expired_time','add_time')

admin.site.register(Goods,GoodsAdmin)

原来后台只显示商品名称,添加后就变成了:

然后再添加筛选器,并实现搜索功能。Django为我们提供了一些实用的筛选器,主要常用筛选器有下面3个:

    # 筛选器
    list_filter = ('category', )  # 过滤器
    search_fields = ('name','detail')  # 搜索字段
    date_hierarchy = 'add_time'  # 详细时间分层筛选 

将上面的代码加入到admin.py,就可以看到效果了:

二、优化菜单状态

之前对菜单的选中、未选状态未加区分,无论选择哪个项目,都是“9块9包邮专区”这里显示为红色。

所以现在进一步优化,只需要用下面的代码,将原来的html代码包裹起来即可。

{% ifequal my_message.name 'a' %}aaa{% else %}bbb{% endifequal %}

首先,在views.py中传递一个参数过来:

menedisplay = 3

模板中相应的代码如下:

{% ifequal menedisplay 3 %}<a href="/category/100_0/" class="f_select f_ju">精选好货</a>{% else %}<a href="/category/100_0/">精选好货</a>{% endifequal %}

当然,还有另外一种:

{% if not my_message.name == 'a' %}aaa{% else %}bbbb{% endif %}

三、tmux
(0)安装

sudo apt install tmux   ubuntu

yum install tmux        centos

(1)、启动
tmux
tmux new -s download
(2)退出(detach)当前tmux
ctrl+d

(2)、显示所有sessions

tmux list-sessions
tmux ls

如果出现“failed to connect to server”,则表示没有session

(3)进入target-session为13的窗口

tmux attach -t 13

(3)、启动另外一个session

tmux new-session -s rails   启动一个名称为rails的session.

不过我在我的服务器上执行的时候,出现如下错误:

sessions should be nested with care, unset $TMUX to force

如果在工程过程中要启动另一个sesseion 可以按CTRL+BD,脱离当前session,D代表detached。
如果要进入rails session,可以使用:tmux a -t rails

(4)、杀死session
tmux kill-session -t blog
或者 :
tmux kill-session -t 1
删除所有session
tmux kill-server

(5)、session可以开多个窗口。

新建一个新窗口:Ctrl+B+C
切换回窗口0:CTRL+B0

(6)、一个窗口开两个窗格

P

(7)、显示快捷键
CTRL+B+?
大部分快捷键是一个字符,不过要加上CTRL+B

如果要修改快捷键配置:vim .tmux.conf

一般将系统默认的CTRL+B改为:ctrl+A

(8)服务器上恢复上一次会话:

tmux a

四、引入logging模块
网站要自动运行,怎么少得了这个模块?开始运行时老是提示“AttributeError: module 'logging' has no attribute 'basicConfig'”,后来才发现,我将py文件直接存成了logging.py,改名之后终于好了。

在配置的过程中发现如果是中文写入log文件,会发生乱码,其实只需要加上UTF8就可以了。

file_handler = logging.FileHandler('result.log',encoding='utf-8')

其实在当前文件中的logging.warning、logging.error就是会写入日志的内容。

除有上面的,logging还有以下的函数

参考资料:
https://www.cnblogs.com/Nicholas0707/p/9021672.html
https://cuiqingcai.com/6080.html

五、发送log文件到邮箱

简单代码如下:

'''
Created on 2014-12-4
@author: Dana、Li
'''
#encoding utf-8
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
import smtplib

#创建一个带附件的实例
msg = MIMEMultipart()

#构造附件1
att1 = MIMEText(open('F:/OIDFrom.txt', 'rb').read(), 'base64', 'gb2312')
att1["Content-Type"] = 'application/octet-stream'
att1["Content-Disposition"] = 'attachment; filename="OIDFrom.doc"' #这里的filename可以任意写,写什么名字,邮件中显示什么名字
msg.attach(att1)

#构造附件2
att2 = MIMEText(open('F:/OIDFrom.txt', 'rb').read(), 'base64', 'gb2312')
att2["Content-Type"] = 'application/octet-stream'
att2["Content-Disposition"] = 'attachment; filename="OIDFrom.txt"'
msg.attach(att2)

#加邮件头
msg['to'] = '1669852599@qq.com'
msg['from'] = '1669852599@qq.com'
msg['subject'] = 'hello world'
#发送邮件
try:
    server = smtplib.SMTP()
    server.connect('smtp.qq.com')
    server.login('1669852599@qq.com','xxxxxx')#XXX为用户名,XXXXX为密码
    server.sendmail(msg['from'], msg['to'],msg.as_string())
    server.quit()
    print ('发送成功')
except (Exception):  
    print("完蛋咯....")

六、Crontab自动执行python文件
在这里又遇到了一个大坑,就是我开始没有改django的settings.py文件,上面的TIME_ZONE还是默认值UTC,和中国的时间相差了8个小时,所以我建立的计划任务一个也没有执行,后来设置TIME_ZONE = 'Asia/Shanghai',终于好了。

然后我用下面的形式来写crontab:

crontab -e  #设置crontab
crontab -l  #查看当前用户的定时任务

25 23 * * * cd /home/kevin168/sites/www.xxx.com/ && source env/bin/activate && python coupon/DB_tools/import_db.py

试了很多次,就是不运行。

其实这里的问题是:python的路径不行,本文下面有说明。

后来我直接使用脚本的方式来运行,首先使用vi test.sh新建一个脚本文件,输入以下代码

#!/bin/bash
cd /home/root/sites/myblog.com/
source env/bin/activate
cd xxx/DB_tools/
python import_db.py

定时执行的简化版本:

#!/bin/bash

cd /home/dbw_02/
python3 post.py

再试试通过以下方式执行

chmod +x ./test.sh  #使脚本具有执行权限
./test.sh  #执行脚本

然后在crontab中设置

40 09 * * * sh /home/test.sh

Updated on Nov-22-2021
使用crontab的时候要注意ubuntu的版本号:
查看crontab的状态

service cron status

如果用service crond status则什么也看不到。这是因为16.04上的服务名称cron不是crond。

如果手动输入:

/bin/sh /mnt/test1.sh

可以执行,但放在crontab里就总是不起作用。则要考虑是环境变量的问题,需要在crontab的命令中添加环境变量:

50 21 * * *  . /etc/profile; /bin/sh /home/wwwroot/www.xxxpan.com/auto-post/autopost.sh  #我自己服务器上用的

别人的

50 21 * * *  . /etc/profile; /bin/sh /home/wwwroot/www.theshenpan.com/auto-post/autopost.sh

参考:https://www.cnblogs.com/mayhh/p/10688276.html

七、服务器发送日志
在这里遭遇了不少的坑。
(一)服务器无法发送邮件
第五步的代码在本地电脑上运行正常,但是督署到西数服务器上的时候,执行的时候出现“server.connect('smtp.163.com')”的错误。
后来想到阿里云的服务器禁用了发送邮件的端口,不会西数服务器也如此吧?于是一查,果然:

赶紧向客服发送邮件,开通25端口,这个问题解决。

(二)crontab的问题
步骤六的脚本,我直接执行test.sh可以运行import_db.py,改成其他的test.py,也可以成功在crontab运行,可是就是无法运行我自己的import_db.py、send_log.py,后通过以下命令查看syslog里有没有运行的记录

grep CRON /var/log/syslog

发现查到如下错误:

Sep 9 15:04:01 ebs-19644 CRON[8781]: (root) CMD (sh /home/root/importdb.sh >> 01.log )
Sep 9 15:04:01 ebs-19644 CRON[8780]: (CRON) info (No MTA installed, discarding output)

经过上网查询,这是因为crontab执行脚本时是不会直接错误的信息输出,而是会以邮件的形式发送到你的邮箱里,这时候就需要邮件服务器了,如果你没有安装邮件服务器,它就会报这个错,暂时在每条定时脚本后面加入以下代码解决:

>/dev/null 2>&1

(三)编码问题
通过以上设置,发现邮件还是没有发送成功,查询运行记录发现以下错误提示:

Non-ASCII character '\xe8' in file

于是通过在文件头添加# coding=UTF-8 解决。

(四)虚拟环境问题
再次运行,又出现以下错误:

ImportError: No module named jieba

其实结合上面的编码问题,我就应该知道是虚拟环境的问题,激活虚拟环境的那段代码没有发生作用。
最后加上python的路径,终于解决了。

source /home/root/sites/www.xxx.com/env/bin/activate
cd /home/root/sites/www.xxxx.com/coupon/DB_tools
/home/root/sites/www.xxx.com/env/bin/python 

八、修正日志中的错误
根据发送回来的日志,发现了“json.decoder.JSONDecodeError: Expecting ',' delimiter: line 1 column 70 (char 69)”的错误。这是json格式不对引起的错误 。以前也发现这个问题,是因为关键字中含有“/”这个符号,我已经将“/”作了替换,不过现在仍然出错,估计是其他符号的原因。暂时没有找到解决方案,先不管它。

九、推荐商品重复的问题
之前没有留意,最近才发现这个问题,所有列表页、详情页的相关商品或推荐商品都是一样的,这样很不利于SEO,今天再试着将代码改成:

product_sixteen = all_products.order_by('?')[:8]

这样实现了随机,但是每个页面的相关商品还是一样的。

十、修改产品详情页
由于大多数商品取不到图片,所以商品详情页存在大量的空白地方。我试着注释掉

这段代码,还是不行,发现goods-img和goods-sift这两个class的高度为5000,所以修改成2000,然后切换到自己建立的用户,进入虚拟环境,通过 python manage.py collectstatic命令,更新静态文件,终于可以按自己想要的方式显示了。

暧昧帖

本文暂无标签

发表评论

*

*