Jumpserver 项ç®è§è(Draft) ============================ è¯è¨æ¡æ¶ ---------- 1. Python 3.6.1 2. Django 2.1 3. Flask 1.0.2 Luna 4. Paramiko 2.4.1 Coco Django è§è -------------- 1. å°½éä½¿ç¨ Class Base View ç¼ç¨, æ´å°ä»£ç 2. ä½¿ç¨ Django Form 3. æ¯ä¸ª URL ç¬ç«å½å, ä¸è¦ç¡¬ç¼ç , åç Static 乿¯ 4. æ°æ®åºè¡¨åæå¨æå®, ä¸è¦ä½¿ç¨é»è®¤ 5. 代ç ä¼é ç®æ´ 6. 注éæç¡®ä¼ç¾ 7. æµè¯æ¡ä¾å°½å¯è½å®æ´ 8. å°½å¯è½å©ç¨ Django é 好çè½®å 代ç 飿 ¼ ----------- Python æ¹é¢å¤§è´ç飿 ¼, æä»¬éç¨ pocoo ç\ `Style Guidance`_\ , 使¯æäºç»èé¨åä¼å°½éæ¾å¼ åèå½å ç¿»è¯ åºæ¬ç代ç å¸å± ~~~~~~~~~~~~~~ ç¼©è¿ ^^^^^^^^ 1. Python ä¸¥æ ¼éç¨4ä¸ªç©ºæ ¼ç缩è¿, ä»»ä½ Python 代ç é½é½å¿ é¡»éµå®æ¤è§å®ã 2. Web é¨å代ç (HTMLãCSSãJavaScript), Node.js éç¨2ç©ºæ ¼ç¼©è¿, åæ ·ä¸ä½¿ç¨ TABã ä¹æä»¥ä¸ Python ä¸å, æ¯å 为 JS 䏿大éåè°å¼çåæ³, 2ç©ºæ ¼å¯ä»¥æ¾èéä½è§è§ä¸çè´æ ã æå¤§è¡é¿åº¦ ^^^^^^^^^^^^^ æ PEP8 è§è, Python ä¸è¬é嶿大79个å符, 使¯ Django çå½å, URL çé常æ¯è¾é¿, èä¸21ä¸çºªé½æ¯å®½å±äº, æä»¥æä»¬é嶿大120å符 **è¡¥å 说æï¼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' ] .. _Style Guidance: http://www.pocoo.org/internal/styleguide/ ç©ºè¡ ^^^^^^ é¡¶å±å½æ°ä¸ç±»ä¹é´ç©ºä¸¤è¡, æ¤å¤é½åªç©ºä¸è¡ãä¸è¦å¨ä»£ç ä¸ä½¿ç¨å¤ªå¤çç©ºè¡æ¥åºåä¸åçé»è¾æ¨¡åã :: 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)