每种编程语言或框架都有自己的编码规范, 基于Python语言的Django框架也不例外。代码规范提供的指导方针旨在提高代码的可读性,并使其在各种Python代码中保持一致。
Django是Python语言写成的框架,所以其代码也要求符合Python的PEP8编码规范PEP 8 只是个指南,并非强制约束。可以使用Flake8来辅助检测的Python代码是否规范,使用pip安装即可。
PyCharm已自带代码检查工具,使用时还推荐使用.editorconfig文件来配置编码规范,比如html中使用2个空格做缩进。
raise AttributeError('Here is a multiline error message ''shortened for clarity.'
)
而不是采用如下垂直对齐的方式(这是很多新手易范的错误):
raise AttributeError('Here is a multiline error message ''shortened for clarity.')
第一种方式更好的原因是,当需要改变某行文字内容时,不需要再进行手动对齐了。
Django对字符串推荐使用单引号,只有当字符串本身里包含单引号时才使用双引号。对于三引号docstring注释,Django推荐3个双引号,如下所示:
def test_foo():"""A test docstring looks like this (#123456). """pass
导包时要注意区分哪些是来未来的,哪些是python的标准库,哪些是第三方包,哪些是Django自带的标准包以及开发者自己编写的包。对于Django自带的包使用绝对路径,对于开发者自己编写的包, 使用相对路径。
另外还需要注意最后一行导包(import)与自己代码之间的空格距离,与一般模块代码空格一行即可,但与的第一个函数或类必需空格两行。
示范代码如下所示:
# future
from __future__ import unicode_literals
# standard library
import json
from itertools import chain
# third-party
import bcrypt
# Django
from django.http import Http404
from django.http.response import (Http404, HttpResponse, HttpResponseNotAllowed, StreamingHttpResponse,cookie,)
# local Django
from .models import LogEntry
# try/except
try:import yaml
except ImportError:yaml = None
CONSTANT = 'foo'class Example:# ...
还可以使用isort帮实现自动化导包顺序,使用如下命令即可:
python -m pip install isort >= 5.1.0
isort -rc .
# Good
{{ foo }}# Bad
{{foo}}
# Right
def my_view(request, foo):# ...# Wrong
def my_view(req, foo):# ...
# Good
class Person(models.Model):first_name = models.CharField(max_length=20) last_name = models.CharField(max_length=40)# Bad
class Person(models.Model):FirstName = models.CharField(max_length=20) Last_Name = models.CharField(max_length=40)
class Person(models.Model):first_name = models.CharField(max_length=20) last_name = models.CharField(max_length=40)class Meta:verbose_name_plural = 'people'
model内的类和方法的定义顺序应该遵循如下顺序
有时需要给模型定义__str__方法,重写save方法或自定义其它方法,这些方法应该放在Meta选项后面,且遵循下面的顺序(不是所有项都是必需的):
class MyModel(models.Model):DIRECTION_UP = 'U'DIRECTION_DOWN = 'D'DIRECTION_CHOICES = ((DIRECTION_UP, 'Up'),(DIRECTION_DOWN, 'Down'),)
模块不常用的设置项被储存在 django.conf.settings 中
模块通常不应使用存储在django.conf.settings中的顶级设置(即在导入模块时进行评估)。:
允许手动配置设置(即不依赖于DJANGO_SETTINGS_MODULE环境变量),并且可能如下:
from django.conf import settingssettings.configure({}, SOME_SETTING='foo')
但是,如果在settings.configure行之前访问了任何设置,则此操作将不起作用。(在内部,设置是一个LazyObject,如果尚未配置,则在访问设置时会自动配置它自己)。
因此,如果有一个模块包含如下代码:
from django.conf import settings
from django.core.urlresolvers import get_callabledefault_foo_view = get_callable(settings.FOO_VIEW)
…
然后导入此模块将导致配置设置对象。这意味着,第三方在顶级导入模块的能力与手动配置设置对象的能力不兼容,或者在某些情况下非常困难。
必须使用一定程度的惰性或间接性来代替上面的代码,例如django.utils.functional.LazyObject, django.utils.functional.lazy() 或 lambda.。
最后,关于编码规范开发辅助类的工具使用,参考下篇文章:企业开发中的编码规范校验和代码提交规范校验工具使用。介绍pre-commit、pep8编码规范检查工具flake8、导包规范工具isort、删除不再使用的导入语句pyflakes、pylint等工具的实际使用。