留言板  |    文章总数=102  |    RSS订阅
半夜给你留灯的,只有自动售货机毒鸡汤

Django增加站点运行天数统计功能

2020-03-23     loonlog     441     2

最近闲来没事,总想着为我的博客添加些小功能,比如,为站点添加一个网站运行天数的统计信息,以此来鼓励自己,要继续加油呀!

干一件事总想着要用最简单的方法处理,刚开始想到有现成的模版过滤器用,还真就有几个,比如

{{ datetime|timesince }}和{{ datetime|timeuntil }}: 给定日期到现在过去了多少时间,二者的区别就在于日期的前后位置。

但不爽的是,他自己默认的输出格式是“1 年,3 月”或者“5月,10天”,比较不好的是,逗号不爽,语义不太符合中国人习惯,还有就是有空格,虽然可以用cut过滤器去掉逗号,去掉逗号之后会发现,还有空格,好烦呀,再想其他办法吧。

还好,在python中,可以使用datetime模块可以计算两个时间的差,比如:

import datetime

d1 = datetime.datetime(2005, 2, 16)
d2 = datetime.datetime(2004, 12, 31)
print (d1 - d2).days

计算运行时间的例子,以秒进行显示

import datetime
starttime = datetime.datetime.now() 
#long running 
endtime = datetime.datetime.now() 
print (endtime - starttime).seconds

这个方法挺好,决定用这个方法了。

1、把代码添加在自定义模版标签,

在你的模版标签blog_tags.py文件中,新添加一个简单的模版标签,注册,并写相应的代码,如下:

from django.utils import timezone #引入timezone模块
import datetime
... 
@register.simple_tag
def get_run_times(): # 获取站点运行时间
    post = Post.objects.order_by('pk').first() #获取站点创建的第一篇文章
    set_time = post.created   #获取第一篇文章的创建时间
    now_time = timezone.now()  #获取当前时间
    run_times = (now_time - set_time).days  #计算两个时间的差
    return run_times

代码中省略号为其他无关的代码,只显示实际功能代码,下文处理方式相同。

2、在前端html文件中,包含自定义模版标签,然后使用模版标签显示运行天数

{% load blog_tags %}
...
{%  get_run_times as tianshu %}
    {{ tianshu }}
...

以上就完美的显示当前运行的天数了。

优化一下


3、然而,上面的代码中,获取了第一篇文章的创建时间,这个时间也不用非得查询数据库,因为建站时间是已知的,我们只需固定这个时间即可,解决服务器资源,把set_time换成固定时间,代码如下

...

@register.simple_tag
def get_run_times(): # 获取运行时间
    set_time = datetime.datetime(2019,5,10)  #现在使用手动输入一个固定时间,可以减少后台查询数据库
    now_time = timezone.now()
    run_times = (now_time - set_time).days
    return run_times

改后代码运行网页时候报错,错误信息为:

can't subtract offset-naive and offset-aware datetimes

这是因为两个时间不属于同一类型,offset-naive是不含时区的类型,而offset-aware是有时区类型,两者自然不能比较,两者做时间差是不行的。我们需要将一个offset-aware型转换为offset-naive型,也即是把带时区类型的数据转换为不带时区的类型,即可满足我们使用,管他是哪个时区呢,统计可以精确到天,差几个小时又如何。

代码改为下面的结构

...
@register.simple_tag
def get_run_times(): # 获取运行时间
    set_time = datetime.datetime(2019,5,10)  #现在使用手动输入一个固定时间,可以减少后台查询数据库
    now_time = timezone.now().replace(tzinfo=None)  #这里使用replace(tzinfo=None)是为了把这个时间格式转换为不含时区类型,
    run_times = (now_time - set_time).days
    return run_times

重新运行,ok,完美显示。


参考资料:

https://blog.csdn.net/qq_25420115/article/details/53149669

https://blog.csdn.net/xm_csdn/article/details/76228061

 欢迎留言评论,相互交流!

django , python , 博客

    觉得有用?请点击页面顶部广告支持我!

您可能感兴趣的文章

发表评论(关于评论)

评论列表,共 2 条评论

  • 回复

    1楼

    vuitr机房好贵啊,感觉。个人就是爬个梯子,弄个小博客什么的。

    菜鸟之志 dganggo ,

    回复

    要说贵吧,目前我也没发现便宜的,放个梯子,在弄点其他的,比如博客,就相当于充分利用他了,物有所值!

    用vultr还有个最大的优势就是,备份快照,需要的时候,重新恢复一个服务器,相当于换个ip,他是按照小时收费,删除就不计费,弄一个测试一下也不会花几分钱,比较自由。