每种编程语言或框架都有自己的编码规范, 基于Python语言的Django框架也不例外。如果有一天你有幸找到了一份Django开发工作或者有一天你牛了,开发了自己的开源软件,展示你成果的最好方式就是一份优雅整洁符合编码规范的代码。今天小编我就带你来看下官方推荐的Django开发编码规范,先收藏再阅读吧!

Python编码规范
Django是Python语言写成的框架,所以其代码也要求符合Python的PEP8编码规范,比如永远使用4个空格做缩进,函数名用小写,类名首字母要大写。你可以使用Flake8 来辅助检测你的Python代码是否规范,使用pip安装即可。另外很多IDE比如PyCharm已自带代码检查工具,使用时还推荐使用.editorconfig文件来配置你的编码规范,比如html中使用2个空格做缩进。
值得一提的PEP8规范里每行代码字符数要求不超过79个,而Django允许每行最多119个字符, 这是GitHub代码审查时可以接受的每行代码的最大长度。
如果你有一行代码非常长,建议使用如下方式换行。括号单独成行,依然使用4个空格为每行内容做缩进:
   
    - 
     
      
     
     
      
       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).
      
     
- 
     
      
     
     
      
           """    
      
     
导包(import)
导包时要注意区分哪些是来未来的,哪些是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}}
      
     
视图样式
对于函数视图,第一个参数永远是request, 不要擅自修改。
   
    - 
     
      
     
     
      
       # 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)
      
     
模型的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'
      
     
有时你需要给模型定义__str__方法,重写save方法或自定义其它方法,这些方法应该放在Meta选项后面,且遵循下面的顺序:
- 定义的模型字段 
- 定制的Manager方法 
- class Meta选项
- def __str__()
- def save()
- def get_absolute_url()
- 其它自定义方法 
其它
- 国际化时按规范标记所有需要翻译的字符串。 
- 没有用到的包或import需要移除。 
- 系统性移除代码里多余的空格等等。 
Django推荐的编码规范你学到了吗? 当然最核心还是Python的PEP8编码规范,推荐大家百度一下看一看。
大江狗
2020.11.12
推荐阅读
Django基础(37): 如何获得SSL证书与配置HTTPS
谈谈cookiecutter-django生成的项目目录结构的优点

转载:https://blog.csdn.net/weixin_42134789/article/details/109664613
