2、Django开发总结:官方推荐编码规范
创始人
2025-05-31 02:56:24
0

每种编程语言或框架都有自己的编码规范, 基于Python语言的Django框架也不例外。代码规范提供的指导方针旨在提高代码的可读性,并使其在各种Python代码中保持一致。

Python编码规范

Django是Python语言写成的框架,所以其代码也要求符合Python的PEP8编码规范PEP 8 只是个指南,并非强制约束。可以使用Flake8来辅助检测的Python代码是否规范,使用pip安装即可。

PyCharm已自带代码检查工具,使用时还推荐使用.editorconfig文件来配置编码规范,比如html中使用2个空格做缩进。

  1. 使用4个空格做缩进。
  2. 系统性移除代码里多余的空格。
  3. 函数名用小写。
  4. 类名首字母大写(ShowCase)的方式命名(或能够返回类的工厂函数)。
  5. PEP8规范里每行代码字符数要求不超过79个,而Django允许每行最多119个字符, 这是GitHub代码审查时可以接受的每行代码的最大长度。
  6. 如果有一行代码非常长,建议使用如下方式换行。括号单独成行,依然使用4个空格为每行内容做缩进:
raise AttributeError('Here is a multiline error message ''shortened for clarity.'
)

而不是采用如下垂直对齐的方式(这是很多新手易范的错误):

raise AttributeError('Here is a multiline error message ''shortened for clarity.')

第一种方式更好的原因是,当需要改变某行文字内容时,不需要再进行手动对齐了。

  1. 字符串的引号使用

Django对字符串推荐使用单引号,只有当字符串本身里包含单引号时才使用双引号。对于三引号docstring注释,Django推荐3个双引号,如下所示:

def test_foo():"""A test docstring looks like this (#123456).    """pass

 

导包(import)

  1. 包的导入规范

导包时要注意区分哪些是来未来的,哪些是python的标准库,哪些是第三方包,哪些是Django自带的标准包以及开发者自己编写的包。对于Django自带的包使用绝对路径,对于开发者自己编写的包, 使用相对路径。

另外还需要注意最后一行导包(import)与自己代码之间的空格距离,与一般模块代码空格一行即可,但与的第一个函数或类必需空格两行。

  1. 没有用到的包或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 .

模板风格

  1. 对于模板中的变量,遵循大括号及标签内容之间使用一个(只需一个)空格
# Good
{{ foo }}# Bad
{{foo}}

视图风格

  1. 对于函数视图,第一个参数永远是request, 不要擅自修改, 应该被命名为 request。
# Right
def my_view(request, foo):# ...# Wrong
def my_view(req, foo):# ...

 

模型风格

  1. 模型的字段应该是小写字母,可以使用下划线连接,不要使用驼峰命名。
# 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)

 

  1. 模型的Meta选项应该在自定义模型字段最后,且与最后一条字段间有一空行。
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选项后面,且遵循下面的顺序(不是所有项都是必需的):

  • 定义的模型字段
  • 定制的Manager(管理器属性)方法
  • class Meta选项
  • def __unicode__()
  • def __str__()
  • def save()
  • def get_absolute_url()
  • 其它自定义方法
  1. 如果一个 model 字段定义了 choices,那么定义的多元元组的名称应该全部大写。
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.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.。

其他项

  • 标记所有字符串以进行国际化,国际化时按规范标记所有需要翻译的字符串,有关详细信息,请参阅i18n文档。
  • 删除在更改代码时不再使用的导入语句。此任务最常用的工具是pyflakes和pylint。
  • 系统地从代码中删除所有尾部空白,因为这些空白会添加不必要的字节,给补丁添加视觉混乱,偶尔还会导致不必要的合并冲突。一些IDE可以配置为自动删除它们,大多数VCS工具可以设置为在diff输出中突出显示它们。然而,请注意,只删除空白(或只为标称的PEP 8一致性进行更改)的补丁可能会被拒绝,因为它们只引入噪声而不是代码改进。下次在该区域更改代码时,请整理好。
  • 请不要在您贡献的代码中输入您的姓名。策略是将贡献者的名字保存在与Django一起分发的AUTHORS文件中,而不是分散在整个代码库中。

最后,关于编码规范开发辅助类的工具使用,参考下篇文章:企业开发中的编码规范校验和代码提交规范校验工具使用。介绍pre-commit、pep8编码规范检查工具flake8、导包规范工具isort、删除不再使用的导入语句pyflakes、pylint等工具的实际使用。

参考资料

  1. Django官方规范指南:Coding style | Django documentation | Django
  2. JavaScript规范指南:JavaScript | Django documentation | Django
  3. PEP 8规范指南:https://peps.python.org/pep-0008/
  4. pep8检查工具:pep8 · PyPI

相关内容

热门资讯

王凤英入职小鹏3年终获股权,此... 5月7日消息,小鹏汽车披露的监管及年报信息显示,公司总裁王凤英已正式进入股东名册,入职小鹏3年后股权...
五块钱红酒卖断货,便宜红酒为何... 最近一段时间,中国的酒类消费市场可以说是显得格外奇怪,一方面,各种高端酒特别是白酒的消费量出现了明显...
财联社C50风向指数调查:4月... 财联社5月8日讯(记者 夏淑媛)新一期财联社“C50风向指数”结果显示,市场机构对4月新增人民币贷款...
央视硬刚国际足联拒掏20亿,背... 作者| 史大郎&猫哥 来源| 是史大郎&大猫财经Pro 央视这次太刚了,离世界杯开幕还有1个月,死活...
新CEO上任直接放大招!Air... 快科技5月8日消息,苹果即将上任的CEO John Ternus对未来一系列新产品充满信心,称这些设...
“特朗普拟邀英伟达、波音等CE... 据路透社当地时间5月7日报道,特朗普政府正邀请英伟达、苹果、埃克森美孚、波音等大公司首席执行官,于下...
世界杯,还能看到直播吗? 2026年美加墨世界杯距离开幕,仅剩一个多月时间。多方信息显示,中央广播电视总台(以下简称“央视”)...
机构警告AI芯片热潮风险,超威... 5月7日,据央视财经,隔夜超威半导体公司(AMD)股价飙升近19%,带动AI芯片热潮持续升温。AMD...
银行员工转走储户1800万最新... 银行员工转走储户1800万最新进展:2名储户已收到银行全部款项
原创 中... 1994年,安徽省的经济格局曾发生过一次戏剧性的转折。在那一年,一座名为安庆的城市,其国内生产总值(...
昆都仑区:政策“蓄力”消费焕新 “一台5000多元的空调,叠加‘国补’和商场的以旧换新活动,能优惠1000元左右,旧机还能免费上门拆...
乐悦置业竞得佛山顺德乐从镇一商... 观点网讯:5月6日,佛山市顺德区乐从镇一商业地块成功出让,由广东省乐悦置业有限公司竞得,乐从南区·邻...
原创 亦... 《爱情没有神话》这部剧,一开始的命运颇为多舛,经历了几次撤档的波折后,终于在观众面前亮相,但其首播的...
美联储34年最大分歧叠加油价飙... 美联储按预期维持利率不变,但内部出现34年来最严重分歧,叠加布油创2022年6月以来新高,美债遭抛售...
支付宝消费券回收后,资金是否支... 摘要: 支付宝消费券回收变现后,资金能否直接转入信用卡?本文解答到账方式的相关规则,帮助用户了解资金...
中医介绍5个化痰穴位!收藏这篇... 很多人忽略了“痰”的危害,觉得咳几下就没事,殊不知,肺里的痰长期堆积,只会一步步加重身体负担。 中医...
黄金平台“杰我睿”涉嫌经济犯罪... 红星资本局5月7日消息,深圳水贝知名金店“杰我睿”兑付困难事件有了新进展。日前,深圳市公安局罗湖分局...
多地出台购房新政促楼市升温 记... 今年的“五一”假期,伴随着多个城市楼市新政密集落地,在叠加市场信心持续修复的作用下,房地产市场热度持...
谁是五一“吸金王”?这5座城市... 来源:市场资讯 (来源:21城市观) 哪座城市成为“五一”假期的大赢家? 图源:摄图网 作者|赵晓...
“低招低裁”格局稳固劳动力市场... 智通财经APP获悉,美国上周初请失业金人数在经历前一周回落至近几十年来最低水平后出现小幅反弹,表明尽...