修改python编码风格指导

添加api风格约定, python风格添加了详细说明,更改project的骨架说明
pull/530/head
ibuler 8 years ago
parent e1d5cbd06e
commit aed18698a3

@ -1,9 +1,9 @@
<li id="index">
<li id="">
<a href="">
<i class="fa fa-dashboard"></i> <span class="nav-label">仪表盘</span><span class="label label-info pull-right"></span>
</a>
</li>
<li id="users">
<li id="">
<a href="#">
<i class="fa fa-group"></i> <span class="nav-label">用户管理</span><span class="fa arrow"></span>
</a>
@ -12,20 +12,20 @@
<li class="user"><a href="#">用户组列表</a></li>
</ul>
</li>
<li id="assets">
<li id="">
<a>
<i class="fa fa-inbox"></i> <span class="nav-label">资产管理</span><span class="fa arrow"></span>
</a>
<ul class="nav nav-second-level">
<li class="group"><a href="">资产列表</a></li>
<li class="asset"><a href="">资产组列表</a></li>
<li class="idc"><a href="">机房列表</a></li>
<li class=""><a href="">资产列表</a></li>
<li class=""><a href="">资产组列表</a></li>
<li class=""><a href="">机房列表</a></li>
<li class=""><a href="">管理用户</a></li>
<li class=""><a href="">系统用户</a></li>
<li class=""><a href="">标签列表</a></li>
</ul>
</li>
<li id="perms">
<li id="">
<a href="#"><i class="fa fa-edit"></i> <span class="nav-label">授权管理</span><span class="fa arrow"></span></a>
<ul class="nav nav-second-level">
<li class="sudo">
@ -36,12 +36,12 @@
</li>
</ul>
</li>
<li id="audits">
<li id="">
<a href="">
<i class="fa fa-files-o"></i><span class="nav-label">审计管理</span><span class="label label-info pull-right"></span>
</a>
</li>
<li id="file">
<li id="">
<a href="#">
<i class="fa fa-download"></i> <span class="nav-label">上传下载</span><span class="fa arrow"></span>
</a>
@ -50,7 +50,7 @@
<li class="download"><a href="">文件下载</a></li>
</ul>
</li>
<li id="setting">
<li id="">
<a href="">
<i class="fa fa-gears"></i> <span class="nav-label">设置</span><span class="label label-info pull-right"></span>
</a>

@ -0,0 +1,24 @@
### API
这里仅考虑REST API的基本情况。
#### HTTP Method
1. 读操作使用GET方法写操作使用PUT/POST/DELETE方法其中删除记录的操作使用DELETE方法。
2. 使用PUT方法实现的API必须是幂等的多次执行同样操作结果相同
3. POST则是实现非幂等的接口。
4. 一般性的CRUD操作R一般使用GET方法C使用POSTU使用PUT方法D使用DELETE方法。
#### URL
1. /api/为api地址的prefix
2. 每个项目的的root path后面整合的时候回指定为项目名 如: /api/assets
3. 一般性的增删查改(CRUD)API完全使用HTTP method加上url提供的语义url中的可变部分比如上面提到的<role_id>
一般用来传递该API操作的核心实体对象的唯一ID如果有更多的参数需要提供GET方法请使用url parameter
(例如:"?client_id=xxxxx&app_id=xxxxxx")PUT/POST/DELETE方法请使用请求体传递参数。
#### 约定
1. 分页 ?page=
2. 每页数量 ?limit=
3.

@ -1,92 +0,0 @@
# Jumpserver 项目规范Draft
## 语言框架
1. Python 2.7 由于ansible目前不支持python3
2. Django 1.10 (最新版本)
3. Terminal Websocket使用go实现
## 代码风格
1. Python方面大致的风格我们采用[pocoo的Style Guidance](http://www.pocoo.org/internal/styleguide/),但是有些细节部分会尽量放开。
2. 前端部分(js, css, html),采用[Google的HTML/CSS Coding Style Guidance](https://google.github.io/styleguide/htmlcssguide.xml)以及[JavaScript Coding Style](http://google.github.io/styleguide/javascriptguide.xml)
3. Google的Style指南还规范了各种写法不光包括Coding Format请尽量遵守但Coding Format的原则则必须遵守。
4. Go的代码风格由@Tad指定。
5. 所有人编码前请仔细阅读相应的代码风格指导规范编码的时候请严格遵循相互review代码。
## Django规范
1. 尽量使用Class Base View编程更少代码
2. 使用Django Form
3. 每个url独立命名不要硬编码同理static也是
4. 数据库表名手动指定,不要使用默认
5. 代码优雅简洁
6. 注释明确优美
7. 测试案例尽可能完整
8. 尽可能利用Django造好的轮子
关于代码风格规范一些补充说明:
### 基本的代码布局
#### 缩进
1. Python严格采用4个空格的缩进不使用tab\t任何python代码都都必须遵守此规定。
2. web部分代码(HTML, CSS, JavaScript)Node.js采用2空格缩进同样不使用tab (\t)。
之所以与Python不同是因为js中有大量回调式的写法2空格可以显著降低视觉上的负担。
#### 最大行长度
按PEP8规范Python一般限制最大80个字符, 强制遵守。
**补充说明HTML代码不受此规范约束。**
#### 长语句缩进
Python代码参考pocoo style(注: 参考Flask源码)一致。JavaScript代码参考Google的Coding Format说明。
#### 空行
Python代码参考pocoo style一致。JavaScript代码参考Google的Coding Format说明。
### 语句和表达式
Python代码参考pocoo style一致。JavaScript代码参考Google的Coding Format说明。
### 命名约定
Python代码参考pocoo style一致。JavaScript代码参考Google的Coding Format说明。
### 文档注释(Docstring即各方法类的说明文档注释)
Python代码参考pocoo style一致。JavaScript代码参考Google的Coding Format说明。
### 注释(comment)
Python代码参考pocoo style一致。JavaScript代码参考Google的Coding Format说明。
### Go项目
请@Tad负责补完。
### API
这里仅考虑REST API的基本情况。
#### HTTP Method
1. 读操作使用GET方法写操作使用PUT/POST/DELETE方法其中删除记录的操作使用DELETE方法。
2. 使用PUT方法实现的API必须是幂等的多次执行同样操作结果相同
3. POST则是实现非幂等的接口。
4. 一般性的CRUD操作R一般使用GET方法C使用POSTU使用PUT方法D使用DELETE方法。
#### URL
1. 每个项目的的root path后面整合的时候回指定为项目名这个不需要各项目组考虑。整合的方案可以采用Nginx来转发后面可以详细讨论
3. 一般性的增删查改(CRUD)API完全使用HTTP method加上url提供的语义url中的可变部分比如上面提到的<role_id>一般用来传递该API操作的核心实体对象的唯一ID如果有更多的参数需要提供GET方法请使用url parameter(例如:"?client_id=xxxxx&app_id=xxxxxx")PUT/POST/DELETE方法请使用请求体传递参数。
**其他具体情况具体讨论**

@ -18,14 +18,14 @@
│ │ ├── api.py // api文件
│ │ ├── __init__.py
│ │ ├── migrations // models Migrations版本控制目录
│ │ └── __init__.py
│ │ └── __init__.py
│ │ ├── models.py // 数据模型目录
│ │ ├── static // app下静态资源目录,如果需要
│ │ │ └── assets // 多一层目录,防止资源重名
│ │ │ └── some_image.png
│ │ │ └── some_image.png
│ │ ├── templates // app下模板目录
│ │ └── assets // 多一层目录,防止资源重名
│ │ └── asset_list.html
│ │ └── assets // 多一层目录,防止资源重名
│ │ └── asset_list.html
│ │ ├── templatetags // 模板标签目录
│ │ ├── tests.py // 测试用例文件
│ │ ├── urls.py // urlconf文件

@ -0,0 +1,190 @@
# Jumpserver 项目规范Draft
## 语言框架
1. Python 2.7 由于ansible目前不支持python3
2. Django 1.10 (最新版本)
3. Terminal Websocket使用go实现
## Django规范
1. 尽量使用Class Base View编程更少代码
2. 使用Django Form
3. 每个url独立命名不要硬编码同理static也是
4. 数据库表名手动指定,不要使用默认
5. 代码优雅简洁
6. 注释明确优美
7. 测试案例尽可能完整
8. 尽可能利用Django造好的轮子
## 代码风格
Python方面大致的风格我们采用pocoo的[Style Guidance](http://www.pocoo.org/internal/styleguide/),但是有些细节部分会尽量放开
参考国内翻译
### 基本的代码布局
#### 缩进
1. Python严格采用4个空格的缩进任何python代码都都必须遵守此规定。
2. web部分代码(HTML, CSS, JavaScript)Node.js采用2空格缩进同样不使用tab (\t)。
之所以与Python不同是因为js中有大量回调式的写法2空格可以显著降低视觉上的负担。
#### 最大行长度
按PEP8规范Python一般限制最大79个字符, 如果有必要最多84个字符
**补充说明HTML代码不受此规范约束。**
#### 长语句缩进
编写长语句时,可以使用换行符(\)换行。在这种情况下,下一行应该与上一行的最后
一个“.”句点或“=”对齐或者是缩进4个空格符
```
this_is_a_very_long(function_call, 'with many parameters') \
.that_returns_an_object_with_an_attribute
MyModel.query.filter(MyModel.scalar > 120) \
.order_by(MyModel.name.desc()) \
.limit(10)
```
如果你使用括号“()”或花括号“{}”为长语句换行,那么下一行应与括号或花括号对齐:
```
this_is_a_very_long(function_call, 'with many parameters',
23, 42, 'and even more')
```
对于元素众多的列表或元组,在第一个“[”或“(”之后马上换行:
```
items = [
'this is the first', 'set of items', 'with more items',
'to come in this line', 'like this'
]
```
#### 空行
顶层函数与类之间空两行,此外都只空一行。不要在代码中使用太多的空行来区分不同的逻辑模块。
```
def hello(name):
print 'Hello %s!' % name
def goodbye(name):
print 'See you %s.' % name
class MyClass(object):
"""This is a simple docstring."""
def __init__(self, name):
self.name = name
def get_annoying_name(self):
return self.name.upper() + '!!!!111'
```
### 语句和表达式
#### 一般空格规则
1. 单目运算符与运算对象之间不空格(例如,-~等),即使单目运算符位于括号内部也一样。
2. 双目运算符与运算对象之间要空格。
```
exp = -1.05
value = (item_value / item_count) * offset / exp
value = my_list[index]
value = my_dict['key']
```
#### 比较
1. 任意类型之间的比较,使用“==”和“!=”。
2. 与单例singletons进行比较时使用is和is not。
3. 永远不要与True或False进行比较例如不要这样写foo == False而应该这样写not foo
#### 否定成员关系检查
使用foo not in bar而不是not foo in bar。
### 命名约定
1. 类名称采用骆驼拼写法CamelCase首字母缩略词保持大写不变HTTPWriter而不是HttpWriter
2. 变量名小写_以及_下划线lowercase_with_underscores
3. 方法与函数名小写_以及_下划线lowercase_with_underscores
4. 常量大写_以及_下划线UPPERCASE_WITH_UNDERSCORES
5. 预编译的正则表达式name_re。
6. 受保护的元素以一个下划线为前缀。双下划线前缀只有定义混入类mixin classes时才使用。
7. 如果使用关键词keywords作为类名称应在名称后添加后置下划线trailing underscore
允许与内建变量重名,不要在变量名后添加下划线进行区分。如果函数需要访问重名的内建变量,请将内建变量重新绑定为其他名称。
8. 命名要有寓意, 不使用拼音,不使用无意义简单字母命名 (循环中计数例外 for i in)
9. 命名缩写要谨慎, 尽量是大家认可的缩写
#### 函数和方法的参数:
1. 类方法cls为第一个参数。
2. 实例方法self为第一个参数。
3. property函数中使用匿名函数lambdas匿名函数的第一个参数可以用x替代
例如display_name = property(lambda x: x.real_name or x.username)。
### 文档注释(Docstring即各方法类的说明文档注释)
所有文档字符串均以reStructuredText格式编写方便Sphinx处理。文档字符串的行数不同布局也不一样。
如果只有一行,代表字符串结束的三个引号与代表字符串开始的三个引号在同一行。
如果为多行,文档字符串中的文本紧接着代表字符串开始的三个引号编写,代表字符串结束的三个引号则自己独立成一行。
```
def foo():
"""This is a simple docstring."""
def bar():
"""This is a longer docstring with so much information in there
that it spans three lines. In this case, the closing triple quote
is on its own line.
"""
```
文档字符串应分成简短摘要(尽量一行)和详细介绍。如果必要的话,摘要与详细介绍之间空一行。
### 模块头部
模块文件的头部包含有utf-8编码声明如果模块中使用了非ASCII编码的字符建议进行声明以及标准的文档字符串。
```
# -*- coding: utf-8 -*-
"""
package.module
~~~~~~~~~~~~~~
A brief description goes here.
:copyright: (c) YEAR by AUTHOR.
:license: LICENSE_NAME, see LICENSE_FILE for more details.
"""
```
### 注释(comment)
注释的规范与文档字符串编写规范类似。二者均以reStructuredText格式编写。
如果使用注释来编写类属性的文档,请在#符号后添加一个冒号":"。
```
class User(object):
#: the name of the user as unicode string
name = Column(String)
#: the sha1 hash of the password + inline salt
pw_hash = Column(String)
```
Loading…
Cancel
Save