正则分享
在天涯的时候,有个同事建议我分享一下正则,只是那时候使用正则的开发经验还少,没有能力分享。
后来到杭州后,进入同花顺,使用正则解决了一些问题。也是在这里,我才知道,许多开发人员对于正则还不是很理解。
离开同花顺,来到天猪,做Web开发,使用正则的场景比之前多。在这里,同样发现同事的正则水平需要提高。前端组同学组织了两周一次的技术分享,后来发展到技术组的技术分享,于是我也给大家进行了一次正则分享。
在天涯的时候,有个同事建议我分享一下正则,只是那时候使用正则的开发经验还少,没有能力分享。
后来到杭州后,进入同花顺,使用正则解决了一些问题。也是在这里,我才知道,许多开发人员对于正则还不是很理解。
离开同花顺,来到天猪,做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。
pip install djangorestframework
进行安装, 在项目的settings的INSTALLED_APPS里添加’rest_framework’1 | from rest_framework import generics |
在代码里我们看到city_cache的调用,这里就是用的之前介绍的cache
在area应用里添加serizlizer.py文件,添加序列化, 序列化如何编写参看serializers
1 | from rest_framework import serializers |
在area中添加urls.py文件,内容如下
1 |
|
在项目的urls.py里添加area的urlurl(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
9CACHES = {
"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里添加如下model1
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
9from 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就派上用场了。
参考资料:
reset命令用于重置到某个状态。
常用的命令如下
git reset
将所有add到缓存区的操作撤销,如果需要对某个文件撤销,可以使用git reset 文件名
git reset –hard
撤销所有的修改,可以在–hard后添加版本后,表示reset到某个版本
参考资料:
在使用git时,checkout也是一个常用的命令。
git checkout -b <branch> --track <remote>/<branch>
git branch foo
和git checkout foo
两条命令git fetch origin feature-name
进行拉取。参考资料:
理解了fetch和merge后,之后再来看git pull就容易多了。在git的官方文档上,有git pull is shorthand for git fetch followed by git merge FETCH_HEAD
,也就是说git pull是git fetch和git merge的结合,只是这里的merge是fast-forward方式。
依然在test-git仓库上进行测试,
使用`git log –graph –pretty=oneline –abbrev-commit`查看log,
1 | * dee871e Merge remote-tracking branch 'origin/master' |
git pull
直接拉取远程分支的变化得到的git fetch origin master
和git merge --no-ff origin/master
两个命令后的结果。从上面的结果可以看出,使用git fetch
和git merge --no-ff
更能保存仓库版本变化的轨迹,推荐使用这种方式。
参考资料:
分支操作是一个常见的操作。当在某一分支开发完新功能后,需要合并到master分支,此时就需要使用merge命令。
merge有两种方式,一种是fast-forward, 一种是非fast-forward方式。
这两种方式的差别在于是否保留分支合并的信息。为此特意在github上建了一个test-git仓库。
使用git log --graph
在master分支上查看log时,可以很方便的看出两种方式的区别。这里添加了一些参数,使结果更简洁
`git log –graph –pretty=oneline –abbrev-commit`
1 | * 6ce6fab Merge branch 'feature-noff-merge' |
参考资料: