Django 中STATIC_ROOT 与STATICFILES_DIRS的区别

在做Django项目的时候,经常会遇到静态文件访问的问题,在本地开发的时候可以正常的访问静态文件,部署到服务器上后就出现各种幺蛾子了,我猜你一定也遇到过吧?之前在settings.py配置文件中对STATIC_ROOTSTATICFILES_DIRS两个配置项不是特别理解,总感觉都差不多,在线上就把STATIC_ROOT替换成STATICFILES_DIRS了,虽然可以解决问题,但是却没有知其所以然。

[阅读全文]

利用Python 优雅的将PDF 转换成图片

之前收集了很多优秀的PDF文档,但是需要看的时候不是很方便,需要去找到这个文件,如果是在手机上的话往往还需要下载PDF相关的插件才行,而且最大的问题是不便于资料的整理和分享。如果能够将PDF转换成网页,岂不是就能解决这些问题了?还能直接分享出去。

这里利用PyPDF包来处理PDF文件,为了方便快捷,我这里直接将一个页面转换成图片,就不需要去识别页面中的每一个PDF元素了,这是没必要的。

[阅读全文]

服务网格(Service Mesh)是什么?

现在最火的后端架构无疑是微服务了,微服务将之前的单体应用拆分成了许多独立的服务应用,每个微服务都是独立的,好处自然很多,但是随着应用的越来越大,微服务暴露出来的问题也就随之而来了,微服务越来越多,管理越来越麻烦,特别是要你部署一套新环境的时候,你就能体会到这种痛苦了,随之而来的服务发现、负载均衡、Trace跟踪、流量管理、安全认证等等问题。如果从头到尾完成过一套微服务框架的话,你就会知道这里面涉及到的东西真的非常多。当然随着微服务的不断发展,微服务的生态也不断完善,最近就发现新一代的微服务开发就悄然兴起了,那就是服务网格/Service Mesh

[阅读全文]

Kubernetes Deployment滚动升级

我们k8s集群使用的是1.7.7版本的,该版本中官方已经推荐使用Deployment代替Replication Controller(rc)了,Deployment继承了rc的全部功能外,还可以查看升级详细进度和状态,当升级出现问题的时候,可以使用回滚操作回滚到指定的版本,每一次对Deployment的操作,都会保存下来,变能方便的进行回滚操作了,另外对于每一次升级都可以随时暂停和启动,拥有多种升级方案:Recreate删除现在的Pod,重新创建;RollingUpdate滚动升级,逐步替换现有Pod,对于生产环境的服务升级,显然这是一种最好的方式。

[阅读全文]

Kubernetes使用Prometheus搭建监控平台

最近在测试环境搭建了Kubernetes集群环境,迁移了部分测试环境的应用,由于测试集群性能不是很好,有时会遇到集群资源不够的情况,一般情况下我们是直接通过Dashboard的资源统计图标进行观察的,但是很显然如果要上到生产环境,就需要更自动化的方式来对集群、Pod甚至容器进行监控了。Kubernetes内置了一套监控方案:influxdb+grafana+heapster。但由于之前我们的应用的业务监控使用的是Prometheus,所以这里准备使用Prometheus来完成k8s的集群监控。

[阅读全文]

Python装饰器简介

装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。它经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等场景。装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量与函数功能本身无关的雷同代码并继续重用。概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能

[阅读全文]

用awk做基本运算

awk是非常强大的文本处理工具,之前经常见到脚本里面有使用,但是没有自己完完整整来写过awk命令。正好今天公司里有一个非常的大的日志文件需要分析。需求是将日志文件中记录的耗时时间评价值、最大值、最小值计算出来。日志的格式如下:

[2016-03-30 00:02:02,475] [17243] [140344433927936] [MainThread] [tasks.py:733] DEBUG [upload to oss] upload file /data/image5/user_upload_image/20160330/00/1458483897397580_101183475_1459267295740.jpg to oss cost time 28 ms
[阅读全文]

Nginx中如何设置301跳转

网站中带www和不带都可以访问,但是这样却会不利于网站SEO的,会分权,所以需要将二者的访问合并到一起,这特别在网站架设之初就应该好好规划。

有很多的第三方DNS解析服务,提供了直接的显示跳转的服务,比如dnspod,但是最近我在使用的过程中发现该服务非常的不稳定,导致网站经常性的访问不了。所以就打算自己来做,方法很简单,就是301跳转301是永久跳转302是临时性跳转

[阅读全文]

用python处理csv文件

CSV通常是纯文本文件。可以用Sublime Text或者EXCEL打开,python提供了一个非常强大的处理csv文件的库csv。

一般情况,如果csv文件不是很复杂则可以直接输出文件中每行的数据,代码如下:

import csv

def read_csv_file(path):
    with open(path, 'rb') as f:  # r表示读取,b表示读取的文件
        reader = csv.reader(f)
        for row in reader:
            print row
    f.close()
[阅读全文]

自定义django admin后台的action

提到强大的django,最能引起大家共鸣的可能是其自带的admin了,提供了默认的强大的功能,而且我们还能根据自己的需求进行定制。django admin的列表页自带了一个批量删除所选对象的action,我们还可以添加自定义的功能action来实现其他功能,比如批量标记将文章标记为已发布。如下代码:

[阅读全文]

django下url函数的用法

Django下有一个比较隐含的函数url,在django/conf/urls/defaults模块中,虽然只有短短的10行代码,但功能却很了得。起初初学Django,并没有发现它,Templates的链接地址都是根据urlpatterns定义的地址,拼凑成地址字符串,很难看,而且Templates里拼凑成的地址,随着页面的增加而不断增加,一旦在urlpatterns里的某个地址改变了名称,那眼泪可是哗哗的,有多少的拼凑的地址就得改动多少处!这时发现了url函数,这下可都好了,不管urlpatterns里的某个地址叫法怎么改变,Templates里的地址都不用修改了。

比如没有采用url函数的时候:urlpatterns里定义了资讯的首页地址,

urlpatterns = patterns('',
    (r'^article$','news_index' ),
)
[阅读全文]

Memcached的一些坑!!!

我们的网站用django跑了很久了,一直没出现什么大的问题,突然一天晚上网站访问超级慢,出现大量的502错误码,难不成用户量猛增么,要是这样就好了。请教了很多运维高手帮忙排查问题、代码也回滚到上一个正常运行的版本了,但依然负载一会高一会低。

捣腾了一天,最后定位到我们的代码有问题,有几个经常访问的API缓存了15分钟,经过分析发现其中一个API始终缓存不上,但在本地和测试环境都是没有问题的,这真是搞死人啊。后面发现这个API的请求的数据非常之大,接近2M了。而Memcache有很多限制,其中就有value值大小的限制,终于找到问题了,泪牛满面啊……

[阅读全文]