一、完善后台功能
前期开发中,因为几乎没有用到后台,所以对后没有做什么开发。后来在使用的过程中发现有些事情还得后台来做,比如:
(1)、主机商通知网页中含有敏感关键词的信息,需要修改某个产品描述,这时只根据商品ID去查询,需要一页一页地去翻页,非常浪费时间。
(2)、由于之前没有做过多的逻辑判断,首页的商品优惠券过期了,还显示在那儿,幸好之前数据库中预留了“is_recommand”字段,所以可以通过这个字段来控制,不过这时又要进入后台管理。
1、添加后台显示内容
在admin.py添加如下内容:
1 |
# Register your models here. |
2 |
class GoodsAdmin(admin.ModelAdmin): |
3 |
list_display=( 'skuid' , 'name' , 'category' , 'coupon_amount' , 'click_num' , 'expired_time' , 'add_time' ) |
5 |
admin.site.register(Goods,GoodsAdmin) |
原来后台只显示商品名称,添加后就变成了:

然后再添加筛选器,并实现搜索功能。Django为我们提供了一些实用的筛选器,主要常用筛选器有下面3个:
2 |
list_filter = ( 'category' , ) # 过滤器 |
3 |
search_fields = ( 'name' , 'detail' ) # 搜索字段 |
4 |
date_hierarchy = 'add_time' # 详细时间分层筛选 |
将上面的代码加入到admin.py,就可以看到效果了:
二、优化菜单状态
之前对菜单的选中、未选状态未加区分,无论选择哪个项目,都是“9块9包邮专区”这里显示为红色
所以现在进一步优化,只需要用下面的代码,将原来的html代码包裹起来即可。
1 |
{% ifequal my_message.name 'a' %}aaa{% else %}bbb{% endifequal %} |
首先,在views.py中传递一个参数过来:
模板中相应的代码如下:
1 |
{% ifequal menedisplay 3 %}<a href= "/category/100_0/" class = "f_select f_ju" >精选好货</a>{% else %}<a href= "/category/100_0/" >精选好货</a>{% endifequal %} |
当然,还有另外一种:
1 |
{% if not my_message.name == 'a' %}aaa{% else %}bbbb{% endif %} |
三、tmux
(1)、启动
tmux
(2)、显示所有sessions
tmux list-sessions
如果出现“failed to connect to server”,则表示没有session
(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
删除所有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就可以了。
1 |
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文件到邮箱
简单代码如下:
6 |
from email.mime.text import MIMEText |
7 |
from email.mime.multipart import MIMEMultipart |
14 |
att1 = MIMEText(open( 'F:/OIDFrom.txt' , 'rb' ).read(), 'base64' , 'gb2312' ) |
15 |
att1[ "Content-Type" ] = 'application/octet-stream' |
16 |
att1[ "Content-Disposition" ] = 'attachment; filename="OIDFrom.doc"' #这里的filename可以任意写,写什么名字,邮件中显示什么名字 |
20 |
att2 = MIMEText(open( 'F:/OIDFrom.txt' , 'rb' ).read(), 'base64' , 'gb2312' ) |
21 |
att2[ "Content-Type" ] = 'application/octet-stream' |
22 |
att2[ "Content-Disposition" ] = 'attachment; filename="OIDFrom.txt"' |
26 |
msg[ 'to' ] = '1669852599@qq.com' |
27 |
msg[ 'from' ] = '1669852599@qq.com' |
28 |
msg[ 'subject' ] = 'hello world' |
31 |
server = smtplib.SMTP() |
32 |
server.connect( 'smtp.qq.com' ) |
33 |
server.login( '1669852599@qq.com' , 'xxxxxx' )#XXX为用户名,XXXXX为密码 |
34 |
server.sendmail(msg[ 'from' ], msg[ 'to' ],msg.as_string()) |
六、Crontab自动执行python文件
在这里又遇到了一个大坑,就是我开始没有改django的settings.py文件,上面的TIME_ZONE还是默认值UTC,和中国的时间相差了8个小时,所以我建立的计划任务一个也没有执行,后来设置TIME_ZONE = ‘Asia/Shanghai’,终于好了。
然后我用下面的形式来写crontab:
1 |
25 23 * * * cd /home/kevin168/sites/www.xxx.com/ && source env/bin/activate && python coupon/DB_tools/import_db.py |
试了很多次,就是不运行。
其实这里的问题是:python的路径不行,本文下面有说明。
后来我直接使用脚本的方式来运行,首先使用vi test.sh新建一个脚本文件,输入以下代码
2 |
cd /home/root/sites/myblog.com/ |
3 |
source env/bin/activate |
再试试通过以下方式执行
1 |
chmod +x ./test.sh #使脚本具有执行权限 |
然后在crontab中设置
1 |
40 09 * * * sh /home/test.sh |
七、服务器发送日志
在这里遭遇了不少的坑。
(一)服务器无法发送邮件
第五步的代码在本地电脑上运行正常,但是督署到西数服务器上的时候,执行的时候出现“server.connect(‘smtp.163.com’)”的错误。
后来想到阿里云的服务器禁用了发送邮件的端口,不会西数服务器也如此吧?
赶紧向客服发送邮件,开通25端口,这个问题解决。
(二)crontab的问题
步骤六的脚本,我直接执行test.sh可以运行import_db.py,改成其他的test.py,也可以成功在crontab运行,可是就是无法运行我自己的import_db.py、send_log.py,后通过以下命令查看syslog里有没有运行的记录
经过上网查询,这是因为crontab执行脚本时是不会直接错误的信息输出,而是会以邮件的形式发送到你的邮箱里,这时候就需要邮件服务器了,如果你没有安装邮件服务器,它就会报这个错
(三)编码问题
通过以上设置,发现邮件还是没有发送成功,查询运行记录发现以下错误提示:
Non-ASCII character ‘\xe8’ in file
于是通过在文件头添加# coding=UTF-8 解决。
(四)虚拟环境问题
再次运行,又出现以下错误:
ImportError: No module named jieba
其实结合上面的编码问题,我就应该知道是虚拟环境的问题,激活虚拟环境的那段代码没有发生作用。
最后加上python的路径,终于解决了。
1 |
source /home/root/sites/www.xxx.com/env/bin/activate |
2 |
cd /home/root/sites/www.xxxx.com/coupon/DB_tools |
3 |
/home/root/sites/www.xxx.com/env/bin/python |
八、修正日志中的错误
根据发送回来的日志,发现了“json.decoder.JSONDecodeError: Expecting ‘,’ delimiter: line 1 column 70 (char 69)”的错误。这是json格式不对引起的错误 。以前也发现这个问题,是因为关键字中含有“/”这个符号,我已经将“/”作了替换,不过现在仍然出错,估计是其他符号的原因。暂时没有找到解决方案,先不管它。
九、推荐商品重复的问题
之前没有留意,最近才发现这个问题,所有列表页、详情页的相关商品或推荐商品都是一样的,这样很不利于SEO,今天再试着将代码改成:
1 |
product_sixteen = all_products.order_by( '?' )[:8] |
这样实现了随机,但是每个页面的相关商品还是一样的。
十、修改产品详情页
由于大多数商品取不到图片,所以商品详情页存在大量的空白地方。我试着注释掉
这段代码,还是不行,发现goods-img和goods-sift这两个class的高度为5000,所以修改成2000,然后切换到自己建立的用户,进入虚拟环境,通过 python manage.py collectstatic命令,更新静态文件,终于可以按自己想要的方式显示了。
转载请注明:XAMPP中文组官网 » 京东python开发六 后续工作(tmux)