Wordpress迁移到Hexo遇到的问题中说过Wordpress迁移到Hexo时会遇到文件名问题,当时写了个Python脚本解决,现在有了更好的解决办法,于是记下。

在迁移的时候会生成

1
2
3
e8-af-ad-e8-a8-80-e7-89-b9-e6-80-a7-e8-bf-98-e6-98-af-e6-9c-89-e5-bf-85-e8-a6-81-e5-ad-a6-e4-b9-a0-e7-9a-84.md
e8-bd-af-e8-bf-9e-e6-8e-a5-e5-92-8c-e7-a1-ac-e8-bf-9e-e6-8e-a5.md
e8-bf-bd-e8-b8-aaquery-too-complex-not-enough-stack-e9-94-99-e8-af-af.md

这样的文件名, 原因是文件名是从URL转化而来。后来发现将URL进行encode之后就没有这个问题。在fork出的hexo-migrator-wordpress里解决了这个问题,在github上提交了一个pull request, 但一直没有被合并,匪夷所思。

不过还是可以直接安装我的仓库里的代码来解决这个问题。npm install https://github.com/dengshilong/hexo-migrator-wordpress.git --save

联系作者

如果需要对提交的代码进行检查,可以使用hooks, 也就是钩子,如果需要在代码提交到参考后进行发布,也可以使用hooks.

在初始化git仓库时,在.git目录的hooks目录里提供了一些例子。

在我的学习笔记的仓库里,我定义了post-receive这个hooks, 当deploy出现在commit的说明信息中,就更新学习笔记。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#file info
GIT_REPO=/home/dengsl/program/nodejs/blog
DEPLOY_DIR=/home/dengsl/program/html/blog/note

# Get the latest commit subject
SUBJECT=$(git log -1 --pretty=format:"%s")

cd $GIT_REPO
env -i git reset --hard

#update or deploy
IF_DEPLOY=$( echo $SUBJECT | grep 'deploy')
if [ -z "$IF_DEPLOY" ]; then
echo >&2 "Success. Repo update only"
exit 0;
fi

# Check the deploy dir whether it exists
if [ ! -d $DEPLOY_DIR ] ; then
echo >&2 "fatal: post-receive: DEPLOY_DIR_NOT_EXIST: \"$DEPLOY_DIR\""
exit 1
fi

#deploy static site
hexo g
cp -r public/* $DEPLOY_DIR

参考资料:

联系作者

Django提供的migrations功能将项目中的model与数据库表同步,方便开发。

  • makemigrations app_name 生成某个app的migrations
  • migrate [app_label] [migration_name]使某个app的migrations生效,当加上–fake时,假装执行migrations,实际并不执行
  • sqlmigrate app_label migration_name 列出某个migrations的sql语句

联系作者

在天涯的时候,有个同事建议我分享一下正则,只是那时候使用正则的开发经验还少,没有能力分享。

后来到杭州后,进入同花顺,使用正则解决了一些问题。也是在这里,我才知道,许多开发人员对于正则还不是很理解。

离开同花顺,来到天猪,做Web开发,使用正则的场景比之前多。在这里,同样发现同事的正则水平需要提高。前端组同学组织了两周一次的技术分享,后来发展到技术组的技术分享,于是我也给大家进行了一次正则分享

联系作者

Django之cache的例子中,我们使用了缓存。但这里存在一个问题,当我们添加了数据后,因为缓存是有实效的,里面的数据没有更新。此时需要有一个机制,当我们更新的model的数据时,要清除缓存。Django提供的Signals可以满足这个需求。

在model保存和删除时,需要进行清除缓存。这里用到post_save和post_delete两个信号。

在area的models.py里添加如下代码

1
2
3
4
5
6
7
8
9
10
@receiver(post_delete, sender=Area)
@receiver(post_save, sender=Area)
def delete_cache(sender, **kwargs):
#清除cache
obj = kwargs['instance']
if obj.parent is None:
key = "city_list_0"
else:
key = "city_list_%s" % obj.parent_id
cache.delete(key)

之后在admin后台添加和删除数据时,缓存就会被清除。访问http://127.0.0.1:8000/area/api/city/list/1 时就可以读取到最新的数据

想自己尝试的可以下载test-django

联系作者

在Django开发过程中,要实现REST api时,Django REST framework是一个很不错的模块。

拿前面的省/市/区(县)的例子来说,假设我们要提供一个返回某个省份下所有城市的api。

  • 安装Django REST framework,
    执行pip install djangorestframework进行安装, 在项目的settings的INSTALLED_APPS里添加’rest_framework’
  • 在area应用里添加api.py文件,内容如下, API View如何编写参看generic-views
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    from rest_framework import generics
    from .cache import city_cache
    from .serializer import AreaSerializer
    class CityListAPI(generics.ListAPIView):
    serializer_class = AreaSerializer

    def get_queryset(self):
    return city_cache(self._province)

    def get(self, request, *args, **kwargs):
    self._province = kwargs['province']
    return super(CityListAPI, self).get(request, *args, **kwargs)

在代码里我们看到city_cache的调用,这里就是用的之前介绍的cache

  • 在area应用里添加serizlizer.py文件,添加序列化, 序列化如何编写参看serializers

    1
    2
    3
    4
    5
    6
    7
    8
    from rest_framework import serializers
    from .models import Area


    class AreaSerializer(serializers.ModelSerializer):
    class Meta:
    model = Area
    fields = ('id', 'name', 'level')
  • 在area中添加urls.py文件,内容如下

    1
    2
    3
    4
    5
    6
    7
    8

    from django.conf.urls import patterns, url

    from .api import CityListAPI

    urlpatterns = patterns('',
    url(r'^api/city/list/(?P<province>\d+)$', CityListAPI.as_view(), name='city_list'),
    )
  • 在项目的urls.py里添加area的url
    url(r'area/', include('area.urls'))

之后启动服务,就可以访问http://127.0.0.1:8000/area/api/city/list/1 看到结果。

联系作者

在前面的省/市/区(县)的例子中,如果查询某个省下面的市信息是一个常用的操作时,此时可以使用缓存。

Django提供了cache功能,只需要进行简单配置就可以使用。缓存可以保存在很多地方,如Memcached, Redis等,这里以Redis为例。

按照django-redis官方文档, pip install django-redis进行安装。在项目的settings.py里添加如下配置

1
2
3
4
5
6
7
8
9
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://127.0.0.1:6379/1",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
}
}
}

之后就可以使用缓存了。在area应用里添加cache.py文件,添加如下内容

1
2
3
4
5
6
7
8
9
10
11
12
#coding:utf-8
from django.core.cache import cache
from .models import Area

def city_cache(province):
"""市"""
key = 'city_list_%s' % province
cities = cache.get(key)
if cities is None:
cities = list(Area.objects.filter(parent_id=province))
cache.set(key, cities, 36000)
return cities

这样调用city_cache时,传入省份id,就可以得到这个省下面的所有市的列表。

具体操作可以参看我在github上的test-django仓库

联系作者

在Web开发中,省/市/区(县)是经常需要用到的数据,而省/市/区(县)是一种层级关系。在使用Django做Web开发时,此时Django-mptt是一个很有用的模块。

首先执行pip install django-mptt安装django-mptt模块如test-django中示例那样,建立area应用,在area的models.py里添加如下model

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#coding:utf-8
from __future__ import unicode_literals

from django.db import models
from mptt.models import MPTTModel, TreeForeignKey

# Create your models here.

class Area(MPTTModel):
name = models.CharField(max_length=50, unique=True)
parent = TreeForeignKey('self', verbose_name=u'上级区域', null=True, blank=True, related_name='children')

class MPTTMeta:
order_insertion_by = ['name']

class Meta:
db_table = 'area'
verbose_name = verbose_name_plural = (u'省/市/地区(县)')

def __unicode__(self):
return self.name

在area的admin.py里添加

1
2
3
4
5
6
7
8
9
from django.contrib import admin

# Register your models here.
from .models import Area


class AreaAdmin(admin.ModelAdmin):
list_display = ('id', 'name', 'parent', 'level')
admin.site.register(Area, AreaAdmin)

在项目的settings里INSTALLED_APPS里添加mptt和area,之后执行数据库操作。之后在admin后台中就可以按照层级关系添加省/市/区(县)数据。

当然最好的方式还是用程序导入。从统计局上爬取数据后导入到数据库中。

对于mptt要想深入理解的,可以参考这篇文章hierarchical-data-database

联系作者

当使用git reset回退到某个后,想再回到当前版本,而git log中看不到当前的版本,此时reflog就派上用场了。

  • git reflog 查看版本操作信息,在这里可以看到版本号,之后使用git reset进行版本切换

参考资料:

联系作者

reset命令用于重置到某个状态。

常用的命令如下

  • git reset
    将所有add到缓存区的操作撤销,如果需要对某个文件撤销,可以使用git reset 文件名

  • git reset –hard
    撤销所有的修改,可以在–hard后添加版本后,表示reset到某个版本

参考资料:

联系作者