主要记录最近遇到的一些开发问题,解决方法。
1. Python2 和 Python3 中的异常处理
Python2,Python3 都支持的两种方式:
1
2
| except (ExceptionType) as Argument:
# 访问 Argument
|
仅 Python2 支持的方式:
1
2
| except ExceptionType, Argument:
# 访问 Argument
|
2. Django 中的 get_object_or_404 和 get_queryset
get_object_or_404 通过使用 get 获取对象,否则返回 404
1
2
3
4
5
6
7
8
9
| from django.shortcuts import get_object_or_404
from django.forms.models import model_to_dict
from django.http import JsonResponse
from .models import Fruit
def filter404(request):
obj = get_object_or_404(Fruit, title='aa')
return JsonResponse(model_to_dict(obj))
|
使用 get_queryset 可以全局的定制查询行为,包括 admin
1
2
3
| class FruitManager(models.Manager):
def get_queryset(self):
return super(FruitManager, self).get_queryset().filter(is_delete=False)
|
3. 树形结构存储
每个节点存储其完整路径编码。
1
2
3
4
5
| Name Path
William 1
Jones 1/1
Blake 1/2
Adams 1/2/1
|
优点是读取和写入都非常快。
邻接列表表示通过保持到某些相邻节点的链接来存储树。
1
2
3
| Name Parent Next
William null Joseph
Jones William Blake
|
优点是,结构简单易懂,但是数据量很大时,基于递归的查询效率非常低。
每个节点存储一些索引(通常是左右值)。
1
2
3
4
| Name left right
William 1 10
Jones 2 3
Blake 4 7
|
优点是查询数据很快,但是更新时,需要修改的节点很大。
将区间映射为二维空间,每一个节点根据规则对应一个分数。在涉及节点位置的层次查询时,不需要访问数据库。优点是,性能非常好,但是实现和理解起来有一点门槛。
django-treebeard 实现了物化路径,嵌套集和邻接列表。 django-mptt 混合了嵌套集和邻接列表,能高效地查询子节点,被破坏时可以重建树。
4. Pytest 找不到模块报错
报错信息:
1
2
3
4
5
6
| =================================== ERRORS ====================================
_____________ ERROR collecting home_application/test/test_mptt.py _____________
ImportError while importing test module 'C:\pytest\home_application\test\test_mptt.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
ImportError: No module named home_application.test.test_mptt
|
问题原因:
test 目录下,存在 __init__.py
文件,导致 Pytest 将整个 test 当作一个模块来处理。实际上,我们需要的是 Pytest 进入目录,找到 test_
开头的文件,运行测试。只需要删除 __init__.py
文件即可。
5. CentOS 7 中 /etc/rc.local 开机不自动运行
查看 /etc/rc.local 内容发现:
1
2
| # Please note that you must run 'chmod +x /etc/rc.d/rc.local' to ensure
# that this script will be executed during boot.
|
CentOS 7 建议创建 systemd 用于开机自启动。
如果需要使用旧的方式,则需要添加到 /etc/rc.d/rc.local。同时,执行 chmod +x /etc/rc.d/rc.local
,赋予可执行权限。
6. Secure shell Extension 插件 NaCI 退出,状态 255
报错原因是本地保存的指纹信息与主机信息不符。
解决办法:
在 shell 窗口,按下 Ctrl+Shift+J 进入调试窗口,在 console 执行:
1
| term_.command.removeAllKnownHosts()
|
清空 known_hosts 即可。
7. Python 续行的几种方式
1,利用反斜杠
1
2
3
4
5
6
7
8
9
| a = 'sdfaf' \
'test'
a = '1' + '2' + '3' + \
'4' + '5'
if False and \
True:
pass
|
2, 利用括号
1
2
3
4
5
6
7
8
9
| a = ('sdfaf'
'test')
a = ('1' + '2' + '3' +
'4' + '5')
if(False and
True):
pass
|