315éPythoné¢è¯é¢çæ¡
ç®å½
-
Pythonåºç¡ç¯
- 1ï¼ä¸ºä»ä¹å¦ä¹ Python
- 2ï¼éè¿ä»ä¹éå¾å¦ä¹ Python
- 3ï¼è°è°å¯¹Pythonåå ¶ä»è¯è¨çåºå«
- Pythonçä¼å¿ï¼
- 4ï¼ç®è¿°è§£éååç¼è¯åç¼ç¨è¯è¨
- 5ï¼Pythonçè§£éå¨ç§ç±»ä»¥åç¸å ³ç¹ç¹ï¼
- 6ï¼ä½ååèçå ³ç³»
- 7ï¼bãBãKBãMBãGBçå ³ç³»
- 8:PE8è§è
- 9ï¼éè¿ä»£ç å®ç°å¦ä¸è½¬æ¢(è¿å¶ä¹é´è½¬æ¢ï¼
- 10:请ç¼åä¸ä¸ªå½æ°å®ç°å°IPå°åè½¬æ¢æä¸ä¸ªæ´æ°
- 11ãpythonéå½çæå¤§å±æ°ï¼998
- 12ï¼æ±ç»æ(and or or)
- è¿ç®ç¬¦
- 13 ï¼asciiãunicodeãutf-8ãgbk åºå«
- 14:åèç åæºå¨ç çåºå«
- 15:ä¸å è¿ç®åæ³ååºç¨åºæ¯ï¼
- 16:Python3åPython2çåºå«ï¼
- 17ï¼ç¨ä¸è¡ä»£ç å®ç°æ°å¼äº¤æ¢
- 18ï¼Python3åPython2ä¸intålongåºå«
- 19ï¼xrangeårangeçåºå«
- 20ï¼æä»¶æä½æ¶ï¼xreadlinesåreadlinesçåºå«ï¼
- 21ï¼ åï¦ä¸¾å¸å°å¼ä¸ºFalseç常è§å¼ï¼
- 22. å符串ãå表ãå ç»ãåå ¸æ¯ä¸ªå¸¸ç¨ç5ä¸ªæ¹æ³ï¼
- 23ã lambdaè¡¨è¾¾å¼æ ¼å¼ä»¥ååºç¨åºæ¯ï¼
- 24. passçä½ç¨
- 25. *argå**kwargä½ç¨
- 26. iså==çåºå«
- 27ï¼è°è°Pythonçæ·±æµ æ·è´ï¼ä»¥åå®ç°æ¹æ³ååºç¨åºæ¯ã
- 28. Pythonåå¾åæ¶æºå¶ï¼
- 29. Pythonçå¯åç±»ååä¸å¯åç±»åï¼
- 30ãæ±ç»æ
- 31ãæ±ç»æ
- 32ãå举常è§çå ç½®å½æ°
- absï¼ï¼
- map
- filter
- mapä¸filteræ»ç»
- isinstance\type
- zip æé¾å½æ°
- 33. filterãmapãreduceçä½ç¨ï¼
- å ç½®å½æ°ï¼mapãreduceãfilterçç¨æ³ååºå«
- 34ã ä¸è¡ä»£ç å®ç°9*9乿³è¡¨
- 35. å¦ä½å®è£ ç¬¬ä¸æ¹æ¨¡åï¼ä»¥åç¨è¿åªäºç¬¬ä¸æ¹æ¨¡åï¼
- 36ã å¸¸ç¨æ¨¡å齿é£äºï¼
- 37. reçmatchåsearchåºå«ï¼
- 38. ï§½ä¹æ¯æ£åç贪婪å¹é ï¼
- 39. æ±ç»æï¼
- 40. æ±ç»æï¼
- 41ãdef func(a,b=[]) è¿ç§åæ³æä»ï§½ä¹åï¼
- 42ãå¦ä½å®ç° â1,2,3â åæ [â1â,â2â,â3â]
- 43. å¦ä½å®ç°[â1â,â2â,â3â]åæ[1,2,3]
- 44. a = [1,2,3] å b = [(1),(2),(3) ] 以å b = [(1,),(2,),(3,) ] çåºå«ï¼
- 45. å¦ä½ç¨ä¸è¡ä»£ç çæ[1,4,9,16,25,36,49,64,81,100]
- 46. ä¸ï¨ä»£ç å®ç°å é¤å表ä¸éå¤çå¼
- 47. å¦ä½å¨å½æ°ä¸è®¾ç½®ä¸ä¸ªå ¨å±åé
- 48. logging模åçä½ç¨ï¼ä»¥ååºç¨åºæ¯ï¼
- 49. 请ç¨ä»£ç ç®çå®ç°stack
- 50. 常ç¨åç¬¦ä¸²æ ¼å¼ååªå ç§ï¼
- 51. ç®è¿° çæå¨ãè¿ä»£å¨ãå¯è¿ä»£å¯¹è±¡ 以ååºç¨åºæ¯ï¼
- è¿ä»£å¨
- çæå¨
- å¯è¿ä»£å¯¹è±¡
- è£ é¥°å¨
- 52. ç¨Pythonå®ç°ä¸ä¸ªäºåæ¥æ¾ç彿°ã
- 53. è°è°ä½ 对éå ççè§£ï¼
- 54. osåsys模åçä½ç¨ï¼
- 55. å¦ä½çæä¸ä¸ªéæºæ°ï¼
- 56. å¦ä½ä½¿ç¨pythonå é¤ä¸ä¸ªæä»¶ï¼
- 57. è°è°ä½ 对é¢å对象ççè§£
- 58. Pythoné¢å对象ä¸çç»§æ¿æä»ä¹ç¹ç¹
- 59. é¢å对象深度ä¼å å广度ä¼å æ¯ä»ä¹ï¼
- 60. é¢å对象ä¸superçä½ç¨ï¼
- 61. æ¯å¦ä½¿ç¨è¿functoolsä¸ç彿°ï¼å ¶ä½ç¨æ¯ä»ä¹ï¼
- 62. å举é¢å对象ä¸å¸¦åä¸å线çç¹æ®æ¹æ³ï¼å¦ï¼__new__ã__init__
- 63. å¦ä½å¤ææ¯å½æ°è¿æ¯æ¹æ³ï¼
- 64. éææ¹æ³åç±»æ¹æ³åºå«ï¼
- 65. å举é¢å对象ä¸çç¹æ®æå以ååºç¨åºæ¯
- 66. 1ã2ã3ã4ã5 è½ç»æå¤å°ä¸ªäºä¸ç¸å䏿 éå¤çä¸ä½æ°
- 67. ä»ä¹æ¯åå°ï¼ä»¥ååºâ½¤ç¨åºæ¯ï¼
- 68. metaclassä½ç¨ï¼ä»¥ååºç¨åºæ¯ï¼
- 69. ç¨å°½éå¤çæ¹æ³å®ç°å便¨¡å¼ã
- 70. è£ é¥°å¨ï¨¸ç忳以ååºç¨åºæ¯ã
- 71. å¼å¸¸å¤ç忳以åå¦ä½ä¸»å¨è·åºå¼å¸¸ï¼åºç¨åºæ¯ï¼
- 72ãä»ä¹æ¯é¢å对象çmro
- 73. isinstanceä½ç¨ä»¥ååºç¨åºæ¯ï¼
- 74. å代ç å¹¶å®ç°
- 75. jsonåºååæ¶ï¼å¯ä»¥å¤ççæ°æ®ç±»åæåªäºï¼å¦ä½å®å¶æ¯ædatetimeç±»åï¼
- 76. jsonåºååæ¶ï¼é»è®¤éå°ä¸æä¼è½¬æ¢æunicodeï¼å¦ææ³è¦ä¿ç䏿æä¹åï¼
- 77. ä»ä¹æ¯æè¨ï¼åºç¨åºæ¯ï¼
- 78. æç¨è¿with statementåï¼å®ç好夿¯ä»ä¹ï¼
- 79. 使ç¨ä»£ç å®ç°æ¥çå举ç®å½ä¸çæææä»¶ã
- 80. ç®è¿° yieldåyield fromå ³é®å
-
第äºé¨å ç½ç»ç¼ç¨åå¹¶å
- 81. ç®è¿° OSI ä¸å±åè®®ã
- 82. ä»ä¹æ¯C/SåB/Sæ¶æï¼
- 83. ç®è¿° 䏿¬¡æ¡æã忬¡æ¥æçæµç¨ã
- 84. TCPåUDPçåºå«ï¼
- 85. 为ä½åºäºtcpåè®®çéä¿¡æ¯åºäºudpåè®®çéä¿¡æ´å¯é ï¼
- 86. ä»ä¹æ¯socketï¼ç®è¿°åºäºtcpåè®®ç奿¥åéä¿¡æµç¨ã
- 87. ä»ä¹æ¯ç²å ï¼ socket ä¸é æç²å çåå æ¯ä»ï§½ä¹ï¼ åªäºæ åµä¼åçç²å ç°è±¡ï¼
- 88. IOå¤è·¯å¤çä½ç¨ï¼
- 89.selectãpollãepoll 模åçåºå«ï¼ï¼å±äºå¤è·¯å¤ç¨IOçæ¨¡åï¼
- 90. ä»ä¹æ¯é²ç«å¢ä»¥åä½ç¨ï¼
- 91. ç®è¿° è¿ç¨ã线ç¨ãåç¨çåºå« 以ååºç¨åºæ¯ï¼
- 92. GIL鿝ä»ä¹ï¼
- 93. Pythonä¸å¦ä½ä½¿ç¨çº¿ç¨æ± åè¿ç¨æ± ï¼
- 94. threading.localçä½ç¨ï¼
- 95. è¿ç¨ä¹é´å¦ä½è¿è¡éä¿¡ï¼
- 96. ä»ä¹æ¯å¹¶ååå¹¶è¡ï¼
- 97. è¿ç¨éå线ç¨éçä½ç¨ï¼
- 98. è§£éä»ä¹æ¯å¼æ¥éé»å¡ï¼
- 99. è·¯ç±å¨åäº¤æ¢æºçåºå«
- 100.ä»ä¹æ¯ååè§£æï¼
- 101.å¦ä½ä¿®æ¹æ¬å°hostsä»¶ï¼
- 102.çäº§è æ¶è´¹è 模ååºç¨åºæ¯åä¼å¿ï¼
- 103.ä»ä¹æ¯cdnï¼
- 104.LVSæ¯ä»ä¹åä½ç¨ï¼
- 105.Nginxæ¯ä»ä¹åä½ç¨ï¼
- 106.keepalivedæ¯ä»ä¹åä½ç¨?
- 107.haproxyæ¯ä»ä¹ä»¥åä½ç¨ï¼
-
æ°æ®åºåç¼åï¼46é¢ï¼
- 113.å举常è§çå ³ç³»åæ°æ®åºåéå ³ç³»å齿é£äºï¼
- 114.MySQLå¸¸è§æ°æ®åºå¼æåæ¯è¾ï¼
- 115.ç®è¿°æ°æ®åºä¸å¤§èå¼ï¼
- 116ãä»ä¹æ¯äºå¡ï¼MySQLå¦ä½æ¯æäºå¡ï¼
- 117.ç®è¿°æ°æ®åºè®¾è®¡ä¸ä¸å¯¹å¤åå¤å¯¹å¤çåºç¨åºæ¯ï¼
- 118.å¦ä½åºäºæ°æ®åºå®ç°åååå计æ°å¨ï¼
- 119.常è§SQLï¼å¿ å¤ï¼
- 120.ç®è¿°è§¦åå¨ã彿°ãè§å¾ãåå¨è¿ç¨ï¼
- 121.MySQLç´¢å¼ç§ç±»
- 122.ç´¢å¼å¨ä»ä¹æ åµä¸éµå¾ªæå·¦åç¼çè§åï¼
- 123.主é®åå¤é®çåºå«ï¼
- 124.MySQL常è§ç彿°ï¼
- 125.å举 å建索å¼ä½æ¯æ æ³å½ä¸ç´¢å¼ç8ç§æ åµã
- 126.å¦ä½å¼å¯æ ¢æ¥å¿æ¥è¯¢ï¼
- 127.æ°æ®åºå¯¼å ¥å¯¼åºå½ä»¤ï¼ç»æ+æ°æ®ï¼ï¼
- 128.æ°æ®åºä¼åæ¹æ¡ï¼
- 129.charåvarcharçåºå«ï¼
- 130.ç®è¿°MySQLçæ§è¡è®¡åï¼
- 131.å¨å¯¹nameåäºå¯ä¸ç´¢å¼åæä¸ï¼ç®è¿°ä»¥ä¸åºå«ï¼
- 132.1000wæ¡æ°æ®ï¼ä½¿ç¨limit offset å页æ¶ï¼ä¸ºä»ä¹è¶å¾åç¿»è¶æ ¢ï¼å¦ä½è§£å³ï¼
- 133.ä»ä¹æ¯ç´¢å¼åå¹¶ï¼
- 134.ä»ä¹æ¯è¦çç´¢å¼ï¼
- 135.ç®è¿°æ°æ®åºè¯»åå离ï¼
- 136.ç®è¿°æ°æ®åºååºå表ï¼ï¼æ°´å¹³ãåç´ï¼
- 137.redisåmemcachedæ¯è¾ï¼
- 138.redis䏿°æ®åºé»è®¤æ¯å¤å°ä¸ªdb åä½ç¨ï¼
- 139.pythonæä½redisçæ¨¡åï¼
- 140.妿redisä¸çæä¸ªå表ä¸çæ°æ®éé常大ï¼å¦æå®ç°å¾ªç¯æ¾ç¤ºæ¯ä¸ä¸ªå¼ï¼
- 141.rediså¦ä½å®ç°ä¸»ä»å¤å¶ï¼ä»¥åæ°æ®åæ¥æºå¶ï¼
- 142.redisä¸çsentinelçä½ç¨ï¼
- 143.å¦ä½å®ç°redisé群ï¼
- 144.redisä¸é»è®¤æå¤å°ä¸ªå叿§½ï¼
- 145.ç®è¿°redisçæåªå ç§æä¹ åçç¥åæ¯è¾ï¼
- 146.å举redisæ¯æçè¿æçç¥ã
- 147.MySQL éæ 2000w æ°æ®ï¼redis ä¸åªå 20w çæ°æ®ï¼å¦ä½ä¿è¯ redis ä¸é½æ¯çç¹æ°æ®ï¼
- 148.å代ç ï¼åºäºredisçå表å®ç° å è¿å åºãåè¿å åºéåãä¼å 级éåã
- 149.å¦ä½åºäºrediså®ç°æ¶æ¯éåï¼
- 150.å¦ä½åºäºrediså®ç°åå¸å订é ï¼ä»¥ååå¸è®¢é åæ¶æ¯éåçåºå«ï¼
- 151.ä»ä¹æ¯codisåä½ç¨ï¼
- 152.ä»ä¹æ¯twemproxyåä½ç¨ï¼
- 153.å代ç å®ç°redisäºå¡æä½ã
- 154.redisä¸çwatchçå½ä»¤çä½ç¨ï¼
- 155.åºäºrediså¦ä½å®ç°ååååæ°é计æ°å¨ï¼
- 156.ç®è¿°redisåå¸å¼éåredlockçå®ç°æºå¶ã
- 157.ä»ä¹æ¯ä¸è´æ§åå¸ï¼Python䏿¯å¦æç¸åºæ¨¡åï¼
- 158.å¦ä½é«æçæ¾å°redis䏿æä»¥aaaå¼å¤´çkeyï¼
-
第åé¨å åç«¯ãæ¡æ¶åå
¶ä»ï¼155é¢ï¼
- 1.è°è°ä½ 对httpåè®®ç认è¯ã
- 2.è°è°ä½ 对websocketåè®®ç认è¯ã
- 3.ä»ä¹æ¯magic string ï¼
- 4.å¦ä½å建ååºå¼å¸å±ï¼
- 5.ä½ æ¾ç»ä½¿ç¨è¿åªäºåç«¯æ¡æ¶ï¼
- 6.ä»ä¹æ¯ajax请æ±ï¼å¹¶ä½¿ç¨jQueryåXMLHttpRequest对象å®ç°ä¸ä¸ªajax请æ±ã
- 7.å¦ä½å¨å端å®ç°è½®è®ï¼
- 8.å¦ä½å¨å端å®ç°é¿è½®è®ï¼
- 9.vuexçä½ç¨ï¼
- 10.vueä¸çè·¯ç±çæ¦æªå¨çä½ç¨ï¼
- 11.axiosçä½ç¨ï¼
- 12.å举vueçå¸¸è§æä»¤ã
- 13.ç®è¿°jsonpåå®ç°åçï¼
- 14.ä»ä¹æ¯cors ï¼
- 15.å举Http请æ±ä¸å¸¸è§çè¯·æ±æ¹å¼ï¼
- 16.å举Http请æ±ä¸çç¶æç ï¼
- 17.å举Http请æ±ä¸å¸¸è§ç请æ±å¤´ï¼
- 18.çå¾åç»æï¼jsï¼ï¼
- çå¾åç»æï¼jsï¼ï¼
- çå¾åç»æï¼ï¼jsï¼
- çå¾åç»æï¼ï¼jsï¼
- çå¾åç»æï¼ï¼jsï¼
- çå¾åç»æï¼ï¼jsï¼
- 19.djangoãflaskãtornadoæ¡æ¶çæ¯è¾ï¼
- 20.ä»ä¹æ¯wsgiï¼
- 21.django请æ±ççå½å¨æï¼
- 22.å举djangoçå ç½®ç»ä»¶ï¼
- 23.å举djangoä¸é´ä»¶ç5ä¸ªæ¹æ³ï¼ä»¥ådjangoä¸é´ä»¶çåºç¨åºæ¯ï¼
- 24.ç®è¿°ä»ä¹æ¯FBVåCBVï¼
- 25.FBVä¸CBVçåºå«
- 26.djangoçrequest对象æ¯å¨ä»ä¹æ¶åå建çï¼
- 27.å¦ä½ç»CBVçç¨åºæ·»å è£ é¥°å¨ï¼
- 28.å举django orm 䏿æçæ¹æ³ï¼QuerySetå¯¹è±¡çæææ¹æ³ï¼
- 29.onlyådeferçåºå«ï¼
- 30.select_relatedåprefetch_relatedçåºå«ï¼
- 31.filteråexcludeçåºå«ï¼
- 32.å举django ormä¸ä¸ç§è½åsqlè¯å¥çæ¹æ³ã
- 33.django orm ä¸å¦ä½è®¾ç½®è¯»åå离ï¼
- 34.FåQçä½ç¨?
- 35.valuesåvalues_listçåºå«ï¼
- 36.å¦ä½ä½¿ç¨django ormæ¹éåå»ºæ°æ®ï¼
- 37.djangoçFormåModeFormçä½ç¨ï¼
- 38.djangoçFormç»ä»¶ä¸ï¼å¦æå段ä¸å å«choicesåæ°ï¼è¯·ä½¿ç¨ä¸¤ç§æ¹å¼å®ç°æ°æ®æºå®æ¶æ´æ°ã
- 39.djangoçModelä¸çForeignKeyåæ®µä¸çon_deleteåæ°æä»ä¹ä½ç¨ï¼
- 40.djangoä¸csrfçå®ç°æºå¶ï¼
- 41.djangoå¦ä½å®ç°websocketï¼
- 42.åºäºdjango使ç¨ajaxåépostè¯·æ±æ¶ï¼é½å¯ä»¥ä½¿ç¨åªç§æ¹æ³æºå¸¦csrf tokenï¼
- 43.djangoä¸å¦ä½å®ç°ormè¡¨ä¸æ·»å æ°æ®æ¶åå»ºä¸æ¡æ¥å¿è®°å½ã
- 44.djangoç¼åå¦ä½è®¾ç½®ï¼
- 45.djangoçç¼åè½ä½¿ç¨redisåï¼å¦æå¯ä»¥çè¯ï¼å¦ä½é ç½®ï¼
- 46.djangoè·¯ç±ç³»ç»ä¸nameçä½ç¨ï¼
- 47.djangoçæ¨¡æ¿ä¸filteråsimple_tagçåºå«ï¼
- 48.django-debug-toolbarçä½ç¨ï¼
- 49.djangoä¸å¦ä½å®ç°åå æµè¯ï¼
- 50.è§£éormä¸ db first å code firstçå«ä¹ï¼
- 51.djangoä¸å¦ä½æ ¹æ®æ°æ®åºè¡¨çæmodelä¸çç±»ï¼
- 52.使ç¨ormååçsqlçä¼ç¼ºç¹ï¼
- 53.ç®è¿°MVCåMTV
- 54.djangoçcontenttypeç»ä»¶çä½ç¨ï¼
- 55.è°è°ä½ 对restfull è§èç认è¯ï¼
- 56.æ¥å£çå¹çæ§æ¯ä»ä¹ææï¼
- 57.ä»ä¹æ¯RPCï¼
- 58.HttpåHttpsçåºå«ï¼
- 59.为ä»ä¹è¦ä½¿ç¨django rest frameworkæ¡æ¶ï¼
- 60.django rest frameworkæ¡æ¶ä¸é½æé£äºç»ä»¶ï¼
- 61.django rest frameworkæ¡æ¶ä¸çè§å¾é½å¯ä»¥ç»§æ¿åªäºç±»
- 62.ç®è¿° django rest frameworkæ¡æ¶çè®¤è¯æµç¨ã
- 63.django rest frameworkå¦ä½å®ç°çç¨æ·è®¿é®é¢çæ§å¶ï¼
- 64.Flaskæ¡æ¶çä¼å¿ï¼
- 65.Flaskæ¡æ¶ä¾èµç»ä»¶
- 66.Flaskèå¾çä½ç¨
- 67.å举使ç¨çFlaskç¬¬ä¸æ¹ç»ä»¶ï¼
- 68.ç®è¿°Flaskä¸ä¸æç®¡çæµç¨?
- 69.Flaskä¸çgçä½ç¨ï¼
- Flaskä¸ä¸ä¸æç®¡çä¸»è¦æ¶åå°äºé£äºç¸å ³çç±»ï¼å¹¶æè¿°ç±»ä¸»è¦ä½ç¨ï¼
- 为ä»ä¹è¦FlaskæLocal对象ä¸ççå¼stack ç»´æ¤æä¸ä¸ªå表ï¼
- Flaskä¸å¤appåºç¨æ¯æä¹å®æï¼
- å¨Flaskä¸å®ç°WebSocketéè¦ä»ä¹ç»ä»¶ï¼
- wtformsç»ä»¶çä½ç¨ï¼
- Flaskæ¡æ¶é»è®¤sessionå¤çæºå¶ï¼
- è§£éFlaskæ¡æ¶ä¸çLocal对象åthreading.local对象çåºå«ï¼
- Flaskä¸ blinker æ¯ä»ä¹ï¼
- SQLAlchemyä¸ç sessionåscoped_session çåºå«ï¼
- SQLAlchemyå¦ä½æ§è¡åçSQLï¼
- ORMçå®ç°åçï¼
- DBUtils模åçä½ç¨ï¼
- SQLAchemyä¸å¦ä½ä¸ºè¡¨è®¾ç½®å¼æåå符ç¼ç ï¼
- SQLAchemyä¸å¦ä½è®¾ç½®èåå¯ä¸ç´¢å¼ï¼
- ç®è¿°Tornadoæ¡æ¶çç¹ç¹ã
- ç®è¿°Tornadoæ¡æ¶ä¸Future对象çä½ç¨ï¼
- Tornadoæ¡æ¶ä¸å¦ä½ç¼åWebSocketç¨åºï¼
- Tornadoä¸éææä»¶æ¯å¦ä½å¤ççï¼ å¦ï¼
- Tornadoæä½MySQL使ç¨ç模åï¼
- Tornadoæä½redis使ç¨ç模åï¼
- ç®è¿°Tornadoæ¡æ¶çéç¨åºæ¯ï¼
- git常è§å½ä»¤ä½ç¨ï¼
- ç®è¿°ä»¥ä¸gitä¸stashå½ä»¤ä½ç¨ä»¥åç¸å ³å ¶ä»å½ä»¤ã
- git ä¸ merge å rebaseå½ä»¤ çåºå«ã
- å ¬å¸å¦ä½åºäºgitåçååå¼åï¼
- å¦ä½åºäºgitå®ç°ä»£ç reviewï¼
- gitå¦ä½å®ç°v1.0 ãv2.0 ççæ¬ç管çï¼
- ä»ä¹æ¯gitlab
- githubågitlabçåºå«ï¼
- å¦ä½ä¸ºgithubä¸çé¼ç弿ºé¡¹ç®è´¡ç®ä»£ç ï¼
- gitä¸ .gitignoreæä»¶çä½ç¨
- ä»ä¹æ¯ææ·å¼åï¼
- ç®è¿° jenkins å·¥å ·çä½ç¨?
- å ¬å¸å¦ä½å®ç°ä»£ç åå¸ï¼
- ç®è¿° RabbitMQãKafkaãZeroMQçåºå«ï¼
- RabbitMQå¦ä½å¨æ¶è´¹è è·åä»»å¡åæªå¤çå®åå°±æææ¶ï¼ä¿è¯æ°æ®ä¸ä¸¢å¤±ï¼
- RabbitMQå¦ä½å¯¹æ¶æ¯åæä¹ åï¼
- RabbitMQå¦ä½æ§å¶æ¶æ¯è¢«æ¶è´¹ç顺åºï¼
- 以ä¸RabbitMQçexchange typeåå«ä»£è¡¨ä»ä¹ææï¼å¦ï¼fanoutãdirectãtopicã
- ç®è¿° celery æ¯ä»ä¹ä»¥ååºç¨åºæ¯ï¼
- ç®è¿°celeryè¿è¡æºå¶ã
- celeryå¦ä½å®ç°å®æ¶ä»»å¡ï¼
- ç®è¿° celeryå¤ä»»å¡ç»æç®å½
- celeryä¸è£ é¥°å¨ @app.task å @shared_taskçåºå«ï¼
- ç®è¿° requests模åçä½ç¨ååºæ¬ä½¿ç¨ï¼
- ç®è¿° beautifulsoup模åçä½ç¨ååºæ¬ä½¿ç¨ï¼
- ç®è¿° seleninu模åçä½ç¨ååºæ¬ä½¿ç¨?
- scrapyæ¡æ¶ä¸åç»ä»¶ç工使µç¨ï¼
- å¨scrapyæ¡æ¶ä¸å¦ä½è®¾ç½®ä»£çï¼ä¸¤ç§æ¹æ³ï¼ï¼
- scrapyæ¡æ¶ä¸å¦ä½å®ç°å¤§æä»¶çä¸è½½ï¼
- scrapyä¸å¦ä½å®ç°ééï¼
- scrapyä¸å¦ä½å®ç°æåç¬è«ï¼
- scrapyä¸å¦ä½è¿è¡èªå®å¶å½ä»¤ï¼
- scrapyä¸å¦ä½å®ç°çè®°å½ç¬è«ç深度ï¼
- scrapyä¸çpipelineså·¥ä½åçï¼
- scrapyçpipelineså¦ä½ä¸¢å¼ä¸ä¸ªitem对象ï¼
- ç®è¿°scrapyä¸ç¬è«ä¸é´ä»¶åä¸è½½ä¸é´ä»¶çä½ç¨ï¼1
- scrapy-redisç»ä»¶çä½ç¨ï¼
- scrapy-redisç»ä»¶ä¸å¦ä½å®ç°çä»»å¡çå»éï¼
- scrapy-redisçè°åº¦å¨å¦ä½å®ç°ä»»å¡ç深度ä¼å å广度ä¼å ï¼....
- ç®è¿° vitualenv ååºç¨åºæ¯?
- ç®è¿° pipreqs ååºç¨åºæ¯ï¼
- å¨Pythonä¸ä½¿ç¨è¿ä»ä¹ä»£ç æ£æ¥å·¥å ·ï¼
- ç®è¿° saltstackãansibleãfabricãpuppetå·¥å ·çä½ç¨ï¼
- B TreeåB+ Treeçåºå«ï¼
- 请åä¸¾å¸¸è§æåºå¹¶éè¿ä»£ç å®ç°ä»»æä¸ç§ã
- 请åä¸¾å¸¸è§æ¥æ¾å¹¶éè¿ä»£ç å®ç°ä»»æä¸ç§ã
- 请åä¸¾ä½ çæç设计模å¼ï¼
- ææ²¡æå·è¿leetcodeï¼
- å举çæççLinuxå½ä»¤ã
- å ¬å¸çº¿ä¸æå¡å¨æ¯ä»ä¹ç³»ç»ï¼
- è§£é PVãUV çå«ä¹ï¼
- è§£é QPSçå«ä¹ï¼
- uwsgiåwsgiçåºå«ï¼
- supervisorçä½ç¨ï¼
- ä»ä¹æ¯åå代çï¼
- ç®è¿°SSHçæ´ä¸ªè¿ç¨ã
- æé®é¢é½å»é£äºæ¾è§£å³æ¹æ¡ï¼
- æ¯å¦æå ³æ³¨ä»ä¹ææ¯ç±»çå ¬ä¼å·ï¼
- æè¿å¨ç ç©¶ä»ä¹æ°ææ¯ï¼
- æ¯å¦äºè§£è¿é¢å驱卿¨¡åï¼
- äºè¿å¶ä¸åè¿å¶ä¹é´ç转æ¢
æ£æ
Pythonåºç¡ç¯
1ï¼ä¸ºä»ä¹å¦ä¹ Python
å®¶éæå¨è¿ä¸ªITååéé¢ï¼ä¹æ³è®©ææ¥è§¦è¿ä¸ªååï¼ç¶åç»æå»ºè®®å¦çPythonï¼
ç¶åèªå·±éè¿ç¾åº¦ååæå¦è¿Pythonçåå¦äºè§£äºPythonï¼Pythonè¿é¨è¯è¨ï¼å ¥é¨æ¯è¾ç®åï¼
å®ç®åæå¦ï¼çæåæ¯è¾å¼ºå¤§ï¼æ¶åçå°æ¹æ¯è¾å¤ï¼ç¹å«æ¯å¨äººå·¥æºè½ï¼åæ°æ®åæè¿æ¹é¢ã卿ªæ¥æè§å¾æ¯å¾èªå¨åï¼
人工æºè½è¿æ¹é¢åå±çï¼æä»¥å¦ä¹ äºPython
2ï¼éè¿ä»ä¹éå¾å¦ä¹ Python
åå¼å§æ¥è§¦Pythonçæ¶åï¼å°ç½ä¸éé¢è·çè§é¢å¦åºç¡ï¼å忥ç½ä¸å°çææ¯è´´ï¼ç¶åçå°æäººæ¨èå»éªå³°çPythonæç¨ï¼
ç»é¡¹ç®å°GitHubä¸é¢æ¾ä¸äºå°é¡¹ç®å¦ä¹ ã
3ï¼è°è°å¯¹Pythonåå ¶ä»è¯è¨çåºå«
Pythonå±äºè§£éåè¯è¨ï¼å½ç¨åºè¿è¡æ¶ï¼æ¯ä¸è¡ä¸è¡çè§£éï¼å¹¶è¿è¡ï¼æä»¥è°å¼ä»£ç 徿¹ä¾¿ï¼å¼åæçé«ï¼
è¿æé¾åç»Pythonå®ä½æ¯ä»»å ¶èªç±åå±ãä¼é ãæç¡®ãç®åï¼æä»¥å¨æ¯ä¸ªé¢åé½æå»ºæ ï¼ææå®æçé常强大çç¬¬ä¸æ¹åºï¼
ç¹ç¹ï¼
è¯æ³ç®æ´ä¼ç¾ï¼åè½å¼ºå¤§ï¼æ ååºä¸ç¬¬ä¸æ¹åºé½é常强大ï¼èä¸åºç¨é¢åä¹é常广
å¯ç§»æ¤æ§ï¼å¯æ©å±æ§ï¼å¯åµå ¥æ§
缺ç¹ï¼
ããè¿è¡éåº¦æ ¢ï¼
- è§£éå - python/php - ç¼è¯å - c/java/c#
- Python弱类å
ï¼1ï¼ä¸javaç¸æ¯ï¼å¨å¾å¤æ¹é¢ï¼Pythonæ¯Javaè¦ç®åï¼æ¯å¦java䏿æåéå¿ é¡»å£°ææè½ä½¿ç¨ï¼èPythonä¸éè¦å£°æ,ç¨å°éçä»£ç æå»ºåºå¾å¤åè½;ï¼é«æçé«çº§æ°æ®ç»æï¼
ï¼2ï¼ä¸phpç¸æ¯ï¼pythonæ åå ç´æ¥æä¾äºå·¥å ·ï¼å¹¶ä¸ç¸å¯¹äºPHPä»£ç æ´æäºç»´æ¤;
ï¼3ï¼Pythonä¸cç¸æ¯ï¼
Python å C Pythonè¿é¨è¯è¨æ¯ç±Cå¼åèæ¥
ãã对äºä½¿ç¨ï¼Pythonçç±»åºé½å
¨å¹¶ä¸ä½¿ç¨ç®æ´ï¼å¦æè¦å®ç°åæ ·çåè½ï¼Python 10è¡ä»£ç å¯ä»¥è§£å³ï¼Cå¯è½å°±éè¦100è¡çè³æ´å¤.
ãã对äºé度ï¼Pythonçè¿è¡é度ç¸è¾ä¸Cï¼ç»é¼æ¯æ
¢äº
Pythonçä¼å¿ï¼
1ãPython æäºå¦ä¹ ;
2ãç¨å°éçä»£ç æå»ºåºå¾å¤åè½;ï¼é«æçé«çº§æ°æ®ç»æï¼
3ãPython æ¥æææççç¨åºå èµæºåºä¹ä¸;
4ãPythonå®å ¨æ¯æé¢å对象;
5ãPython æ¯è·¨å¹³å°ä¸å¼æºçã
6ãå¨æç±»å:
4ï¼ç®è¿°è§£éååç¼è¯åç¼ç¨è¯è¨
è§£éåï¼å°±æ¯è¾¹è§£éè¾¹æ§è¡ï¼Pythonï¼phpï¼
ç¼è¯åï¼ç¼è¯ååæ§è¡ï¼cãjavaãc#ï¼
5ï¼Pythonçè§£éå¨ç§ç±»ä»¥åç¸å ³ç¹ç¹ï¼
æ¯å®æ¹çæ¬çè§£éå¨ï¼CPythonãæ¯ä½¿ç¨Cè¯è¨å¼åçï¼æä»¥å«CPythonãå¨å½ä»¤è¡ä¸è¿è¡pythonå°±æ¯å¯å¨CPythonè§£éå¨ã
CPythonæ¯ä½¿ç¨æå¹¿çPythonè§£éå¨ãæç¨çææä»£ç ä¹é½å¨CPython䏿§è¡ã
IPython
IPythonæ¯åºäºCPythonä¹ä¸çä¸ä¸ªäº¤äºå¼è§£éå¨ï¼ä¹å°±æ¯è¯´ï¼IPythonåªæ¯å¨äº¤äºæ¹å¼ä¸ææå¢å¼ºï¼ä½æ¯æ§è¡Python代ç çåè½åCPythonæ¯å®å ¨ä¸æ ·çãCPythonç¨>>>ä½ä¸ºæç¤ºç¬¦ï¼èIPythonç¨In [åºå·]:ä½ä¸ºæç¤ºç¬¦ã
PyPy
ç±Pythonåçè§£éå¨ï¼å®çæ§è¡éåº¦æ¯æå¿«ãPyPyéç¨JITææ¯ï¼å¯¹Python代ç è¿è¡å¨æç¼è¯ï¼æ³¨æä¸æ¯è§£éï¼ï¼
ç»å¤§é¨åPython代ç é½å¯ä»¥å¨PyPyä¸è¿è¡ï¼ä½æ¯PyPyåCPythonæä¸äºæ¯ä¸åçï¼è¿å°±å¯¼è´ç¸åçPython代ç å¨ä¸¤ç§è§£éå¨ä¸æ§è¡å¯è½ä¼æä¸åçç»æã
Jython
Jythonæ¯è¿è¡å¨Javaå¹³å°ä¸çPythonè§£éå¨ï¼å¯ä»¥ç´æ¥æPython代ç ç¼è¯æJavaåèç æ§è¡ã
IronPython
IronPythonåJython类似ï¼åªä¸è¿IronPythonæ¯è¿è¡å¨.Netå¹³å°ä¸çPythonè§£éå¨ï¼å¯ä»¥ç´æ¥æPython代ç ç¼è¯æ.Netçåèç ã
å°ç»ï¼
ããPythonçè§£éå¨å¾å¤ï¼ä½ä½¿ç¨æå¹¿æ³çè¿æ¯CPythonã妿è¦åJavaæ.Netå¹³å°äº¤äºï¼æå¥½ç忳䏿¯ç¨JythonæIronPythonï¼èæ¯éè¿ç½ç»è°ç¨æ¥äº¤äºï¼ç¡®ä¿åç¨åºä¹é´çç¬ç«æ§ã
6ï¼ä½ååèçå ³ç³»
1åè = 8 ä½
ä½ï¼bitï¼ï¼æ°æ®å卿¯ä»¥âåèâï¼Byteï¼ä¸ºåä½ï¼æ°æ®ä¼ è¾æ¯ä»¥å¤§å¤æ¯ä»¥âä½âï¼bitï¼ååâæ¯ç¹âï¼ä¸ºåä½ï¼
ä¸ä¸ªä½å°±ä»£è¡¨ä¸ä¸ª0æ1ï¼å³ä¸ä¸ªäºè¿å¶ï¼ï¼äºè¿å¶æ¯ææåå¨å¨çæå°åä½ï¼æ¯8个ä½ï¼bitï¼ç®å为bï¼ç»æä¸ä¸ªåèï¼Byteï¼ç®å为Bï¼ï¼
åèæ¯æå°ä¸çº§çä¿¡æ¯åä½
7ï¼bãBãKBãMBãGBçå ³ç³»
b --->ä½(bit)
B --->åè ä¸ä¸ªåèçäº8ä½
1B = 8 bit
1kb = 1024 B
1 MB = 1024 KB
1 GB = 1024 MB
8:PE8è§è
1ã使ç¨4ä¸ªç©ºæ ¼è䏿¯tabé®è¿è¡ç¼©è¿ã
2ãæ¯è¡é¿åº¦ä¸è½è¶
è¿79
3ã使ç¨ç©ºè¡æ¥é´é彿°åç±»ï¼ä»¥å彿°å
é¨ç大å代ç
4ãå¿
è¦æ¶åï¼å¨æ¯ä¸è¡ä¸å注é
5ãä½¿ç¨ææ¡£æ³¨éï¼ååºå½æ°æ³¨é
6ã卿ä½ç¬¦åéå·ä¹å使ç¨ç©ºæ ¼ï¼ä½æ¯ä¸è¦å¨æ¬å·å
é¨ä½¿ç¨
7ãå½åç±»å彿°çæ¶å使ç¨ä¸è´çæ¹å¼ï¼æ¯å¦ä½¿ç¨CamelCaseæ¥å½åç±»ï¼
使ç¨lower_case_with_underscoresæ¥å½å彿°åæ¹æ³
8ãå¨ç±»ä¸æ»æ¯ä½¿ç¨selfæ¥ä½ä¸ºé»è®¤
9ãå°½éä¸è¦ä½¿ç¨éæ³æ¹æ³
10ãé»è®¤ä½¿ç¨UTF-8ï¼çè³ASCIIä½ä¸ºç¼ç æ¹å¼
11ãæ¢è¡å¯ä»¥ä½¿ç¨åææ ï¼æå¥½ä½¿ç¨åæ¬å·ã
12ãä¸è¦å¨ä¸å¥importä¸å¤ä¸ªåºï¼
ç©ºæ ¼ç使ç¨
- åç§å³æ¬å·åä¸è¦å ç©ºæ ¼ã
- éå·ãåå·ãåå·åä¸è¦å ç©ºæ ¼ã
- 彿°çå·¦æ¬å·åä¸è¦å ç©ºæ ¼ãå¦Func(1)
- åºåçå·¦æ¬å·åä¸è¦å ç©ºæ ¼ãå¦list[2]
- æä½ç¬¦å·¦å³åå ä¸ä¸ªç©ºæ ¼ï¼ä¸è¦ä¸ºäºå¯¹é½å¢å ç©ºæ ¼
- 彿°é»è®¤åæ°ä½¿ç¨çèµå¼ç¬¦å·¦å³çç¥ç©ºæ ¼
- ä¸è¦å°å¤å¥è¯å¥åå¨åä¸è¡ï¼å°½ç®¡ä½¿ç¨âï¼âå 许
- if/for/whileè¯å¥ä¸ï¼å³ä½¿æ§è¡è¯å¥åªæä¸å¥ï¼ä¹å¿ é¡»å¦èµ·ä¸è¡
彿°å½å使ç¨å
¨é¨å°åçæ¹å¼ï¼å¸¸éå½å使ç¨å¤§åï¼ç±»å±æ§ï¼æ¹æ³ååéï¼ä½¿ç¨å°å
ç±»çå½åé¦åæ¯å¤§å
9ï¼éè¿ä»£ç å®ç°å¦ä¸è½¬æ¢(è¿å¶ä¹é´è½¬æ¢ï¼
# äºè¿å¶è½¬æ¢æåè¿å¶-->int
v = "0b1111011"
b = int(v,2)
print(b) # 123
åè¿å¶è½¬æ¢æäºè¿å¶â>bin
v2 = 18
print(bin(int(v2)))
0b10010
å «è¿å¶è½¬æ¢æåè¿å¶
v3 = â011â
print(int(v3))
11
åè¿å¶è½¬æ¢æå «è¿å¶ï¼â> oct
v4 = 30
print(oct(int(v4)))
0o36
åå è¿å¶è½¬æ¢æåè¿å¶ï¼
v5 = â0x12â
print(int(v5,16))
18
åè¿å¶è½¬æ¢æåå è¿å¶ï¼â> hex
v6 = 87
print(hex(int(v6)))
0x57
10:请ç¼åä¸ä¸ªå½æ°å®ç°å°IPå°åè½¬æ¢æä¸ä¸ªæ´æ°
请ç¼åä¸ä¸ªå½æ°å®ç°å°IPå°åè½¬æ¢æä¸ä¸ªæ´æ°ã å¦ 10.3.9.12 转æ¢è§åä¸ºï¼ 10 000010103 00000011 9 00001001 12 00001100<span>
åå°ä»¥ä¸äºè¿å¶æ¼æ¥èµ·æ¥è®¡ç®åè¿å¶ç»æï¼00001010 00000011 00001001 00001100 = ï¼
def v1(addr):
# åæ¯ä¸ªæ°
id = [int(x) for x in addr.split(".")]
print(id)
return sum(id[i] << [24, 16, 8, 0][i] for i in range(4))
print(v1(â127.0.0.1â))
[127, 0, 0, 1]
2130706433
------------------------------------------------
11ãpythonéå½çæå¤§å±æ°ï¼998
12ï¼æ±ç»æ(and or or)
1. æ±ç»æï¼1 or 3
print(1 or 3) # 1
-
æ±ç»æï¼1 and 3
print(1 and 3) # 3 -
æ±ç»æï¼0 and 2 and 1
print(0 and 2 and 1) # 0 -
æ±ç»æï¼0 and 2 or 1
print(0 and 2 or 1) # 1 -
æ±ç»æï¼0 and 2 or 1 or 4
print(0 and 2 or 1 or 4) # 1 -
æ±ç»æï¼0 or Flase and 1
print(0 or False and 1) # Flase
æ»ç»ï¼
ãã# x or y 妿 x为çï¼åå¼ä¸ºxï¼ å¦å为y
ãã# x and y 妿 x 为çï¼åå¼ä¸º yï¼å¦å为 x
è¿ç®ç¬¦
1. æ±ç»æï¼2 & 5
print(2 & 5) # 10 & 101 => 000 => 0
2. æ±ç»æï¼2 ^ 5
print(2 ^ 5) # 10 ^ 101 => 111 => 1*2**0+1*2**1+1*2**2=1+2+4=7
13 ï¼asciiãunicodeãutf-8ãgbk åºå«
python2å
容è¿è¡ç¼ç ï¼é»è®¤asciiï¼,èpython3对å
容è¿è¡ç¼ç çé»è®¤ä¸ºutf-8ã
ascii æå¤åªè½ç¨8使¥è¡¨ç¤ºï¼ä¸ä¸ªåèï¼ï¼å³ï¼2**8 = 256ï¼æä»¥ï¼ASCIIç æå¤åªè½è¡¨ç¤º 256 个符å·ã
unicode ä¸å½ç ï¼ä»»ä½ä¸ä¸ªå符==两个åè
utf-8 ä¸å½ç çå级ç ä¸ä¸ªä¸æå符==ä¸ä¸ªåè è±ææ¯ä¸ä¸ªåè æ¬§æ´²çæ¯ 2个åè
gbk å½å
çæ¬ ä¸ä¸ªä¸æå符==2个åè è±ææ¯ä¸ä¸ªåè
gbk 转 utf-8 ééè¿åªä» unicode
14:åèç åæºå¨ç çåºå«
æºå¨ç ï¼å¦åæºå¨è¯è¨æä»¤ï¼ææ¶ä¹è¢«ç§°ä¸ºåçç ï¼æ¯çµèçCPUå¯ç´æ¥è§£è¯»çæ°æ®ã
åèç æ¯ä¸ç§ä¸é´ç¶æï¼ä¸é´ç ï¼çäºè¿å¶ä»£ç ï¼æä»¶ï¼ãéè¦ç´è¯å¨è½¬è¯åæè½æä¸ºæºå¨ç ã
ä»ä¹æ¯æºå¨ç
æºå¨ç (machine code)ï¼å¦åæºå¨è¯è¨æä»¤ï¼ææ¶ä¹è¢«ç§°ä¸ºåçç ï¼Native Codeï¼ï¼æ¯çµèçCPUå¯ç´æ¥è§£è¯»çæ°æ®ã
é常æä¹ä¸æ¥çè§£çè¯ï¼æºå¨ç å°±æ¯è®¡ç®æºå¯ä»¥ç´æ¥æ§è¡ï¼å¹¶ä¸æ§è¡é度æå¿«ç代ç ã
æ»ç»ï¼æºå¨ç æ¯çµèCPUç´æ¥è¯»åè¿è¡çæºå¨æä»¤ï¼è¿è¡é度æå¿«ï¼ä½æ¯éå¸¸æ¦æ¶©é¾æï¼ä¹æ¯è¾é¾ç¼å
ä»ä¹æ¯åèç
åèç ï¼Bytecodeï¼æ¯ä¸ç§å
嫿§è¡ç¨åºãç±ä¸åºå op 代ç /æ°æ®å¯¹ ç»æçäºè¿å¶æä»¶ã
åèç æ¯ä¸ç§ä¸é´ç ï¼å®æ¯æºå¨ç æ´æ½è±¡ï¼éè¦ç´è¯å¨è½¬è¯åæè½æä¸ºæºå¨ç çä¸é´ä»£ç ã
æ»ç»ï¼åèç æ¯ä¸ç§ä¸é´ç¶æï¼ä¸é´ç ï¼çäºè¿å¶ä»£ç ï¼æä»¶ï¼ãéè¦ç´è¯å¨è½¬è¯åæè½æä¸ºæºå¨ç ã
-----------
#is æ¯è¾çæ¯å
åå°å
#== æ¯è¾çæ¯å¼
# int å
·æèå´ï¼-5---256
#对äºint å°æ°æ®æ±
èå´ï¼-5----256 å建çç¸é´çæ°åï¼é½æååä¸ä¸ªå
åå°å
#对äºå符串 ï¼é¢è¯ï¼
1ãå°æ°æ®æ± 妿æç©ºæ ¼ï¼é£æå两个å
åå°åï¼
2ãé¿åº¦ä¸è½è¶
è¿ 20
3ãä¸è½ç¨ç¹æ®å符
i = âaâ*20
j = âaâ*20
print(i is j) # True
i = âaâ*21
j = âaâ*21
print(i is j) # False
å
³äºç¼ç æå åè
unicodeï¼ ææåç¬¦ï¼æ è®ºè±æã䏿çï¼ 1个å符ï¼2个åè
gbkï¼ä¸ä¸ªå符ï¼è±æ1个åèï¼ä¸æä¸¤ä¸ªåè
utf-8ï¼è±æ1个åèã æ¬§æ´²ï¼2个åèï¼ äºæ´²ï¼3个åè
å¨utf-8ä¸ï¼ä¸ä¸ªä¸æå符å ç¨3个åè
å¨gbkä¸ä¸ä¸ªæ±åå ç¨2个åè
é»è¯ = utf-8(6åè)=48
é»è¯ = gbk(4åè)=32
åèåä½çå
³ç³»ã
ãã#ä¸ä¸ªåè(byte) = 8 ä½(bit)
ãã# ä½ä¸ºæå°çåä½
ç®è¿°åéå½åè§è
ãã#1ãä»¥åæ¯ï¼æ°åï¼ä¸å线任ç±ç»å
ãã#2ãä¸è½ä»¥å½å太é¿ï¼ä¸ä½¿ç¨æ¼é³ï¼ä¸æ
ãã#3ãä¸è½ä»¥æ°åå¼å¤´
ãã#4ãä¸è½ç¨å
³é®è¯
15:ä¸å è¿ç®åæ³ååºç¨åºæ¯ï¼
åºç¨åºæ¯ï¼ç®åifè¯å¥
# å ³äºä¸å è¿ç® # ç»æ+ãif + æ¡ä»¶ + else + ç»æ result='gt' if 1>3 else 'lt' print(result) # lt # çè§£ï¼å¦ææ¡ä»¶ä¸ºçï¼æifåé¢çå¼èµå¼ç»åéï¼å¦åæelseåé¢çå¼èµå¼ç»åéã
lambda 表达å¼
temp = lambda x,y:x+y
print(temp(4,10)) # 14
坿¿ä»£ï¼
def foo(x,y):
return x+y
print(foo(4,10)) # 14
16:Python3åPython2çåºå«ï¼
1ï¼æå°æ¶ï¼py2éè¦å¯ä»¥ä¸éè¦å æ¬å·ï¼py3 éè¦
python 2 ï¼print ('lili') , print 'lili'
python 3 : print ('lili')
python3 å¿
é¡»å æ¬å·
execè¯å¥è¢«python3åºå¼ï¼ç»ä¸ä½¿ç¨exec彿°
2ï¼å
æ¶µ
Python2ï¼1ï¼èè¿ï¼æºç çéå¤éå¾å¤ã
ã 2ï¼è¯æ³ä¸æ¸
æ°ï¼æºæçCï¼phpï¼Javaï¼çä¸äºéä¹ ã
Python3ï¼å 乿¯éæåçæºç ï¼è§èï¼æ¸
æ°ï¼ä¼ç¾ã
3ãè¾åºä¸æçåºå«
python2ï¼è¦è¾åºä¸æ éå # -- encoding:utf-8 --
Python3 ï¼ ç´æ¥æ
4ï¼inputä¸å
python2 ï¼raw_input
python3 ï¼input ç»ä¸ä½¿ç¨input彿°
5ï¼æå®åè
python2å¨ç¼è¯å®è£
æ¶ï¼å¯ä»¥éè¿åæ°-----enable-unicode=ucs2 æ-----enable-unicode=ucs4åå«ç¨äºæå®ä½¿ç¨2个åèã4个åè表示ä¸ä¸ªunicodeï¼
python3æ æ³è¿è¡éæ©ï¼é»è®¤ä½¿ç¨ ucs4
æ¥çå½åpythonä¸è¡¨ç¤ºunicodeå符串æ¶å ç¨ç空é´ï¼
impor sys
printï¼sys.maxunicodeï¼
#妿弿¯65535ï¼å表示使ç¨usc2æ åï¼å³ï¼2个åè表示
#妿弿¯1114111ï¼å表示使ç¨usc4æ åï¼å³ï¼4个åè表示
6ï¼
py2ï¼xrange
ããããrange
py3ï¼range ç»ä¸ä½¿ç¨rangeï¼Python3ä¸rangeçæºå¶ä¹è¿è¡ä¿®æ¹å¹¶æé«äºå¤§æ°æ®éçææç
7ï¼å¨å
çç¥è¯ç¹é
å
ï¼ä¸ç¾¤æ¨¡åæä»¶çéå + init
åºå«ï¼py2 ï¼ å¿
é¡»æ__init__
ãããpy3ï¼ä¸æ¯å¿
é¡»çäº
8ï¼ä¸ç¸çæä½ç¬¦"<>â被Python3åºå¼ï¼ç»ä¸ä½¿ç¨â!="
9ï¼longæ´æ°ç±»å被Python3åºå¼ï¼ç»ä¸ä½¿ç¨int
10ï¼è¿ä»£å¨iteratorçnext()彿°è¢«Python3åºå¼ï¼ç»ä¸ä½¿ç¨next(iterator)
11ï¼å¼å¸¸StandardError 被Python3åºå¼ï¼ç»ä¸ä½¿ç¨Exception
12ï¼åå ¸åéçhas_key彿°è¢«Pythonåºå¼ï¼ç»ä¸ä½¿ç¨inå ³é®è¯
13ï¼file彿°è¢«Python3åºå¼ï¼ç»ä¸ä½¿ç¨openæ¥å¤çæä»¶ï¼å¯ä»¥éè¿io.IOBaseæ£æ¥æä»¶ç±»å
17ï¼ç¨ä¸è¡ä»£ç å®ç°æ°å¼äº¤æ¢
a = 1
b = 2
a, b = b, a
18ï¼Python3åPython2ä¸intålongåºå«
å¨python3éï¼åªæä¸ç§æ´æ°ç±»åint,大夿°æ åµä¸ï¼åpythonï¼ä¸çé¿æ´å类似ã
19ï¼xrangeårangeçåºå«
é½å¨å¾ªç¯æ¶ä½¿ç¨ï¼xrangeå åæ§è½æ´å¥½ï¼xrangeç¨æ³ä¸rangeå®å ¨ç¸åï¼rangeä¸ä¸ªçælist对象ï¼xrangeæ¯çæå¨
è¦çæå¾å¤§çæ°ååºåçæ¶åï¼ç¨xrange伿¯rangeæ§è½ä¼å¾å¤ï¼å 为ä¸éè¦ä¸ä¸æ¥å°±å¼è¾ä¸åå¾å¤§çå å空é´ã
å¨python2ä¸ï¼
range([start,] stop[, step])ï¼æ ¹æ®startä¸stopæå®çèå´ä»¥åstep设å®çæ¥é¿ï¼çæä¸ä¸ªåºå
xrangeç¨æ³ä¸rangeå®å ¨ç¸åï¼æä¸åçæ¯çæç䏿¯ä¸ä¸ªæ°ç»ï¼èæ¯ä¸ä¸ªçæå¨ã
ç±ä¸é¢ç示ä¾å¯ä»¥ç¥éï¼è¦çæå¾å¤§çæ°ååºåçæ¶åï¼ç¨xrange伿¯rangeæ§è½ä¼å¾å¤ï¼å 为ä¸éè¦ä¸ä¸æ¥å°±å¼è¾ä¸åå¾å¤§çå å空é´ï¼è¿ä¸¤ä¸ªåºæ¬ä¸é½æ¯å¨å¾ªç¯çæ¶åç¨ã
å¨ Python 3 ä¸ï¼range() æ¯å xrange() 飿 ·å®ç°ï¼xrange()被æå¼ã
20ï¼æä»¶æä½æ¶ï¼xreadlinesåreadlinesçåºå«ï¼
readlines è¿åä¸ä¸ªå表
xreadlines è¿åä¸ä¸ªçæå¨
21ï¼ åï¦ä¸¾å¸å°å¼ä¸ºFalseç常è§å¼ï¼
0ï¼ââï¼{}ï¼[],ï¼ï¼ï¼setï¼ï¼
0 Flask è´æ° 䏿ç«çè¡¨è¾¾å¼ None ç
22. å符串ãå表ãå ç»ãåå ¸æ¯ä¸ªå¸¸ç¨ç5ä¸ªæ¹æ³ï¼
å符串ï¼
å符串ç¨åå¼å·(')æåå¼å·(")æ¬èµ·æ¥ï¼ä¸å¯å 1ï¼findéè¿å ç´ æ¾ç´¢å¼ï¼å¯åçï¼æ¾ä¸å°è¿å-1 2ï¼indexï¼æ¾ä¸å°æ¥éã 3ï¼split ç±å符串å岿å表ï¼é»è®¤æç©ºæ ¼ã 4ï¼captalize é¦åæ¯å¤§åï¼å ¶ä»åæ¯å°åã 5ï¼upper å ¨å¤§åã 6ï¼lower å ¨å°åã 7ï¼titleï¼æ¯ä¸ªåè¯çé¦åæ¯å¤§åã 8ï¼startswith 夿以ä»ä¹ä¸ºå¼å¤´ï¼å¯ä»¥åçï¼æ´ä½æ¦å¿µã 9ï¼endswith 夿以ä»ä¹ä¸ºç»å°¾ï¼å¯ä»¥åçï¼æ´ä½æ¦å¿µã 10ï¼formatæ ¼å¼åè¾åº
#formatçä¸ç§ç©æ³ æ ¼å¼åè¾åº
res='{} {} {}'.format('egon',18,'male') ==> egon 18 male
res='{1} {0} {1}'.format('egon',18,'male') ==> 18 egon 18
res='{name} {age} {sex}'.format(sex='male',name='egon',age=18)
11,strip é»è®¤å»æä¸¤ä¾§ç©ºæ ¼ï¼ææ¡ä»¶ï¼ 12ï¼lstrip,rstrip 14,center å±
ä¸ï¼é»è®¤ç©ºæ ¼ã
15ï¼countæ¥æ¾å
ç´ ç个æ°ï¼å¯ä»¥åçï¼è¥æ²¡æè¿å0
16ï¼expandtabs å°ä¸ä¸ªtabé®åæ8ä¸ªç©ºæ ¼ï¼å¦ætabåé¢çå符é¿åº¦ä¸è¶³8个ï¼åè¡¥å
¨8个ï¼
17ï¼replaceï¼oldï¼new,次æ°ï¼
18ï¼isdigit å符串ç±åæ¯ææ°åç»æ isalpha, å符串åªç±åæ¯ç»æ isalnum å符串åªç±æ°åç»æ
19,swapcase 大å°å翻转
20ï¼for i in å¯è¿ä»£å¯¹è±¡ã
åå
¸ï¼
1æ åºï¼ä¸è½ç´¢å¼ï¼2ï¼æ°æ®å
³èæ§å¼º3:é®å¼å¯¹ï¼é®å¼å¯¹ãå¯ä¸ä¸ä¸ªæ å°æ°æ®ç±»åã
#åå
¸çé®å¿
é¡»æ¯å¯åå¸ç ä¸å¯åç±»åã
å¨åä¸ä¸ªåå
¸ä¸ï¼é®(key)å¿
é¡»æ¯å¯ä¸çã
åè¡¨æ¯æåºç对象éåï¼åå
¸æ¯æ åºç对象éåã两è
ä¹é´çåºå«å¨äºï¼åå
¸å½ä¸çå
ç´ æ¯éè¿é®æ¥ååçï¼è䏿¯éè¿åç§»åå
keyï¼ è¾åºææçé®
clearï¼æ¸
空
dicï¼å é¤çé®å¦ææ²¡æåæ¥é
popï¼é®å¼å¯¹å ï¼æè¿åï¼æ²¡æåæ¥çé®ä¼æ¥éï¼èªè¡è®¾ç½®è¿åé®å°±ä¸ä¼æ¥éï¼
popitemï¼éæºå é®å¼å¯¹
delï¼å é¤çé®å¦ææ²¡æåæ¥é
æ¹ update
æ¥ ç¨getæ¶ãä¸ä¼æ¥é# 没æå¯ä»¥è¿å设å®çè¿åå¼
注æï¼
1ãåå
¸æ¯ä¸ç§æ å°ç±»åï¼å®çå
ç´ æ¯é®å¼å¯¹ã
2ãåå
¸çå
³é®åå¿
须为ä¸å¯åç±»åï¼ä¸ä¸è½éå¤ã
3ãå建空åå
¸ä½¿ç¨ { }ã
å表ï¼
ç´¢å¼ï¼åçï¼å ï¼ä¹ï¼æ£æ¥æåã
å¢å ï¼æä¸ç§ï¼
appendï¼å¨å颿·»å ã
Insertæç
§ç´¢å¼æ·»å ï¼
expendï¼è¿ä»£çæ·»å ã
list.extend(seq) - å¨å表æ«å°¾ä¸æ¬¡æ§è¿½å å¦ä¸ä¸ªåºåä¸çå¤ä¸ªå¼ï¼ç¨æ°å表æ©å±åæ¥çå表ï¼
pop å é¤ (pop æè¿åå¼)
remove å¯ä»¥æç
§å
ç´ å»å
clear æ¸
空å表
del 1ãå¯ä»¥æç
§ç´¢å¼å»å é¤ 2ãåç 3ãæ¥é¿ï¼éçå ï¼
æ¹ 1ãç´¢å¼ 2ãåçï¼å
å é¤ï¼åè¿ä»£çæ·»å
list.count(obj) - ç»è®¡æä¸ªå
ç´ å¨å表ä¸åºç°ç次æ°
list.index(obj) - ä»åè¡¨ä¸æ¾åºæä¸ªå¼ç¬¬ä¸ä¸ªå¹é
项çç´¢å¼ä½ç½®
list.reverse() - ååå表ä¸å
ç´
list.sort([func]) - 对åå表è¿è¡æåº
注æï¼
1ãListå卿¹æ¬å·ä¹é´ï¼å
ç´ ç¨éå·éå¼ã
2ãååç¬¦ä¸²ä¸æ ·ï¼listå¯ä»¥è¢«ç´¢å¼ååçã
3ãListå¯ä»¥ä½¿ç¨+æä½ç¬¦è¿è¡æ¼æ¥ã
4ãListä¸çå
ç´ æ¯å¯ä»¥æ¹åçã
å
ç»ï¼
ï¼ï¼å
ç»çå
ç´ ä¸è½ä¿®æ¹
1ãcmp(tuple1, tuple2)ï¼æ¯è¾ä¸¤ä¸ªå
ç»å
ç´ ã
2ãlen(tuple)ï¼è®¡ç®å
ç»å
ç´ ä¸ªæ°ã
3ãmax(tuple)ï¼è¿åå
ç»ä¸å
ç´ æå¤§å¼ã
4ãmin(tuple)ï¼è¿åå
ç»ä¸å
ç´ æå°å¼ã
5ãtuple(seq)ï¼å°å表转æ¢ä¸ºå
ç»ã
注æ
1ãä¸åç¬¦ä¸²ä¸æ ·ï¼å
ç»çå
ç´ ä¸è½ä¿®æ¹ã
2ãå
ç»ä¹å¯ä»¥è¢«ç´¢å¼ååçï¼æ¹æ³ä¸æ ·ã
3ãæ³¨ææé å
å«0æ1个å
ç´ çå
ç»çç¹æ®è¯æ³è§åã
4ãå
ç»ä¹å¯ä»¥ä½¿ç¨+æä½ç¬¦è¿è¡æ¼æ¥ã
ï¼éåï¼setï¼æ¯ä¸ä¸ªæ åºä¸éå¤å ç´ çåºåã å¯ä»¥ä½¿ç¨å¤§æ¬å· { } æè set() 彿°å建éåï¼æ³¨æï¼å建ä¸ä¸ªç©ºéåå¿ é¡»ç¨ set() è䏿¯ { }ï¼å 为 { } æ¯ç¨æ¥å建ä¸ä¸ªç©ºåå ¸ã
23ã lambdaè¡¨è¾¾å¼æ ¼å¼ä»¥ååºç¨åºæ¯ï¼
å¿å彿°ï¼ä¸ºäºè§£å³é£äºåè½å¾ç®åçéæ±è设计çä¸å¥è¯å½æ°
彿°å = lambda åæ° ï¼è¿åå¼
#åæ°å¯ä»¥æå¤ä¸ªï¼ç¨éå·éå¼
#å¿å彿°ä¸ç®¡é»è¾å¤å¤æï¼åªè½åä¸è¡ï¼ä¸é»è¾æ§è¡ç»æåçå
容就æ¯è¿åå¼
#è¿åå¼åæ£å¸¸ç彿°ä¸æ ·å¯ä»¥æ¯ä»»ææ°æ®ç±»å
lambda 表达å¼
temp = lambda x,y:x+y
print(temp(4,10)) # 14
坿¿ä»£ï¼
def foo(x,y):
return x+y
print(foo(4,10)) # 14
24. passçä½ç¨
passæ¯ç©ºè¯å¥ï¼æ¯ä¸ºäºä¿æç¨åºç»æç宿´æ§ãpass ä¸åä»»ä½äºæ ï¼ä¸è¬ç¨åå ä½è¯å¥ã
25. *argå**kwargä½ç¨
*args代表ä½ç½®åæ°ï¼å®ä¼æ¥æ¶ä»»æå¤ä¸ªåæ°å¹¶æè¿äºåæ°ä½ä¸ºå ç¥ä¼ éç»å½æ°ã
**kwargs代表çå ³é®ååæ°ï¼è¿åçæ¯åå ¸ï¼ä½ç½®åæ°ä¸å®è¦æ¾å¨å ³é®ååé¢
26. iså==çåºå«
a = 'lishi'
str1 = "li"
str2 = "shi"
str3 = str1 + str2
print("a == str3",a == str3)
print("a is str3",a is str3)
print("id(a)",id(a))
print("id(str3)",id(str3))
# a == str3 True == ---> åªéè¦å
容ç¸ç
# a is str3 False is ---> åªéè¦å
åå°åç¸ç
# id(a) 38565848
# id(str3) 39110280
is æ¯è¾çæ¯ä¸¤ä¸ªå®ä¾å¯¹è±¡æ¯ä¸æ¯å®å
¨ç¸åï¼å®ä»¬æ¯ä¸æ¯åä¸ä¸ªå¯¹è±¡ï¼å ç¨çå
åå°åæ¯å¦ç¸åã
== æ¯è¾çæ¯ä¸¤ä¸ªå¯¹è±¡çå 容æ¯å¦ç¸çï¼å³å åå°åå¯ä»¥ä¸ä¸æ ·ï¼å 容䏿 ·å°±å¯ä»¥äºãé»è®¤ä¼è°ç¨å¯¹è±¡ç eq()æ¹æ³ã
27ï¼è°è°Pythonçæ·±æµ æ·è´ï¼ä»¥åå®ç°æ¹æ³ååºç¨åºæ¯ã
æµ æ·è´åªæ¯å¢å äºä¸ä¸ªæéæåä¸ä¸ªåå¨çå°åï¼
èæ·±æ·è´æ¯å¢å ä¸ä¸ªæéå¹¶ä¸å¼è¾äºæ°çå
åï¼è¿ä¸ªå¢å çæéæåè¿ä¸ªæ°çå
åï¼
éç¨æµ
æ·è´çæ
åµï¼éæ¾å
åï¼ä¼éæ¾åä¸å
åï¼æ·±æ·è´å°±ä¸ä¼åºç°éæ¾åä¸å
åçé误
ä¸å±çæ åµï¼
import copy
æµ æ·è´
li1 = [1, 2, 3]
li2 = li1.copy()
li1.append(4)
print(li1, li2) # [1, 2, 3, 4] [1, 2, 3]
æ·±æ·è´
li1 = [1, 2, 3]
li2 = copy.deepcopy(li1)
li1.append(4)
print(li1, li2) # [1, 2, 3, 4] [1, 2, 3]
å¤å±çæ åµï¼
import copy
æµ æ·è´ æåå ±æçå°å
li1 = [1, 2, 3,[4,5],6]
li2 = li1.copy()
li1[3].append(7)
print(li1, li2) # [1, 2, 3, [4, 5, 7], 6] [1, 2, 3, [4, 5, 7], 6]
æ·±æ·è´ éæå
li1 = [1, 2, 3,[4,5],6]
li2 = copy.deepcopy(li1)
li1[3].append(7)
print(li1, li2) # [1, 2, 3, [4, 5, 7], 6] [1, 2, 3, [4, 5], 6]
28. Pythonåå¾åæ¶æºå¶ï¼
å¼ç¨è®¡æ°
æ è®°æ¸ é¤
å代忶
29. Pythonçå¯åç±»ååä¸å¯åç±»åï¼
å¯åæ°æ®ç±»åï¼å表ãåå ¸ãå¯åéå
ä¸å¯åæ°æ®ç±»åï¼æ°åãå符串ãå ç»ãä¸å¯åéå
30ãæ±ç»æ
def multipliers(): return [lambda x:i*x for i in range(4)] print([m(2) for m in multipliers()])
def a():
return [lambda x:i*x for i in range(4)]
b=a() #è¿å个åè¡¨å½æ°
# b[2](1)
print(b1)
print(type(b),b)
print([m(1) for m in a()])
print([i*i for i in [1,2,3]])
[3, 3, 3, 3]
[1, 4, 9]
âââ
def multipliers():
return [lambda x:i*x for i in range(4)]
print([m(2) for m in multipliers()])
#è§£éï¼
ãã彿°è¿åå¼ä¸ºä¸ä¸ªå表表达å¼ï¼ç»è¿4次循ç¯ç»æä¸ºå
å«å个lambda彿°çå表ï¼
ç±äºå½æ°æªè¢«è°ç¨ï¼å¾ªç¯ä¸çi弿ªè¢«åå
¥å½æ°ï¼ç»è¿å¤æ¬¡æ¿ä»£ï¼å¾ªç¯ç»æåiå¼ä¸º3ï¼
æ
ç»æä¸ºï¼6,6,6,6
func=lambda x:x+1
print(func(1))
#2
print(func(2))
#3
#以ä¸lambdaçåäºä»¥ä¸å½æ°
def func(x):
return(x+1)
âââ
请修æ¹multipliersçå®ä¹æ¥äº§çææçç»æï¼0,2,4,6ï¼ã
def multipliers():
return ï¼lambda x:i*x for i in range(4)ï¼ #è¿åä¸ä¸ªçæå¨è¡¨è¾¾å¼
print([m(2) for m in multipliers()])
-é¢è¯é¢2ï¼
ç°æä¸¤ä¸ªå ç»(('a'),('b')),(('c'),('d'))ï¼è¯·ä½¿ç¨pythonä¸å¿å彿°çæå表[{'a':'c'},{'b':'d'}]
#å¿å彿°å½¢å¼ï¼
l1=((âaâ),(âbâ))
l2=((âcâ),(âdâ))
ret=map(lambda n:{n[0]:n[1]},zip(l1,l2))
print(list(ret))
#å表表达å¼å½¢å¼ï¼
l1=((âaâ),(âbâ))
l2=((âcâ),(âdâ))
print([{n[0]:n[1]} for n in zip(l1,l2)])
31ãæ±ç»æ
v = dict.fromkeys(['k1', 'k2'], [])
v['k1'].append(666)
print(v)
v['k1'] = 777
print(v)
ç»æï¼
{âk1â: [666], âk2â: [666]}
{âk1â: 777, âk2â: [666]}
è§£éï¼
Python åå
¸(Dictionary) fromkeys() 彿°ç¨äºå建ä¸ä¸ªæ°åå
¸ï¼ä»¥åºåseqä¸å
ç´ ååå
¸çé®ï¼value为åå
¸ææé®å¯¹åºçåå§å¼ï¼é»è®¤ä¸ºNoneã
v1 = dict.fromkeys([âk1â, âk2â])
print(v1) # {âk1â: None, âk2â: None}
v2 = dict.fromkeys([âk1â, âk2â], [])
print(v2) # {âk1â: [], âk2â: []}
32ãå举常è§çå ç½®å½æ°
absï¼ï¼
è¿åæ°åçç»å¯¹å¼
map
æ ¹æ®å½æ°å¯¹æå®åºååæ å°
map()彿°æ¥æ¶ä¸¤ä¸ªåæ°ï¼ä¸ä¸ªæ¯å½æ°ï¼ä¸ä¸ªæ¯å¯è¿ä»£å¯¹è±¡ï¼mapå°ä¼ å
¥ç彿°ä¾æ¬¡ä½ç¨å°åºåçæ¯ä¸ªå
ç´ ï¼å¹¶æç»æä½ä¸ºæ°çlistè¿åã
è¿åå¼ï¼
ããPython2 è¿åå表
ããPython3 è¿åè¿ä»£å¨
ä¾å1ï¼
def mul(x):
return x*x
n=[1,2,3,4,5]
res=list(map(mul,n))
print(res) #[1, 4, 9, 16, 25]
ä¾å2ï¼abs() è¿åæ°åçç»å¯¹å¼
ret = map(abs,[-1,-5,6,-7])
print(list(ret))
# [1, 5, 6, 7]
filter
filter()彿°æ¥æ¶ä¸ä¸ªå½æ° f(彿°)åä¸ä¸ªlistï¼å¯è¿ä»£å¯¹è±¡ï¼ï¼è¿ä¸ªå½æ° fçä½ç¨æ¯å¯¹æ¯ä¸ªå
ç´ è¿è¡å¤æï¼è¿å Trueæ Falseï¼
filter()æ ¹æ®å¤æç»æèªå¨è¿æ»¤æä¸ç¬¦åæ¡ä»¶çå
ç´ ï¼è¿åç±ç¬¦åæ¡ä»¶å
ç´ ç»æçæ°listã
def is_odd(x):
return x % 2 == 1
v=list(filter(is_odd, [1, 4, 6, 7, 9, 12, 17]))
print(v) #[1, 7, 9, 17]
mapä¸filteræ»ç»
# filter ä¸ map æ»ç» # åæ°: 齿¯ä¸ä¸ªå½æ°å + å¯è¿ä»£å¯¹è±¡ # è¿åå¼: 齿¯è¿åå¯è¿ä»£å¯¹è±¡ # åºå«: # filter æ¯åçéçï¼ç»æè¿æ¯åæ¥å°±å¨å¯è¿ä»£å¯¹è±¡ä¸ç项 # map æ¯å¯¹å¯è¿ä»£å¯¹è±¡ä¸æ¯ä¸é¡¹åæä½çï¼ç»æä¸ä¸å®æ¯åæ¥å°±å¨å¯è¿ä»£å¯¹è±¡ä¸ç项
isinstance\type
isinstance() 彿°æ¥å¤æä¸ä¸ªå¯¹è±¡æ¯å¦æ¯ä¸ä¸ªå·²ç¥çç±»åï¼ç±»ä¼¼ type()ã
isinstance() ä¸ type() åºå«ï¼
type() ä¸ä¼è®¤ä¸ºåç±»æ¯ä¸ç§ç¶ç±»ç±»åï¼ä¸èèç»§æ¿å
³ç³»ã
isinstance() ä¼è®¤ä¸ºåç±»æ¯ä¸ç§ç¶ç±»ç±»åï¼èèç»§æ¿å
³ç³»ã
妿è¦å¤æä¸¤ä¸ªç±»åæ¯å¦ç¸åæ¨èä½¿ç¨ isinstance()ã
# ä¾ä¸
a = 2
print(isinstance(a,int)) # True
print(isinstance(a,str)) # False
type() ä¸ isinstance() åºå«
class A:
pass
class B(A):
pass
print(âisinstanceâ,isinstance(A(),A)) # isinstance True
print(âtypeâ,type(A()) == A) # type True
print(âisinstanceâ,isinstance(B(),A) ) # isinstance True
print(âtypeâ,type(B()) == A) # type False
zip æé¾å½æ°
# zip æé¾å½æ°ï¼
# å°å¯¹è±¡ä¸å¯¹åºçå
ç´ æå
æä¸ä¸ªä¸ªå
ç»ï¼
# ç¶åè¿åç±è¿äºå
ç»ç»æçå表è¿ä»£å¨ã
# 妿å个è¿ä»£å¨çå
ç´ ä¸ªæ°ä¸ä¸è´ï¼åè¿åå表é¿åº¦ä¸æçç对象ç¸åã
print(list(zip([0,1,3],[5,6,7],['a','b'])))
# [(0, 5, 'a'), (1, 6, 'b')]
zip() 彿°ç¨äºå°å¯è¿ä»£ç对象ä½ä¸ºåæ°ï¼å°å¯¹è±¡ä¸å¯¹åºçå
ç´ æå
æä¸ä¸ªä¸ªå
ç»ï¼ç¶åè¿åç±è¿äºå
ç»ç»æçå表ã
>>>a = [1,2,3]
>>> b = [4,5,6]
>>> c = [4,5,6,7,8]
>>> zipped = zip(a,b) # æå
为å
ç»çå表
[(1, 4), (2, 5), (3, 6)]
>>> zip(a,c) # å
ç´ ä¸ªæ°ä¸æççå表ä¸è´
[(1, 4), (2, 5), (3, 6)]
>>> zip(*zipped) # ä¸ zip ç¸åï¼å¯ç解为解åï¼è¿åäºç»´ç©éµå¼
[(1, 2, 3), (4, 5, 6)]
reduce
'''
reduce() 彿°
reduce() 彿°ä¼å¯¹åæ°åºåä¸å
ç´ è¿è¡ç´¯ç§¯
彿°å°ä¸ä¸ªæ°æ®éå(é¾è¡¨ãå
ç»ç)ä¸çæææ°æ®è¿è¡ä¸åæä½
'''
注æï¼
Python3å·²ç»å°reduce() 彿°ä»å
¨å±åå空é´éç§»é¤äºï¼å®ç°å¨è¢«æ¾ç½®å¨ fucntools 模åéï¼å¦ææ³è¦ä½¿ç¨å®ï¼åéè¦éè¿å¼å
¥ functools æ¨¡åæ¥è°ç¨ reduce() 彿°ï¼
from functools import reduce
def add(x,y):
return x + y
print(reduce(add,[1,2,3,4,5]))
15
print(reduce(lambda x, y: x+y, [1,2,3,4,5])) # 15
print(reduce(add,range(1,101)))
5050
33. filterãmapãreduceçä½ç¨ï¼
å ç½®å½æ°ï¼mapãreduceãfilterçç¨æ³ååºå«
map:æ ¹æ®å½æ°å¯¹æå®åºååæ å°
map
åæ°
æ¥æ¶ä¸¤ä¸ªåæ°ï¼ä¸ä¸ªæ¯å½æ°ï¼ä¸ä¸ªæ¯åºåï¼å¯è¿ä»£å¯¹è±¡ï¼
è¿åå¼
Python2 è¿åå表
Python3 è¿åè¿ä»£å¨
ä¾åï¼
abs() 彿°è¿åæ°åçç»å¯¹å¼
æ°çå 容ç个æ°çäºåå 容ç个æ°
ret = map(abs,[-1,-5,6,-7])
print(list(ret))
[1, 5, 6, 7]
filter:è¿æ»¤å½æ° æ°çå 容å°äºçäºåå å®¹çæ¶åãæè½ä½¿ç¨filter
filter() 彿°ç¨äºè¿æ»¤åºåï¼è¿æ»¤ä¸ç¬¦åæ¡ä»¶çå
ç´ ï¼è¿åç±ç¬¦åæ¡ä»¶å
ç´ ç»æçå¿å表
åæ°ï¼
function 彿°
iterable å¯è¿ä»£å¯¹è±¡
è¿åå¼:
è¿åå表
çé大äº10çæ°
def is_odd(x):
if x>10:
return True
ret = filter(is_odd,[1,4,5,7,8,9,76]) # 为è¿ä»£å¨
print(list(ret))
[76]
reduce:对äºåºåå ææå ç´ è¿è¡ç´¯è®¡æä½
''' reduce() 彿° reduce() 彿°ä¼å¯¹åæ°åºåä¸å ç´ è¿è¡ç´¯ç§¯ 彿°å°ä¸ä¸ªæ°æ®éå(é¾è¡¨ãå ç»ç)ä¸çæææ°æ®è¿è¡ä¸åæä½ '''
from functools import reduce
def add(x,y):
return x + y
print(reduce(add,[1,2,3,4,5]))
15
print(reduce(lambda x, y: x+y, [1,2,3,4,5])) # 15
print(reduce(add,range(1,101)))
5050
34ã ä¸è¡ä»£ç å®ç°9*9乿³è¡¨
print('\n'.join([' '.join(['%s*%s=%-2s' % (j, i, i * j) for j in range(1, i + 1)]) for i in range(1, 10)]))
35. å¦ä½å®è£ ç¬¬ä¸æ¹æ¨¡åï¼ä»¥åç¨è¿åªäºç¬¬ä¸æ¹æ¨¡åï¼
1ï¼pipå
管çå¨
2ï¼æºç ä¸è½½
-ä¸è½½
-è§£å
-python setup.py build
-python setup.py install
ç¨è¿çç¬¬ä¸æ¹æ¨¡åï¼requests,pymysql,DbUtils,SQLAlchemyç
36ã å¸¸ç¨æ¨¡å齿é£äºï¼
re模åï¼os模åï¼json模åï¼time模åï¼
ç¬è«éé¢çrequests/beautifulsoup4ï¼bs4ï¼
37. reçmatchåsearchåºå«ï¼
re.match å°è¯ä»å符串çèµ·å§ä½ç½®å¹é ä¸ä¸ªæ¨¡å¼ï¼å¦æä¸æ¯èµ·å§ä½ç½®å¹é æåçè¯ï¼match()å°±è¿ånoneã
re.search æ«ææ´ä¸ªå符串并è¿å第ä¸ä¸ªæåçå¹é ã
38. ï§½ä¹æ¯æ£åç贪婪å¹é ï¼
å¹é ä¸ä¸ªå符串没æèå¶ï¼è½å¹é å¤å°å°±å»å¹é å¤å°ï¼ç¥é没æå¹é ç为æ¢
39. æ±ç»æï¼
a. [ i % 2 for i in range(10) ]
print([ i % 2 for i in range(10) ]) # [0, 1, 0, 1, 0, 1, 0, 1, 0, 1] print([ i for i in range(10) ]) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] print([ 10 % 2]) # [0] # %æ¯ä¸ªè¿ç®ç¬¦ã
b. ( i % 2 for i in range(10) )
print(( i % 2 for i in range(10) ))
# <generator object <genexpr> at 0x00000000020CEEB8> çæå¨
# å¨Pythonä¸ï¼æä¸ç§èªå®ä¹è¿ä»£å¨çæ¹å¼ï¼ç§°ä¸ºçæå¨ï¼Generatorï¼ã
# å®ä¹çæå¨çä¸¤ç§æ¹å¼ï¼
# 1.å建ä¸ä¸ªgeneratorï¼åªè¦æä¸ä¸ªå表çæå¼ç[]æ¹æ()ï¼å°±å建äºä¸ä¸ªgeneratorï¼
# generatorä¿åçæ¯ç®æ³ï¼æ¯æ¬¡è°ç¨next()ï¼å°±è®¡ç®åºä¸ä¸ä¸ªå
ç´ çå¼ï¼ç´å°è®¡ç®å°æåä¸ä¸ªå
ç´ ï¼
æ²¡ææ´å¤çå
ç´ æ¶ï¼æåºStopIterationçé误ã
# 2.å®ä¹generatorçå¦ä¸ç§æ¹æ³ã妿ä¸ä¸ªå½æ°å®ä¹ä¸å
å«yieldå
³é®åï¼é£ä¹è¿ä¸ªå½æ°å°±ä¸åæ¯ä¸ä¸ªæ®é彿°ï¼
èæ¯ä¸ä¸ªgenerator
40. æ±ç»æï¼
a. 1 or 2
b. 1 and 2
c. 1 < (2==2)
d. 1 < 2 == 2
>>> 1 or 2
1
>>> 1 and 2
2
>>> 1 < (2==2)
False
>>> 1 < 2 == 2
True
41ãdef func(a,b=[]) è¿ç§åæ³æä»ï§½ä¹åï¼
def func(a,b = []): b.append(1) print(a,b)
func(a=2)
func(2)
func(2)
âââ
2 [1]
2 [1, 1]
2 [1, 1, 1]
彿°çé»è®¤åæ°æ¯ä¸ä¸ªlist å½ç¬¬ä¸æ¬¡æ§è¡çæ¶åå®ä¾åäºä¸ä¸ªlist
ç¬¬äºæ¬¡æ§è¡è¿æ¯ç¨ç¬¬ä¸æ¬¡æ§è¡çæ¶åå®ä¾åçå°ååå¨
æä»¥ä¸æ¬¡æ§è¡çç»æå°±æ¯ [1, 1, 1] æ³æ¯æ¬¡æ§è¡åªè¾åº[1] ï¼é»è®¤åæ°åºè¯¥è®¾ç½®ä¸ºNone
âââ
42ãå¦ä½å®ç° â1,2,3â åæ [â1â,â2â,â3â]
list("1,2,3".split(','))
43. å¦ä½å®ç°[â1â,â2â,â3â]åæ[1,2,3]
[int(x) for x in ['1','2','3']]
python éå¦ä½æ[â1â,â2â,â3â] åæ[1,2,3]
a = [â1â,â2â,â3â]
b = [int(i) for i in a]
print(b)
[1, 2, 3]
44. a = [1,2,3] å b = [(1),(2),(3) ] 以å b = [(1,),(2,),(3,) ] çåºå«ï¼
è¡¥å ï¼
a=[1,2,3,4,5]ï¼b=aåb=a[:]ï¼æåºå«ä¹ï¼
a = [1,2,3,4,5]
b = a
b1 = a[:]
print(b) # [1, 2, 3, 4, 5]
print(b) # [1, 2, 3, 4, 5]
b.append(6) print("a",a) # a [1, 2, 3, 4, 5, 6] print("b",b) # b [1, 2, 3, 4, 5, 6] ä¼ éå¼ç¨ print("b1",b1) # b1 [1, 2, 3, 4, 5] æ·è´# ä¸ä¸ªå表A=[2ï¼3ï¼4]ï¼Pythonå¦ä½å°å ¶è½¬æ¢æB=[(2,3),(3,4),(4,2)]ï¼ # B = zip(A, A[1:]+A[:1])
45. å¦ä½ç¨ä¸è¡ä»£ç çæ[1,4,9,16,25,36,49,64,81,100]
[i*i for i in range(1,11)]
46. ä¸ï¨ä»£ç å®ç°å é¤å表ä¸éå¤çå¼
list(set([1, 2, 3, 4, 45, 1, 2, 343, 2, 2]))
47. å¦ä½å¨å½æ°ä¸è®¾ç½®ä¸ä¸ªå ¨å±åé
pythonä¸çglobalè¯å¥æ¯è¢«ç¨æ¥å£°æå ¨å±åéçã
x = 2
def func():
global x
x = 1
return x
func()
print(x) # 1
48. logging模åçä½ç¨ï¼ä»¥ååºç¨åºæ¯ï¼
logging
模åå®ä¹ç彿°å类为åºç¨ç¨åºååºçå¼åå®ç°äºä¸ä¸ªçµæ´»çäºä»¶æ¥å¿ç³»ç»
ä½ç¨ï¼å¯ä»¥äºè§£ç¨åºè¿è¡æ
åµï¼æ¯å¦æ£å¸¸
ããããå¨ç¨åºçåºç°æ
éå¿«éå®ä½åºéå°æ¹åæ
éåæ
49. 请ç¨ä»£ç ç®çå®ç°stack
- Stack() å建ä¸ä¸ªæ°ç空æ
- push(item) æ·»å ä¸ä¸ªæ°çå ç´ itemå°æ é¡¶
- pop() å¼¹åºæ é¡¶å ç´
- peek() è¿åæ é¡¶å ç´
- is_empty() å¤ææ æ¯å¦ä¸ºç©º
- size() è¿åæ çå ç´ ä¸ªæ°
# å®ç°ä¸ä¸ªæ stack,åè¿å åº
âââ
class Stack:
def init(self):
self.items = []
def is_empty(self):
# 夿æ¯å¦ä¸ºç©º
return self.items == []
def push(self,item):
# å å
¥å
ç´
self.items.append(item)
def pop(self):
# å¼¹åºå
ç´
return self.items.pop()
def peek(self):
# è¿åæ é¡¶å
ç´
return self.items[len(self.items)-1]
def size(self):
# è¿åæ ç大å°
return len(self.items)
if name == âmainâ:
stack = Stack()
stack.push(âHâ)
stack.push(âEâ)
stack.push(âLâ)
print(stack.size()) # 3
print(stack.peek()) # L
print(stack.pop()) # L
print(stack.pop()) # E
print(stack.pop()) # H
âââ
50. 常ç¨åç¬¦ä¸²æ ¼å¼ååªå ç§ï¼
1.å ä½ç¬¦%
%d 表示é£ä¸ªä½ç½®æ¯æ´æ°ï¼%f è¡¨ç¤ºæµ®ç¹æ°ï¼%s 表示å符串ã
print('Hello,%s' % 'Python')
print('Hello,%d%s%.2f' % (666, 'Python', 9.99)) # æå°ï¼Hello,666Python10.00
2.format
print('{k} is {v}'.format(k='python', v='easy')) # éè¿å
³é®å
print('{0} is {1}'.format('python', 'easy')) # éè¿å
³é®å
51. ç®è¿° çæå¨ãè¿ä»£å¨ãå¯è¿ä»£å¯¹è±¡ 以ååºç¨åºæ¯ï¼
è¿ä»£å¨
嫿__iter__å__next__æ¹æ³ (å å«__next__æ¹æ³çå¯è¿ä»£å¯¹è±¡å°±æ¯è¿ä»£å¨)
çæå¨
ï¼å æ¬å«æyieldè¿ä¸ªå ³é®åï¼çæå¨ä¹æ¯è¿ä»£å¨ï¼è°å¨nextæå½æ°åæè¿ä»£å¨ã
åºç¨åºæ¯ï¼
range/xrange
- py2ï¼ range(1000000) ,ä¼ç«å³å建ï¼xrange(1000000)çæå¨
- py3ï¼rangeï¼10000000ï¼çæå¨
- redisè·åå¼
conn = Redis(...)
ããããdef hscan_iter(self, name, match=None, count=None):
ãããããã"""
ããããããMake an iterator using the HSCAN command so that the client doesn't
ããããããneed to remember the cursor position.
ãããããã``match`` allows for filtering the keys by pattern
ãããããã``count`` allows for hint the minimum number of returns
ãããããã"""
ããããããcursor = '0'
ããããããwhile cursor != 0:
ãããããããã# å»redisä¸è·åæ°æ®ï¼12
ãããããããã# cursorï¼ä¸ä¸æ¬¡åçä½ç½®
ãããããããã# dataï¼æ¬å°è·åç12æ¡æ°æ°æ®
ããããããããcursor, data = self.hscan(name, cursor=cursor,match=match, count=count)
ããããããããfor item in data.items():
ããããããããããyield item
starkç»ä»¶
def index(request):
ããããdata = [
ãããããã{'k1':1,'name':'alex'},
ãããããã{'k1':2,'name':'èç·å©'},
ãããããã{'k1':3,'name':'å°ç·å©'},
ãããã]
ããããnew_data = []
ããããfor item in data:
ããããããitem['email'] = "[email protected]"
ããããããnew_data.append(item)
ããããreturn render(request,'xx.html',{'data':new_data})
å¯è¿ä»£å¯¹è±¡
ä¸ä¸ªç±»å é¨å®ç°__iter__æ¹æ³ä¸è¿åä¸ä¸ªè¿ä»£å¨ã
åºç¨åºæ¯ï¼ - wtformsä¸å¯¹form对象è¿è¡å¾ªç¯æ¶åï¼æ¾ç¤ºformä¸å å«çææå段ã class LoginForm(Form): name = simple.StringField( label='ç¨æ·å', validators=[ validators.DataRequired(message='ç¨æ·åä¸è½ä¸ºç©º.'), validators.Length(min=6, max=18, message='ç¨æ·åé¿åº¦å¿ 须大äº%(min)dä¸å°äº%(max)d') ], widget=widgets.TextInput(), render_kw={'class': 'form-control'} ) pwd = simple.PasswordField( label='å¯ç ', validators=[ validators.DataRequired(message='å¯ç ä¸è½ä¸ºç©º.'), validators.Length(min=8, message='ç¨æ·åé¿åº¦å¿ 须大äº%(min)d'), validators.Regexp(regex="^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[[email protected]$!%*?&])[A-Za-z\[email protected]$!%*?&]{8,}", message='å¯ç è³å°8个å符ï¼è³å°1个大å忝ï¼1个å°å忝ï¼1个æ°åå1ä¸ªç¹æ®å符')], widget=<span>widgets.PasswordInput(), render_kw={'<span>class<span>': <span>'<span>form-control<span>'} ) form =<span> LoginForm() for item <span>in form: print(item) - å表ãåå ¸ãå ç»</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
è£ é¥°å¨
è£
饰å¨ï¼
è½å¤å¨ä¸ä¿®æ¹å彿°ä»£ç çåºç¡ä¸ï¼å¨æ§è¡ååè¿è¡å®å¶æä½ï¼éå
彿°çä¸ç§åºç¨
åºæ¯ï¼
- flaskè·¯ç±ç³»ç»
- flask before_request
- csrf
- djangoå
置认è¯
- djangoç¼å
# æåè£
饰å¨ï¼
import functools
def wrapper(func):
@functools.wraps(func) #䏿¹åå彿°å±æ§
def inner(*args, **kwargs):
æ§è¡å½æ°å
return func(*args, **kwargs)
æ§è¡å½æ°å
return inner
1. æ§è¡wapper彿°ï¼å¹¶å°è¢«è£
饰ç彿°å½ååæ°ã wapper(index)
2. å°ç¬¬ä¸æ¥çè¿åå¼ï¼éæ°èµå¼ç» æ°index = wapper(èindex)
@wrapper #index=wrapper(index)
def index(x):
return x+100
è°ç¨è£
饰å¨å
¶å®æ¯ä¸ä¸ªéå
彿°ï¼ä¸ºå
¶ä»å½æ°æ·»å éå åè½ï¼ä¸ä¿®æ¹è¢«ä¿®æ¹çæºä»£ç åä¸ä¿®æ¹è¢«ä¿®é¥°çæ¹å¼ï¼è£
饰å¨çè¿åå¼ä¹æ¯ä¸ä¸ªå½æ°å¯¹è±¡ã
æ¯å¦ï¼æå
¥æ¥å¿ãæ§è½æµè¯ãäºç©å¤çãç¼åãæééªè¯çï¼æäºè£
饰å¨ï¼å°±å¯ä»¥æ½ç¦»åºå¤§éä¸å½æ°åè½æ¬èº«æ å
³çé·å代ç å¹¶ç»§ç»éç¨ã
52. ç¨Pythonå®ç°ä¸ä¸ªäºåæ¥æ¾ç彿°ã
äºåæ¥æ¾ç®æ³ï¼ç®åç说ï¼å°±æ¯å°ä¸ä¸ªåè¡¨å æåºå¥½ï¼æ¯å¦æç §ä»å°å°å¤§çé¡ºåºæå好ï¼å½ç»å®ä¸ä¸ªæ°æ®ï¼æ¯å¦3ï¼æ¥æ¾3å¨å表ä¸çä½ç½®æ¶ï¼å¯ä»¥å æ¾å°å表ä¸é´çæ°li[middle]å3è¿è¡æ¯è¾ï¼å½å®æ¯3å°æ¶ï¼é£ä¹3ä¸å®æ¯å¨å表çå³è¾¹ï¼åä¹ï¼å3å¨å表çå·¦è¾¹ï¼æ¯å¦å®æ¯3å°ï¼å䏿¬¡å°±å¯ä»¥åªæ¯è¾[middle+1, end]çæ°ï¼ç»§ç»ä½¿ç¨äºåæ³ï¼å°å®ä¸å为äºï¼ç´å°æ¾å°3è¿ä¸ªæ°è¿åæè åè¡¨å ¨é¨éå宿ï¼3ä¸å¨å表ä¸ï¼
ä¼ç¹ï¼æçé«ï¼æ¶é´å¤æåº¦ä¸ºO(logN)ï¼
缺ç¹ï¼æ°æ®è¦æ¯æåºçï¼é¡ºåºåå¨ã
li = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
def search(someone, li):
l = -1
h = len(li)
while l + 1 !=<span> h:
m = int((l + h) / 2<span>)
if li[m] <<span> someone:
l =<span> m
else<span>:
h =<span> m
p =<span> h
if p >= len(li) or li[p] !=<span> someone:
print("å
ç´ ä¸åå¨"<span>)
else<span>:
str = "å
ç´ ç´¢å¼ä¸º%d" %<span> p
print(str)
search(3, li) # å ç´ ç´¢å¼ä¸º2
53. è°è°ä½ 对éå ççè§£ï¼
ef foo():
m=3
n=5
def bar():
a=4
return m+n+a
return bar
>>>bar = foo()
>>>bar()
12
说æï¼
barå¨foo彿°ç代ç åä¸å®ä¹ãæä»¬ç§°baræ¯fooçå
é¨å½æ°ã
å¨barçå±é¨ä½ç¨åä¸å¯ä»¥ç´æ¥è®¿é®fooå±é¨ä½ç¨åä¸å®ä¹çmãnåéã
ç®åç说ï¼è¿ç§å
é¨å½æ°å¯ä»¥ä½¿ç¨å¤é¨å½æ°åéçè¡ä¸ºï¼å°±å«éå
ã
éå çæä¹ä¸åºç¨
54. osåsys模åçä½ç¨ï¼
os模åè´è´£ç¨åºä¸æä½ç³»ç»ç交äºï¼æä¾äºè®¿é®æä½ç³»ç»åºå±çæ¥å£;
sys模åè´è´£ç¨åºä¸pythonè§£éå¨ç交äºï¼æä¾äºä¸ç³»åç彿°ååéï¼ç¨äºææ§pythonçè¿è¡æ¶ç¯å¢ã
osä¸sys模åç宿¹è§£éå¦ä¸ï¼
os: This module provides a portable way of using operating system dependent functionality.
è¿ä¸ªæ¨¡åæä¾äºä¸ç§æ¹ä¾¿çä½¿ç¨æä½ç³»ç»å½æ°çæ¹æ³ã
sys: This module provides access to some variables used or maintained by the interpreter and to
functions that interact strongly with the interpreter.
è¿ä¸ªæ¨¡åå¯ä¾è®¿é®ç±è§£éå¨ä½¿ç¨æç»´æ¤çåéåä¸è§£éå¨è¿è¡äº¤äºç彿°ã
os å¸¸ç¨æ¹æ³
os.remove() å 餿件
os.rename() éå½åæä»¶
os.walk() çæç®å½æ ä¸çæææä»¶å
os.chdir() æ¹åç®å½
os.mkdir/makedirs å建ç®å½/å¤å±ç®å½
os.rmdir/removedirs å é¤ç®å½/å¤å±ç®å½
os.listdir() ååºæå®ç®å½çæä»¶
os.getcwd() åå¾å½åå·¥ä½ç®å½
os.chmod() æ¹åç®å½æé
os.path.basename() 廿ç®å½è·¯å¾ï¼è¿åæä»¶å
os.path.dirname() 廿æä»¶åï¼è¿åç®å½è·¯å¾
os.path.join() å°å离çåé¨åç»åæä¸ä¸ªè·¯å¾å
os.path.split() è¿å( dirname(), basename())å
ç»
os.path.splitext() è¿å (filename, extension) å
ç»
os.path.getatime\ctime\mtime åå«è¿åæè¿è®¿é®ãå建ãä¿®æ¹æ¶é´
os.path.getsize() è¿åæä»¶å¤§å°
os.path.exists() æ¯å¦åå¨
os.path.isabs() æ¯å¦ä¸ºç»å¯¹è·¯å¾
os.path.isdir() æ¯å¦ä¸ºç®å½
os.path.isfile() æ¯å¦ä¸ºæä»¶
sys å¸¸ç¨æ¹æ³
sys.argv å½ä»¤è¡åæ°Listï¼ç¬¬ä¸ä¸ªå
ç´ æ¯ç¨åºæ¬èº«è·¯å¾
sys.modules.keys() è¿åææå·²ç»å¯¼å
¥ç模åå表
sys.exc_info() è·åå½åæ£å¨å¤ççå¼å¸¸ç±»,exc_typeãexc_valueãexc_tracebackå½åå¤ççå¼å¸¸è¯¦ç»ä¿¡æ¯
sys.exit(n) éåºç¨åºï¼æ£å¸¸éåºæ¶exit(0)
sys.hexversion è·åPythonè§£éç¨åºççæ¬å¼ï¼16è¿å¶æ ¼å¼å¦ï¼0x020403F0
sys.version è·åPythonè§£éç¨åºççæ¬ä¿¡æ¯
sys.maxint æå¤§çIntå¼
sys.maxunicode æå¤§çUnicodeå¼
sys.modules è¿åç³»ç»å¯¼å
¥ç模ååæ®µï¼keyæ¯æ¨¡ååï¼valueæ¯æ¨¡å
sys.path è¿å模åçæç´¢è·¯å¾ï¼åå§åæ¶ä½¿ç¨PYTHONPATHç¯å¢åéçå¼
sys.platform è¿åæä½ç³»ç»å¹³å°åç§°
sys.stdout æ åè¾åº
sys.stdin æ åè¾å
¥
sys.stderr é误è¾åº
sys.exc_clear() ç¨æ¥æ¸
é¤å½åçº¿ç¨æåºç°çå½åçææè¿çé误信æ¯
sys.exec_prefix è¿åå¹³å°ç¬ç«çpythonæä»¶å®è£
çä½ç½®
sys.byteorder æ¬å°åèè§åçæç¤ºå¨ï¼big-endianå¹³å°ç弿¯'big',little-endianå¹³å°ç弿¯'little'
sys.copyright è®°å½pythonçæç¸å
³çä¸è¥¿
sys.api_version è§£éå¨çCçAPIçæ¬
æ»ç»ï¼
os模åè´è´£ç¨åºä¸æä½ç³»ç»ç交äºï¼æä¾äºè®¿é®æä½ç³»ç»åºå±çæ¥å£;
sys模åè´è´£ç¨åºä¸pythonè§£éå¨ç交äºï¼æä¾äºä¸ç³»åç彿°ååéï¼ç¨äºææ§pythonçè¿è¡æ¶ç¯å¢ã
55. å¦ä½çæä¸ä¸ªéæºæ°ï¼
import random
print(random.random()) # ç¨äºçæä¸ä¸ª0å°1çéæºç¬¦ç¹æ°: 0 <= n < 1.0
print(random.randint(1, 1000)) # ç¨äºçæä¸ä¸ªæå®èå´å
çæ´æ°
56. å¦ä½ä½¿ç¨pythonå é¤ä¸ä¸ªæä»¶ï¼
import os
file = r'D:\test.txt'
if os.path.exists(file):
os.remove(file)
print('delete success')
else:
print('no such file:%s' % file)
57. è°è°ä½ 对é¢å对象ççè§£
ä¸å¤§ç¹æ§ä»¥åè§£éï¼
é¢å¯¹å¯¹è±¡æ¯ä¸ç§ç¼ç¨ææ³ï¼ä»¥ç±»çç¼å æ¥æ¥çå¾ äºç©çä¸ç§æ¹å¼ãå°æå ±åç屿§åæ¹æ³çäºç©å°è£ å°åä¸ä¸ªç±»ä¸é¢ã
ç»§æ¿ï¼å°å¤ä¸ªç±»çå ±å屿§åæ¹æ³å°è£ å°ä¸ä¸ªç¶ç±»ä¸é¢ï¼ç¶åå¨ç¨è¿äºç±»æ¥ç»§æ¿è¿ä¸ªç±»ç屿§åæ¹æ³
å°è£ ï¼å°æå ±åç屿§åæ¹æ³å°è£ å°åä¸ä¸ªç±»ä¸é¢
- 第ä¸å±é¢ï¼å建类å对象ä¼åå«å建äºè çå称空é´ï¼æä»¬åªè½ç¨ç±»å.æè obj.çæ¹å¼å»è®¿é®éé¢çååï¼è¿æ¬èº«å°±æ¯ä¸ç§å°è£
- 第äºå±é¢ï¼ç±»ä¸ææäºå±æ§åæ¹æ³éèèµ·æ¥(æè 说å®ä¹æç§æç)ï¼åªå¨ç±»çå é¨ä½¿ç¨ãå¤é¨æ æ³è®¿é®ï¼æè çä¸å°éæ¥å£ï¼å½æ°ï¼ä¾å¤é¨è®¿é®ã
夿ï¼Pythonå¤©çæ¯æ¯æå¤æçãæçæ¯åºç±»çåä¸ä¸ªæ¹æ³å¨ä¸åçæ´¾çç±»ä¸æçä¸åçåè½
58. Pythoné¢å对象ä¸çç»§æ¿æä»ä¹ç¹ç¹
ç»§æ¿æ¦å¿µçå®ç°æ¹å¼ä¸»è¦æ2ç±»ï¼å®ç°ç»§æ¿ãæ¥å£ç»§æ¿ãå®ç°ç»§æ¿æ¯æä½¿ç¨åºç±»ç屿§åæ¹æ³èæ éé¢å¤ç¼ç çè½åï¼ æ¥å£ç»§æ¿æ¯æä» 使ç¨å±æ§åæ¹æ³çåç§°ã使¯åç±»å¿ é¡»æä¾å®ç°çè½å(åç±»éæç¹ç±»æ¹æ³)ï¼
python 两ç§ç±»ï¼ç»å
¸ç±» æ°å¼ç±»
python3 æ°å¼ç±» ââ é½é»è®¤ç»§æ¿object class Animal(object): == class Animal:
python2 ç»å
¸ç±»åæ°å¼ç±» å¹¶å
class Animal: ç»å
¸ç±» ââ ç»§æ¿é¡ºåº 个å«ä½¿ç¨æ¹æ³
class Animal(object): æ°å¼ç±»
ç»§æ¿å为åç»§æ¿åå¤ç»§æ¿
Pythonæ¯æ¯æå¤ç»§æ¿ç
å¦ææ²¡ææå®åºç±»ï¼pythonçç±»ä¼é»è®¤ç»§æ¿objectç±»ï¼objectæ¯ææpythonç±»çåºç±»ï¼å®æä¾äºä¸äºå¸¸è§æ¹æ³ï¼å¦__str__ï¼çå®ç°ã
è¡¥å ç»§æ¿çåºç¨ï¼é¢è¯é¢ï¼
1ã对象å¯ä»¥è°ç¨èªå·±æ¬ç±»åç¶ç±»çæææ¹æ³å屿§ï¼ å
è°ç¨èªå·±ç èªå·±æ²¡ææè°ç¶ç±»çãè°ï¼å¯¹è±¡ï¼è°ç¨æ¹æ³ï¼æ¹æ³ä¸çselfå°±æåè°
class Foo:
def init(self):
self.func()
def<span> func(self):
print('Foo.func'<span>)
class Son(Foo):
def func(self):
print(âSon.funcâ)
s = Son()
Son.func
========================================================
class A:
def get(self):
self.say()
def<span> say(self):
print('AAAAA'<span>)
class B(A):
def say(self):
print(âBBBBBâ)
b = B()
b.get() #è¾åºç»æä¸ºï¼BBBBB
59. é¢å对象深度ä¼å å广度ä¼å æ¯ä»ä¹ï¼
Pythonçç±»å¯ä»¥ç»§æ¿å¤ä¸ªç±»ï¼Pythonçç±»å¦æç»§æ¿äºå¤ä¸ªç±»ï¼é£ä¹å
¶å¯»æ¾æ¹æ³çæ¹å¼æä¸¤ç§
å½ç±»æ¯ç»å
¸ç±»æ¶ï¼å¤ç»§æ¿æ
åµä¸ï¼ä¼æç
§æ·±åº¦ä¼å
æ¹å¼æ¥æ¾ py3
å½ç±»æ¯æ°å¼ç±»æ¶ï¼å¤ç»§æ¿æ
åµä¸ï¼ä¼æç
§å¹¿åº¦ä¼å
æ¹å¼æ¥æ¾ py2
ç®åç¹è¯´å°±æ¯ï¼ç»å
¸ç±»æ¯çºµåæ¥æ¾ï¼æ°å¼ç±»æ¯æ¨ªåæ¥æ¾
ç»å
¸ç±»åæ°å¼ç±»çåºå«å°±æ¯ï¼å¨å£°æç±»çæ¶åï¼æ°å¼ç±»éè¦å ä¸objectå
³é®åãå¨python3ä¸é»è®¤å
¨æ¯æ°å¼ç±»
60. é¢å对象ä¸superçä½ç¨ï¼
ç¨äºå类继æ¿åºç±»çæ¹æ³
class FooParent(object): def __init__(self): self.parent = 'I\'m the parent.' print('Parent') print('1111')def<span> bar(self, message): print("%s from Parent" %<span> message)
class FooChild(FooParent):
def init(self):
# super(FooChild,self) é¦å
æ¾å° FooChild çç¶ç±»ï¼å°±æ¯ç±» FooParentï¼ï¼ç¶åæç±»Bç对象 FooChild 转æ¢ä¸ºç±» FooParent ç对象
super(FooChild, self).init()
print(âChildâ)
# def bar(self, message):
# # super(FooChild, self).bar(message)
# print('Child bar fuction')
# print(self.parent)
if name == âmainâ:
fooChild = FooChild()
fooChild.bar(âHelloWorldâ)
61. æ¯å¦ä½¿ç¨è¿functoolsä¸ç彿°ï¼å ¶ä½ç¨æ¯ä»ä¹ï¼
ç¨äºä¿®å¤è£ 饰å¨
import functools
def deco(func):
@functools.wraps(func) # å 卿å
å±å½æ°æ£ä¸æ¹
def wrapper(*args, **kwargs):
return func(*args, **kwargs)
return<span> wrapper
@deco
def index():
âââååååâââ
x = 10
print(âfrom indexâ)
print(index.name)
print(index.doc)
å @functools.wraps
index
åååå
ä¸å @functools.wraps
wrapper
None
62. å举é¢å对象ä¸å¸¦åä¸å线çç¹æ®æ¹æ³ï¼å¦ï¼__new__ã__init__
- __new__ï¼çæå®ä¾
- __init__ï¼çæå®ä¾ç屿§
-
__call__ï¼å®ä¾å¯¹è±¡å ( )伿§è¡def __call__:... æ¹æ³éè¾¹çå 容ã
__del__ï¼æææ¹æ³ï¼å½å¯¹è±¡å¨å åä¸è¢«éæ¾æ¶ï¼èªå¨è§¦åæ§è¡ãå¦å½ del obj æè åºç¨ç¨åºè¿è¡å®æ¯æ¶ï¼æ§è¡è¯¥æ¹æ³éè¾¹çå 容ã
__enter__å__exit__ï¼åºç°withè¯å¥,对象ç__enter__被触å,æè¿åå¼åèµå¼ç»as声æçåéï¼withä¸ä»£ç åæ§è¡å®æ¯æ¶æ§è¡__exit__éè¾¹çå 容ã
__module__ï¼è¡¨ç¤ºå½åæä½ç对象å¨é£ä¸ªæ¨¡å obj.__module__
__class__ ï¼è¡¨ç¤ºå½åæä½ç对象çç±»æ¯ä»ä¹ obj.__class____doc__ï¼ç±»çæè¿°ä¿¡æ¯ï¼è¯¥æè¿°ä¿¡æ¯æ æ³è¢«ç»§æ¿
__str__ï¼æ¹å对象çå符串æ¾ç¤º print彿° --->obj.__str__()
__repr__ï¼æ¹å对象çå符串æ¾ç¤º 交äºå¼è§£éå¨ --->obj.__repr__()
__format__ï¼èªå®å¶æ ¼å¼åå符串__slots__:ä¸ä¸ªç±»åé ç¨æ¥éå¶å®ä¾å¯ä»¥æ·»å ç屿§çæ°éåç±»å
__setitem__,__getitem,__delitem__:
class Foo: def __init__(self,name): self.name=namedef __getitem__(self, item): print(self.__dict__[item]) def __setitem__(self, key, value): self.__dict__[key]=<span>value def __delitem__(self, key): print('del obj[key]æ¶,ææ§è¡'<span>) self.__dict__.pop(key) def __delattr__(self, item): print('del obj.keyæ¶,ææ§è¡'<span>) self.__dict__.pop(item)
f1=Foo(âsbâ)
f1[âageâ]=18
f1[âage1â]=19
del f1.age1
del f1[âageâ]
f1[ânameâ]=âalexâ
print(f1.dict)
__get__():è°ç¨ä¸ä¸ªå±æ§æ¶,触å
__set__():为ä¸ä¸ªå±æ§èµå¼æ¶,触å
__delete__():éç¨delå é¤å±æ§æ¶,触å
__setattr__,__delattr__,__getattr__ :
63. å¦ä½å¤ææ¯å½æ°è¿æ¯æ¹æ³ï¼
çä»çè°ç¨è æ¯è°ï¼å¦ææ¯ç±»ï¼å°±éè¦ä¼ å ¥ä¸ä¸ªåæ°selfçå¼ï¼è¿æ¶ä»å°±æ¯ä¸ä¸ªå½æ°ï¼
妿è°ç¨è æ¯å¯¹è±¡ï¼å°±ä¸éè¦ç»selfä¼ å ¥åæ°å¼ï¼è¿æ¶ä»å°±æ¯ä¸ä¸ªæ¹æ³
print(isinstance(obj.func, FunctionType)) # False
print(isinstance(obj.func, MethodType)) # True
class Foo(object): def __init__(self): self.name = 'lcg'def func(self): print(self.name)
obj = Foo()
print(obj.func) # <bound method Foo.func of <main.Foo object at 0x000001ABC0F15F98>>
print(Foo.func) # <function Foo.func at 0x000001ABC1F45BF8>
------------------------FunctionType, MethodType------------#
from types import FunctionType, MethodType
obj = Foo()
print(isinstance(obj.func, FunctionType)) # False
print(isinstance(obj.func, MethodType)) # True
print(isinstance(Foo.func, FunctionType)) # True
print(isinstance(Foo.func, MethodType)) # False
------------------------------------------------------------#
obj = Foo()
Foo.func(obj) # lcg
obj = Foo()
obj.func() # lcg
ââ"
注æï¼
æ¹æ³ï¼æ éä¼ å
¥selfåæ°
彿°ï¼å¿
é¡»æå¨ä¼ å
¥selfåæ°
ââ"
64. éææ¹æ³åç±»æ¹æ³åºå«ï¼
尽管 classmethod å staticmethod é常ç¸ä¼¼ï¼ä½å¨ç¨æ³ä¸ä¾ç¶æä¸äºææ¾çåºå«ãclassmethod å¿ é¡»æä¸ä¸ªæå类对象çå¼ç¨ä½ä¸ºç¬¬ä¸ä¸ªåæ°ï¼è staticmethod å¯ä»¥æ²¡æä»»ä½åæ°ã
举个æ å:
class Num: # æ®éæ¹æ³ï¼è½ç¨Numè°ç¨èä¸è½ç¨å®ä¾å对象è°ç¨ def one(): print ('1')# å®ä¾æ¹æ³ï¼è½ç¨å®ä¾å对象è°ç¨èä¸è½ç¨Numè°ç¨ def two(self): print ('2'<span>) # éææ¹æ³ï¼è½ç¨Numåå®ä¾å对象è°ç¨ @staticmethod def three(): print ('3'<span>) # ç±»æ¹æ³ï¼ç¬¬ä¸ä¸ªåæ°clsé¿ä»ä¹æ ·ä¸éè¦ï¼é½æ¯æNumç±»æ¬èº«ï¼è°ç¨æ¶å°Numç±»ä½ä¸ºå¯¹è±¡éå¼å°ä¼ å ¥æ¹æ³ @classmethod def go(cls): cls.three()
Num.one() #1
#Num.two() #TypeError: two() missing 1 required positional argument: âselfâ
Num.three() #3
Num.go() #3
i=Num()
#i.one() #TypeError: one() takes 0 positional arguments but 1 was given
i.two() #2
i.three() #3
i.go() #3
65. å举é¢å对象ä¸çç¹æ®æå以ååºç¨åºæ¯
__call__
new
init
doc
class
del
dict
str
å¨falskæºç ç¨å°â¦
66. 1ã2ã3ã4ã5 è½ç»æå¤å°ä¸ªäºä¸ç¸å䏿 éå¤çä¸ä½æ°
60个
颿çè§£ï¼ç»æåçæ°å¼ä¸ç¸åï¼ä¸ç»åçä¸ä¸ªä½æ°ä¹é´æ°åä¸éå¤ã
使ç¨pythonå ç½®çæåç»å彿°ï¼ä¸æ¾åæ½æ ·æåï¼
product ç¬å¡å°ç§¯ããï¼ææ¾åæ½æ ·æåï¼
permutations æåããï¼ä¸æ¾åæ½æ ·æåï¼
combinations ç»å,没æéå¤ããï¼ä¸æ¾åæ½æ ·ç»åï¼
combinations_with_replacement ç»å,æéå¤ããï¼ææ¾åæ½æ ·ç»åï¼
import itertools
print(len(list(itertools.permutations(â12345â, 3)))) # 60
67. ä»ä¹æ¯åå°ï¼ä»¥ååºâ½¤ç¨åºæ¯ï¼
åå°çæ ¸å¿æ¬è´¨å°±æ¯ä»¥å符串çå½¢å¼å»å¯¼å
¥ä¸ªæ¨¡åï¼å©ç¨å符串çå½¢å¼å»æ§è¡å½æ°ã
Djangoä¸ç CBVå°±æ¯åºäºåå°å®ç°çã
68. metaclassä½ç¨ï¼ä»¥ååºç¨åºæ¯ï¼
metaclassç¨æ¥æå®ç±»æ¯ç±è°å建çã
ç±»çmetaclass é»è®¤æ¯typeãæä»¬ä¹å¯ä»¥æå®ç±»çmetaclasså¼ãå¨python3ä¸ï¼
class MyType(type):
def __call__(self, *args, **kwargs):
return 'MyType'
class Foo(object, metaclass=MyType):
def init(self):
return âinitâ
def __new__(cls, *args, **<span>kwargs):
return<span> cls.__init__(cls)
def __call__(self, *args, **<span>kwargs):
return 'call'<span>
obj = Foo()
print(obj) # MyType
69. ç¨å°½éå¤çæ¹æ³å®ç°å便¨¡å¼ã
1ï¼ä½¿ç¨æ¨¡å
Pythonçæ¨¡åå°±æ¯å¤©ç¶çå便¨¡å¼ã
å 为模åå¨ç¬¬ä¸æ¬¡å¯¼å
¥æ¶ï¼ä¼çæ .pyc æä»¶ï¼å½ç¬¬äºæ¬¡å¯¼å
¥æ¶ï¼å°±ä¼ç´æ¥å è½½ .pyc æä»¶ï¼èä¸ä¼å次æ§è¡æ¨¡å代ç ã
å æ¤ï¼æä»¬åªéæç¸å
³ç彿°åæ°æ®å®ä¹å¨ä¸ä¸ªæ¨¡åä¸ï¼å°±å¯ä»¥è·å¾ä¸ä¸ªåä¾å¯¹è±¡äºã
ä¾å¦ï¼
class V1(object):
def foo(self)
pass
V1 = V1()
å°ä¸é¢ä»£ç ä¿å卿件test.py,è¦ä½¿ç¨æ¶ï¼ç´æ¥å¨å
¶ä»æä»¶ä¸å¯¼å
¥æ¤æä»¶ä¸ç对象ï¼è¿ä¸ªå¯¹è±¡æ¢æ¯å便¨¡å¼ç对象
å¦ï¼from a import V1
2ï¼ä½¿ç¨è£
饰å¨
def Singleton(cls):
_instance = {}
def _singleton(*args, **kargs):
if cls not in _instance:
_instance[cls] = cls(*args, **kargs)
return _instance[cls]
return _singleton
@Singleton
class A(object):
a = 1
def init(self, x=0):
self.x = x
a1 = A(2)
a2 = A(3)
3ï¼ä½¿ç¨ç±»
4ï¼åºäº__new__æ¹æ³å®ç°
彿们å®ä¾åä¸ä¸ªå¯¹è±¡æ¶ï¼æ¯å
æ§è¡äºç±»ç__new__æ¹æ³
å½ï¼ï¼æä»¬æ²¡åæ¶ï¼é»è®¤è°ç¨object.newï¼ï¼å®ä¾å对象ï¼ç¶ååæ§è¡ç±»ç__init__æ¹æ³ï¼å¯¹è¿ä¸ªå¯¹è±¡è¿è¡åå§åï¼æææä»¬å¯ä»¥åºäºè¿ä¸ªï¼å®ç°å便¨¡å¼
70. è£ é¥°å¨ï¨¸ç忳以ååºç¨åºæ¯ã
å«ä¹ï¼è£ 饰卿¬è´¨å°±æ¯å½æ°ï¼ä¸ºå ¶ä»å½æ°æ·»å éå åè½
ååï¼
ä¸ä¿®æ¹è¢«ä¿®é¥°å½æ°ç代ç
ä¸ä¿®æ¹è¢«ä¿®é¥°å½æ°çè°ç¨æ¹å¼
åºç¨åºæ¯ï¼
æ åè£ é¥°å¨å¨ç¨æ·ç»å½ 认è¯ä¸å¸¸è§
æåè£ é¥°å¨å¨flaskçè·¯ç±ç³»ç»ä¸è§å°è¿
import functools
def wrapper(func):
@functools.wraps(func)
def inner(*args, **kwargs):
print('ææ¯è£
饰å¨')
return func
return inner
@wrapper
def index():
print(âææ¯è¢«è£
饰彿°â)
return None
index()
åºç¨åºæ¯
-<span> é«é¶å½æ°
-<span> éå
-<span> è£
饰å¨
- functools.wraps(func)</span></span></span></span></span></span></span></span></span></span></span></span></pre>
71. å¼å¸¸å¤ç忳以åå¦ä½ä¸»å¨è·åºå¼å¸¸ï¼åºç¨åºæ¯ï¼
# 触åå¼å¸¸
def temp_convert(var):
try:
return int(var)
except ValueError as Argument:
print ("åæ°æ²¡æå
嫿°å%s"%Argument)
è°ç¨å½æ°
temp_convert(âxyzâ)
以10ä¸ºåºæ°çint()çæ ææå:âxyzâ
----------------------------------------------------------------------------
raiseè¯æ³
#raise [Exception [, args [, traceback]]]
è¯å¥ä¸ Exception æ¯å¼å¸¸çç±»åï¼args æ¯èªå·²æä¾çå¼å¸¸åæ°ã
class Networkerror(RuntimeError):
def init(self, arg):
self.args = arg
try:
raise Networkerror(âBad hostnameâ)
except Networkerror as e:
print(e.args)
72ãä»ä¹æ¯é¢å对象çmro
mroå°±æ¯æ¹æ³è§£æé¡ºåº
73. isinstanceä½ç¨ä»¥ååºç¨åºæ¯ï¼
isinstance(对象ï¼ç±») 夿è¿ä¸ªå¯¹è±¡æ¯ä¸æ¯è¿ä¸ªç±»æè è¿ä¸ªç±»çåç±»çå®ä¾å
# # 夿a å±ä¸å±äºAè¿ä¸ªç±»ï¼å¯ä»¥å¤æå°ç¥å®ç±»ï¼
class A:
pass
class B(A):
pass
a = A()
b = B()
print(isinstance(b,A)) # ===> True 夿å°ç¥å®ç±»
ä»»ä½ä¸object齿¯True,å é¨é½ç»§æ¿object
class A:pass
a = A() # å®ä¾å
print(isinstance(a,object)) # True
åºç¨åºæ¯ï¼rest framework 认è¯çæµç¨
74. å代ç å¹¶å®ç°
Given an array of integers, return indices of the two numbers such that they add up to a
specific target.You may assume that each input would have exactly one solution, and you may
not use the same element twice.
Example:
Given nums = [2, 7, 11, 15], target = 9,
Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1]
75. jsonåºååæ¶ï¼å¯ä»¥å¤ççæ°æ®ç±»åæåªäºï¼å¦ä½å®å¶æ¯ædatetimeç±»åï¼
76. jsonåºååæ¶ï¼é»è®¤éå°ä¸æä¼è½¬æ¢æunicodeï¼å¦ææ³è¦ä¿ç䏿æä¹åï¼
å¨åºååæ¶ï¼ä¸ææ±åæ»æ¯è¢«è½¬æ¢ä¸ºunicodeç ï¼å¨dumps彿°ä¸æ·»å åæ°ensure_ascii=Falseå³å¯è§£å³ã
77. ä»ä¹æ¯æè¨ï¼åºç¨åºæ¯ï¼
assert æ¯çä½ç¨ï¼æè¨
æ¡ä»¶æç«ï¼å¸å°å¼ä¸ºTrueï¼åç»§ç»å¾ä¸ï¼å¦åè·åºå¼å¸¸ï¼ä¸è¬ç¨äºï¼æ»¡è¶³æä¸ªæ¡ä»¶ä¹åï¼æè½æ§è¡ï¼å¦ååºè¯¥è·åºå¼å¸¸ã
åAPIçæ¶åï¼ç»§æ¿GenericAPIView
class GenericAPIView(views.APIView):
ââ"
Base class for all other generic views.
ââ"
# Youâll need to either set these attributes,
# or override get_queryset()
/get_serializer_class()
.
# If you are overriding a view method, it is important that you call
# get_queryset()
instead of accessing the queryset
property directly,
# as queryset
will get evaluated only once, and those results are cached
# for all subsequent requests.
queryset = None
serializer_class = None
# If you want to use object lookups other than pk, set 'lookup_field'.
# For more complex lookup requirements override `get_object()`.
lookup_field = 'pk'<span>
lookup_url_kwarg =<span> None
# The filter backend classes to use for queryset filtering
filter_backends =<span> api_settings.DEFAULT_FILTER_BACKENDS
# The style to use for queryset pagination.
pagination_class =<span> api_settings.DEFAULT_PAGINATION_CLASS
def<span> get_queryset(self):
assert self.queryset is not<span> None, (
"'%s' should either include a `queryset` attribute, "
"or override the `get_queryset()` method."
% self.__class__.__name__<span>
)
queryset =<span> self.queryset
if<span> isinstance(queryset, QuerySet):
# Ensure queryset is re-evaluated on each request.
queryset =<span> queryset.all()
return queryset</span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
78. æç¨è¿with statementåï¼å®ç好夿¯ä»ä¹ï¼
79. 使ç¨ä»£ç å®ç°æ¥çå举ç®å½ä¸çæææä»¶ã
80. ç®è¿° yieldåyield fromå
³é®å
第äºé¨å ç½ç»ç¼ç¨åå¹¶å
81. ç®è¿° OSI ä¸å±åè®®ã
ç©çå±ï¼ä¸»è¦æ¯åºäºçµå¨ç¹æ§åéé«ä½çµåï¼çµä¿¡å·ï¼ï¼é«çµåå¯¹åºæ°å1ï¼ä½çµåå¯¹åºæ°å0
æ°æ®é¾è·¯å±ï¼å®ä¹äºçµä¿¡å·çåç»æ¹å¼
ç½è·¯å±ï¼å¼å ¥ä¸å¥æ°çå°åç¨æ¥åºåä¸åç广æå/åç½ï¼è¿å¥å°åå³ç½ç»å°å
ä¼ è¾å±ï¼å»ºç«ç«¯å£å°ç«¯å£çéä¿¡
ä¼è¯å±ï¼å»ºç«å®¢æ·ç«¯ä¸æå¡ç«¯è¿æ¥
表示å±ï¼å¯¹æ¥èªåºç¨å±çå½ä»¤åæ°æ®è¿è¡è§£éï¼æç
§ä¸å®æ ¼å¼ä¼ ç»ä¼è¯å±ãå¦ç¼ç ãæ°æ®æ ¼å¼è½¬æ¢ãå å¯è§£å¯ãå缩解å
åºç¨å±ï¼è§å®åºç¨ç¨åºçæ°æ®æ ¼å¼
82. ä»ä¹æ¯C/SåB/Sæ¶æï¼
c/sæ¶æï¼å°±æ¯clientï¼å®¢æ·ç«¯ï¼ä¸serverï¼æå¡ç«¯ï¼å³ï¼å®¢æ·ç«¯ä¸æå¡ç«¯çæ¶æã
b/sæ¶æï¼å°±æ¯brosverï¼æµè§å¨ç«¯ï¼ä¸severï¼æå¡ç«¯ï¼å³ï¼æµè§å¨ç«¯ä¸æå¡ç«¯æ¶æ
ä¼ç¹ï¼ç»ä¸äºææåºç¨ç¨åºçå ¥å£ãæ¹ä¾¿ãè½»é级
83. ç®è¿° 䏿¬¡æ¡æã忬¡æ¥æçæµç¨ã
䏿¬¡æ¡æï¼
ç¬¬ä¸æ¬¡æ¡æ
1ï¼å®¢æ·ç«¯å
åæå¡ç«¯åèµ·ä¸æ¬¡è¯¢é®å»ºç«è¿æ¥ç请æ±ï¼å¹¶éæºçæä¸ä¸ªå¼ä½ä¸ºæ è¯
ç¬¬äºæ¬¡æ¡æ
2ï¼æå¡ç«¯å客æ·ç«¯å
ååºç¬¬ä¸ä¸ªæ è¯ï¼åéæ°åä¸ä¸ªç¡®è®¤æ è¯
ç¬¬ä¸æ¬¡æ¡æ
3ï¼å®¢æ·ç«¯ç¡®è®¤æ è¯ï¼å»ºç«è¿æ¥ï¼å¼å§ä¼ è¾æ°æ®
忬¡æ¥æ ---> æå¼è¿æ¥
ç¬¬ä¸æ¬¡æ¥æ
客æ·ç«¯åæå¡ç«¯åèµ·è¯·æ±æå¼è¿æ¥ç请æ±
ç¬¬äºæ¬¡æ¥æ
æå¡ç«¯å客æ·ç«¯ç¡®è®¤è¯·æ±
ç¬¬ä¸æ¬¡æ¥æ
æå¡ç«¯å客æ·ç«¯åèµ·æå¼è¿æ¥è¯·æ±
ç¬¬åæ¬¡æ¥æ
客æ·ç«¯åæå¡ç«¯ç¡®è®¤æå¼è¯·æ±
84. TCPåUDPçåºå«ï¼
TCP/UDPåºå«
TCPåè®®æ¯é¢åè¿æ¥ï¼ä¿è¯é«å¯é æ§ä¼ è¾å±åè®®
UDPï¼æ°æ®ä¸¢å¤±ï¼æ ç§©åºçä¼ è¾å±åè®®ï¼qqåºäºudpåè®®ï¼
85. 为ä½åºäºtcpåè®®çéä¿¡æ¯åºäºudpåè®®çéä¿¡æ´å¯é ï¼
tcpï¼å¯é ï¼å 为åªè¦å¯¹æ¹åäºç¡®è®¤æ¶å°ä¿¡æ¯ï¼æåä¸ä¸ä¸ªï¼å¦ææ²¡æ¶å°ç¡®è®¤ä¿¡æ¯å°±éå
UDPï¼ä¸å¯é ï¼å®æ¯ä¸ç´åæ°æ®ï¼ä¸éè¦å¯¹æ¹ååº
æµå¼åè®®ï¼ TCPåè®®ï¼å¯é ä¼ è¾
æ°æ®æ¥åè®®: UDPåè®®ï¼ä¸å¯ä¼ è¾
86. ä»ä¹æ¯socketï¼ç®è¿°åºäºtcpåè®®ç奿¥åéä¿¡æµç¨ã
Socketæ¯åºç¨å±ä¸TCP/IPåè®®æéä¿¡çä¸é´è½¯ä»¶æ½è±¡å±ï¼å®æ¯ä¸ç»æ¥å£ã
å¨è®¾è®¡æ¨¡å¼ä¸ï¼Socketå ¶å®å°±æ¯ä¸ä¸ªé¨é¢æ¨¡å¼ï¼å®æå¤æçTCP/IPåè®®æéèå¨Socketæ¥å£åé¢ï¼
å¯¹ç¨æ·æ¥è¯´ï¼ä¸ç»ç®åçæ¥å£å°±æ¯å ¨é¨ã
æå¡ç«¯ï¼
å建socket对象ï¼
ç»å®ip端å£bind(),
设置æå¤§é¾æ¥æ°listen(),
accept()ä¸å®¢æ·ç«¯çconnect()å建åå管éï¼çå°èæ¥ï¼
send(), recv(), æ¶åæ°æ®
close()
客æ·ç«¯ï¼
å建socket对象ï¼
connect()䏿å¡ç«¯accept()å建åå管é ,
send(),
recv(),
close()
87. ä»ä¹æ¯ç²å ï¼ socket ä¸é æç²å çåå æ¯ä»ï§½ä¹ï¼ åªäºæ åµä¼åçç²å ç°è±¡ï¼
åªæTCPæç²å
ç°è±¡ï¼UDPæ°¸è¿ä¸ä¼ç²å
ç²å
ï¼å¨è·åæ°æ®æ¶,åºç°æ°æ®çå
容䏿¯æ¬åºè¯¥æ¥æ¶çæ°æ®,å¦:对æ¹ç¬¬ä¸æ¬¡åéhello,ç¬¬äºæ¬¡åéworld,
ããææ¹æ¥æ¶æ¶,åºè¯¥æ¶ä¸¤æ¬¡,䏿¬¡æ¯hello,䏿¬¡æ¯world,ä½äºå®ä¸æ¯ä¸æ¬¡æ¶å°helloworld,䏿¬¡æ¶å°ç©º,è¿ç§ç°è±¡å«ç²å
åå
ç²å
é®é¢ä¸»è¦è¿æ¯å ä¸ºæ¥æ¶æ¹ä¸ç¥éæ¶æ¯ä¹é´ççéï¼ä¸ç¥é䏿¬¡æ§æåå¤å°åèçæ°æ®æé æçã
ä»ä¹æ
åµä¼åçï¼
1ãåé端éè¦çç¼å²åºæ»¡æåéåºå»ï¼é æç²å
ï¼åéæ°æ®æ¶é´é´éå¾çï¼æ°æ®äºå¾å°ï¼ä¼åå°ä¸èµ·ï¼äº§çç²å
ï¼
2ãæ¥æ¶æ¹ä¸åæ¶æ¥æ¶ç¼å²åºçå
ï¼é æå¤ä¸ªå
æ¥æ¶ï¼å®¢æ·ç«¯åéäºä¸æ®µæ°æ®ï¼æå¡ç«¯åªæ¶äºä¸å°é¨åï¼
æå¡ç«¯ä¸æ¬¡åæ¶çæ¶åè¿æ¯ä»ç¼å²åºæ¿ä¸æ¬¡éççæ°æ®ï¼äº§çç²å
ï¼
88. IOå¤è·¯å¤çä½ç¨ï¼
socketserverï¼å¤ä¸ªå®¢æ·ç«¯è¿æ¥ï¼å线ç¨ä¸å®ç°å¹¶åææï¼å°±å«å¤è·¯å¤ç¨ã
ä¸å¤è¿ç¨åå¤çº¿ç¨ææ¯ç¸æ¯ï¼I/Oå¤è·¯å¤ç¨ææ¯çæå¤§ä¼å¿æ¯ç³»ç»å¼éå°ï¼ç³»ç»ä¸å¿ å建è¿ç¨/线ç¨ï¼ä¹ä¸å¿ ç»´æ¤è¿äºè¿ç¨/线ç¨ï¼ä»è大大åå°äºç³»ç»çå¼éã
89.selectãpollãepoll 模åçåºå«ï¼ï¼å±äºå¤è·¯å¤ç¨IOçæ¨¡åï¼
齿¯i/oå¤è·¯å¤ç¨çæºå¶ï¼çè§å¤ä¸ªsocketæ¯å¦åçååï¼æ¬è´¨ä¸é½æ¯åæ¥i/o
select,pollå®ç°éè¦èªå·±ä¸æè½®è¯¢ææçæµå¯¹è±¡ï¼ç´å°å¯¹è±¡åçååï¼å¨è¿ä¸ªé¶æ®µä¸ï¼
å¯è½è¦ç¡ç åå¤é夿¬¡äº¤æ¿ï¼èepollä¹éè¦è°ç¨epoll_waitä¸æè½®è¯¢å°±ç»ªé¾è¡¨ï¼ä½æ¯å½å¯¹è±¡åçååæ¶ï¼
ä¼è°ç¨åè°å½æ°ï¼å°ååç对象æ¾å
¥å°±ç»ªé¾æ¥è¡¨ä¸ï¼å¹¶å¤éå¨epoll_waitä¸è¿å
¥ç¡ç çè¿ç¨ã
è½ç¶é½ä¼ç¡ç åå¤éï¼ä½æ¯selectåpollå¨è¢«å¤éçæ¶åè¦éåæ´ä¸ªçæµå¯¹è±¡éåï¼
èepollåªè¦å¤æå°±ç»ªé¾è¡¨æ¯å¦ä¸ºç©ºå³å¯ï¼èçäºå¤§écpuçæ¶é´
selectãpollãepoll齿¯IOå¤è·¯å¤ç¨çæºå¶ï¼ä½selectï¼pollï¼epollæ¬è´¨ä¸é½æ¯åæ¥I/Oï¼
å 为ä»ä»¬é½éè¦å¨è¯»åäºä»¶å°±ç»ªåèªå·±è´è´£è¿è¡è¯»åï¼ä¹å°±æ¯è¯´è¿ä¸ªè¯»åè¿ç¨æ¯é»å¡ç.
FD(æä»¶æè¿°ç¬¦)
select模å
ä¼ç¹ï¼
1ï¼å¯ç§»æ¤æ§å¥½ï¼å¨æäºUnixç³»ç»ä¸æ¯æpoll()
2ï¼å¯¹äºè¶
æ¶å¼æä¾äºæ´å¥½ç精度ï¼å¾®å¦ï¼èpollæ¯æ¯«ç§
缺ç¹ï¼
1:æå¤§å¹¶åæ°éå¶ï¼å 为ä¸ä¸ªè¿ç¨ææå¼ç FD ï¼æä»¶æè¿°ç¬¦ï¼æ¯æéå¶çï¼ç± FD_SETSIZE 设置ï¼é»è®¤å¼æ¯ 1024/2048 ï¼å æ¤ Select 模åçæå¤§å¹¶åæ°å°±è¢«ç¸åºéå¶äºã
2ï¼æçé®é¢ï¼selectæ¯æ¬¡è°ç¨é½ä¼çº¿æ§æ«æå
¨é¨çFDéåï¼æä»¥å°FD_SETSIZE æ¹å¤§ï¼ä¼è¶æ
¢
3ï¼éè¦ç»´æ¤ä¸ä¸ªç¨æ¥åæ¾å¤§éfdçæ°æ®ç»æï¼è¿æ ·ä¼ä½¿å¾ç¨æ·ç©ºé´åå
æ ¸ç©ºé´å¨ä¼ éè¯¥ç»ææ¶å¤å¶å¼é大ã
pollæ¬è´¨ä¸åselect 没æåºå«ï¼å®å°ç¨æ·ä¼ å
¥çæ°ç»æ·è´å°å
æ ¸ç©ºé´ï¼
宿²¡ææå¤§è¿æ¥æ°çéå¶ï¼åå æ¯å®åºäºé¾è¡¨æ¥åå¨ç使¯åæ ·æä¸ä¸ªç¼ºç¹ï¼
大éçfdçæ°ç»è¢«æ´ä½å¤å¶äºç¨æ·æåå
æ ¸å°å空é´ï¼èä¸ç®¡è¿æ ·çå¤å¶æ¯ä¸æ¯ææä¹
90. ä»ä¹æ¯é²ç«å¢ä»¥åä½ç¨ï¼
é²ç«å¢æ¯ä¸ä¸ªå离å¨ãä¸ä¸ªéå¶å¨ï¼ä¹æ¯ä¸ä¸ªåæå¨ï¼ææå°çæ§äºå é¨ç½åInternetä¹é´ç任使´»å¨ï¼ä¿è¯äºå é¨ç½ç»çå®å ¨
ä½ç¨
é²ç«å¢æ¯ç½ç»å®å
¨çå±é
å¯ä»¥å¼ºåç½ç»å®å
¨çç¥
对ç½ç»ååå访é®è¿è¡çæ§å®¡è®¡
鲿¢å
é¨ä¿¡æ¯ç夿³
é¤äºå®å
¨ä½ç¨ï¼é²ç«å¢è¿æ¯æå
·æInternetæå¡ç¹æ§çä¼ä¸å
é¨ç½ç»ææ¯ä½ç³»v*nï¼èæä¸ç¨ç½ï¼ã
91. ç®è¿° è¿ç¨ã线ç¨ãåç¨çåºå« 以ååºç¨åºæ¯ï¼
çº¿ç¨æ¯æè¿ç¨å
çä¸ä¸ªæ§è¡åå
ï¼
# è¿ç¨
è¿ç¨æ¥æèªå·±ç¬ç«çå åæ ï¼æ¢ä¸å
±äº«å ï¼äº¦ä¸å
±äº«æ ï¼è¿ç¨ç±æä½ç³»ç»è°åº¦ã
# 线ç¨
çº¿ç¨æ¥æèªå·±ç¬ç«çæ åå
±äº«çå ï¼å
±äº«å ï¼ä¸å
±äº«æ ï¼çº¿ç¨äº¦ç±æä½ç³»ç»è°åº¦
# åç¨å线ç¨
åç¨é¿å
äºæ æä¹çè°åº¦ï¼ç±æ¤å¯ä»¥æé«æ§è½ï¼ä½åæ¶åç¨ä¹å¤±å»äºçº¿ç¨ä½¿ç¨å¤CPUçè½å
è¿ç¨ä¸çº¿ç¨çåºå«
ï¼1ï¼å°å空é´ï¼çº¿ç¨æ¯è¿ç¨å
çä¸ä¸ªæ§è¡åä½ï¼è¿ç¨å
è³å°æä¸ä¸ªçº¿ç¨ï¼ä»ä»¬å
±äº«è¿ç¨çå°å空é´ï¼èè¿ç¨æèªå·±ç¬ç«çå°å空é´
ï¼2ï¼èµæºæ¥æï¼è¿ç¨æ¯èµæºåé
忥æçåä½ï¼åä¸ä¸ªè¿ç¨å
线ç¨å
±äº«è¿ç¨çèµæº
ï¼3ï¼çº¿ç¨æ¯å¤çå¨è°åº¦çåºæ¬åä½ï¼ä½è¿ç¨ä¸æ¯
ï¼4ï¼äºè
åå¯å¹¶åæ§è¡
ï¼5ï¼æ¯ä¸ªç¬ç«ççº¿ç¨æä¸ä¸ªç¨åºè¿è¡çå
¥å£
åç¨ä¸çº¿ç¨
ï¼1ï¼ä¸ä¸ªçº¿ç¨å¯ä»¥æå¤ä¸ªåç¨ï¼ä¸ä¸ªè¿ç¨ä¹å¯ä»¥åç¬æ¥æå¤ä¸ªåç¨ï¼è¿æ ·Pythonä¸åè½ä½¿ç¨å¤æ ¸CPU
ï¼2ï¼çº¿ç¨è¿ç¨é½æ¯åæ¥æºå¶ï¼èåç¨æ¯å¼æ¥
ï¼3ï¼åç¨è½ä¿çä¸ä¸æ¬¡è°ç¨æ¶çç¶æ
92. GIL鿝ä»ä¹ï¼
GILæ¬è´¨å°±æ¯ä¸æäºæ¥éï¼æ¢ç¶æ¯äºæ¥éï¼ææäºæ¥éçæ¬è´¨é½ä¸æ ·ï¼é½æ¯å°å¹¶åè¿è¡åæä¸²è¡ï¼ä»¥æ¤æ¥æ§å¶å䏿¶é´å å ±äº«æ°æ®åªè½è¢«ä¸ä¸ªä»»å¡æä¿®æ¹ï¼è¿èä¿è¯æ°æ®å®å ¨ã
GILä¿æ¤çæ¯è§£éå¨çº§çæ°æ®ï¼ä¿æ¤ç¨æ·èªå·±çæ°æ®åéè¦èªå·±å éå¤ç
åºç¨ï¼æ»ç»ï¼ï¼
å¤çº¿ç¨ç¨äºIOå¯éåï¼å¦socketï¼ç¬è«ï¼web
å¤è¿ç¨ç¨äºè®¡ç®å¯éåï¼å¦éèåæ
1. æ¯ä¸ªcpythonè¿ç¨å
齿ä¸ä¸ªGIL
2. GIL导è´åä¸è¿ç¨å
å¤ä¸ªè¿ç¨å䏿¶é´åªè½æä¸ä¸ªè¿è¡
3. 乿以æGILï¼æ¯å 为Cpythonçå
å管ç䏿¯çº¿ç¨å®å
¨ç
4. 对äºè®¡ç®å¯éåç¨å¤è¿ç¨ï¼å¤IOå¯éåç¨å¤çº¿ç¨
93. Pythonä¸å¦ä½ä½¿ç¨çº¿ç¨æ± åè¿ç¨æ± ï¼
94. threading.localçä½ç¨ï¼
å®ç°çº¿ç¨å±é¨åéçä¼ éã
95. è¿ç¨ä¹é´å¦ä½è¿è¡éä¿¡ï¼
96. ä»ä¹æ¯å¹¶ååå¹¶è¡ï¼
# å¹¶åï¼å䏿¶å»åªè½å¤çä¸ä¸ªä»»å¡ï¼ä½ä¸ä¸ªæ¶æ®µå å¯ä»¥å¯¹å¤ä¸ªä»»å¡è¿è¡äº¤æ¿å¤ç(ä¸ä¸ªå¤çå¨åæ¶å¤çå¤ä¸ªä»»å¡) # å¹¶è¡ï¼å䏿¶å»å¯ä»¥å¤çå¤ä¸ªä»»å¡(å¤ä¸ªå¤çå¨æè æ¯å¤æ ¸çå¤çå¨åæ¶å¤çå¤ä¸ªä¸åçä»»å¡) # ç±»æ¯ï¼å¹¶åæ¯ä¸ä¸ªäººåæ¶åä¸ä¸ªé¦å¤´ï¼èå¹¶è¡æ¯ä¸ä¸ªäººåæ¶åä¸ä¸ªé¦å¤´ã
97. è¿ç¨éå线ç¨éçä½ç¨ï¼
98. è§£éä»ä¹æ¯å¼æ¥éé»å¡ï¼
éé»å¡ï¼ä¸çå¾
å³ï¼éå°IOé»å¡ä¸çå¾
(setblooking=False),ï¼å¯è½ä¼æ¥é->ææå¼å¸¸ï¼
- sk=socket.socket()
- sk.setblooking(False)
弿¥ï¼åè°ï¼å½è¾¾å°æä¸ªæå®çç¶æä¹åï¼èªå¨è°ç¨ç¹å®å½æ°
å®ä¾
nb_async.py å®ç°å¼æ¥éé»å¡ç模å
弿¥ä½ç°å¨åè°ä¸ï¼åè°å°±æ¯ææ¶æ¯è¿åæ¶åç¥ä¸å£°å¿è¿ç¨è¿è¡å¤çãéé»å¡å°±æ¯ä¸çå¾ ï¼ä¸éè¦è¿ç¨çå¾ ä¸å»ï¼ç»§ç»æ§è¡å ¶ä»æä½ï¼ä¸ç®¡å ¶ä»è¿ç¨çç¶æã
99. è·¯ç±å¨åäº¤æ¢æºçåºå«
1ï¼äº¤æ¢æºï¼æ¯è´è´£å
ç½éé¢çæ°æ®ä¼ éï¼arpåè®®ï¼æ ¹æ®MACå°å寻å
è·¯ç±å¨ï¼å¨ç½ç»å±ï¼è·¯ç±å¨æ ¹æ®è·¯ç±è¡¨ï¼å¯»æ¾è¯¥ipçç½æ®µ
2ï¼è·¯ç±å¨å¯ä»¥å¤çTCP/IPåè®®
3ï¼è·¯ç±å¨å¯ä»¥æä¸ä¸ªIPåé
ç»å¾å¤ä¸ªä¸»æºä½¿ç¨ï¼è¿äºä¸»æºå¯¹å¤åªè¡¨ç°åºä¸ä¸ªIPã
äº¤æ¢æºå¯ä»¥æå¾å¤ä¸»æºè¿èµ·æ¥ï¼è¿äºä¸»æºå¯¹å¤åæåçIPã
4ï¼äº¤æ¢æºæ¯åç«¯å£æ©å±çï¼ä¹å°±æ¯è®©å±åç½å¯ä»¥è¿è¿æ¥æ´å¤ççµèã
è·¯ç±å¨æ¯ç¨æ¥åç½ç»è¿æ¥ï¼ä¹å°±æ¯ï¼è¿æ¥ä¸åçç½ç»
100.ä»ä¹æ¯ååè§£æï¼
å¨äºèç½ä¸ï¼ææçå°å齿¯ipå°åï¼ç°é¶æ®µä¸»è¦æ¯IPv4ï¼æ¯å¦ï¼110.110.110.110ï¼ã
使¯è¿äºipå°å太é¾è®°äºï¼æä»¥å°±åºç°äºååï¼æ¯å¦http://baidu.comï¼ã
ååè§£æå°±æ¯å°ååï¼è½¬æ¢ä¸ºipå°åçè¿æ ·ä¸ç§è¡ä¸ºã
101.å¦ä½ä¿®æ¹æ¬å°hostsä»¶ï¼
Hostsæ¯ä¸ä¸ªæ²¡ææ©å±åçç³»ç»æä»¶ï¼å¯ä»¥ç¨è®°äºæ¬çå·¥å
·æå¼ï¼å
¶ä½ç¨å°±æ¯å°ä¸äºå¸¸ç¨çç½åååä¸å
¶å¯¹åºçIPå°å建ç«ä¸ä¸ªå
³èâæ°æ®åºâï¼
å½ç¨æ·å¨æµè§å¨ä¸è¾å
¥ä¸ä¸ªéè¦ç»å½çç½åæ¶ï¼ç³»ç»ä¼é¦å
èªå¨ä»Hostsæä»¶ä¸å¯»æ¾å¯¹åºçIPå°åï¼
䏿¦æ¾å°ï¼ç³»ç»ä¼ç«å³æå¼å¯¹åºç½é¡µï¼å¦ææ²¡ææ¾å°ï¼åç³»ç»ä¼åå°ç½åæäº¤DNSååè§£ææå¡å¨è¿è¡IPå°åçè§£æã
æµè§å¨è®¿é®ç½ç«ï¼è¦é¦å éè¿DNSæå¡å¨æè¦è®¿é®çç½ç«ååè§£ææä¸ä¸ªå¯ä¸çIPå°åï¼ä¹åï¼æµè§å¨æè½å¯¹æ¤ç½ç«è¿è¡å®ä½å¹¶ä¸è®¿é®å ¶æ°æ®ã
æä»¶è·¯å¾ï¼C:\WINDOWS\system32\drivers\etcã
å°127.0.0.1 www.163.com æ·»å 卿ä¸é¢
ä¿®æ¹åç¨æµè§å¨è®¿é®âwww.163.comâä¼è¢«è§£æå°127.0.0.1ï¼å¯¼è´æ æ³æ¾ç¤ºè¯¥ç½é¡µã
102.çäº§è æ¶è´¹è 模ååºç¨åºæ¯åä¼å¿ï¼
ç产è
䏿¶è´¹è
æ¨¡å¼æ¯éè¿ä¸ä¸ªå®¹å¨æ¥è§£å³ç产è
䏿¶è´¹è
ç强è¦åå
³ç³»ï¼ç产è
䏿¶è´¹è
ä¹é´ä¸ç´æ¥è¿è¡é讯ï¼
èæ¯å©ç¨é»å¡é忥è¿è¡é讯ï¼ç产è
çææ°æ®åç´æ¥ä¸¢ç»é»å¡éåï¼æ¶è´¹è
éè¦æ°æ®åä»é»å¡éåè·åï¼
å®é
åºç¨ä¸ï¼ç产è
䏿¶è´¹è
模å¼å主è¦è§£å³ç产è
䏿¶è´¹è
çäº§ä¸æ¶è´¹çéçä¸ä¸è´çé®é¢ï¼è¾¾å°å¹³è¡¡ç产è
䏿¶è´¹è
çå¤çè½åï¼èé»å¡éååç¸å½äºç¼å²åºã
åºç¨åºæ¯ï¼ç¨æ·æäº¤è®¢åï¼è®¢åè¿å ¥å¼æçé»å¡éåä¸ï¼ç±ä¸é¨ç线ç¨ä»é»å¡éåä¸è·åæ°æ®å¹¶å¤ç
ä¼å¿ï¼
1ï¼è§£è¦
å设ç产è
åæ¶è´¹è
å嫿¯ä¸¤ä¸ªç±»ãå¦æè®©ç产è
ç´æ¥è°ç¨æ¶è´¹è
çæä¸ªæ¹æ³ï¼é£ä¹ç产è
å¯¹äºæ¶è´¹è
å°±ä¼äº§çä¾èµï¼ä¹å°±æ¯è¦åï¼ã
å°æ¥å¦ææ¶è´¹è
ç代ç åçååï¼å¯è½ä¼å½±åå°ç产è
ãè妿䏤è
é½ä¾èµäºæä¸ªç¼å²åºï¼ä¸¤è
ä¹é´ä¸ç´æ¥ä¾èµï¼è¦åä¹å°±ç¸åºéä½äºã
2ï¼æ¯æå¹¶å
ç产è
ç´æ¥è°ç¨æ¶è´¹è
çæä¸ªæ¹æ³ï¼è¿æå¦ä¸ä¸ªå¼ç«¯ãç±äºå½æ°è°ç¨æ¯åæ¥çï¼æè
å«é»å¡çï¼ï¼å¨æ¶è´¹è
çæ¹æ³æ²¡æè¿åä¹åï¼ç产è
åªè½ä¸ç´çç
è使ç¨è¿ä¸ªæ¨¡åï¼ç产è
æå¶é åºæ¥çæ°æ®åªéè¦æ¾å¨ç¼å²åºå³å¯ï¼ä¸éè¦çå¾
æ¶è´¹è
æ¥å
3ï¼æ¯æå¿é²ä¸å
ç¼å²åºè¿æå¦ä¸ä¸ªå¥½å¤ã妿å¶é æ°æ®çé度æ¶å¿«æ¶æ
¢ï¼ç¼å²åºç好å¤å°±ä½ç°åºæ¥äºã
彿°æ®å¶é å¿«çæ¶åï¼æ¶è´¹è
æ¥ä¸åå¤çï¼æªå¤ççæ°æ®å¯ä»¥ææ¶åå¨ç¼å²åºä¸ãçç产è
çå¶é é度æ
¢ä¸æ¥ï¼æ¶è´¹è
åæ
¢æ
¢å¤çæã
103.ä»ä¹æ¯cdnï¼
ç®çæ¯ä½¿ç¨æ·å¯ä»¥å°±è¿å°æå¡å¨å徿éå
容ï¼è§£å³ Internetç½ç»æ¥æ¤çç¶åµï¼æé«ç¨æ·è®¿é®ç½ç«çååºé度ã
cdn å³å 容ååç½ç»
104.LVSæ¯ä»ä¹åä½ç¨ï¼
LVS ï¼Linuxèææå¡å¨
ä½ç¨ï¼LVS主è¦ç¨äºå¤æå¡å¨çè´è½½åè¡¡ã
å®å·¥ä½å¨ç½ç»å±ï¼å¯ä»¥å®ç°é«æ§è½ï¼é«å¯ç¨çæå¡å¨éç¾¤ææ¯ã
å®å»ä»·ï¼å¯æè®¸å¤ä½æ§è½çæå¡å¨ç»åå¨ä¸èµ·å½¢æä¸ä¸ªè¶
级æå¡å¨ã
宿ç¨ï¼é
ç½®é常ç®åï¼ä¸æå¤ç§è´è½½åè¡¡çæ¹æ³ã
å®ç¨³å®å¯é ï¼å³ä½¿å¨é群çæå¡å¨ä¸æå°æå¡å¨æ æ³æ£å¸¸å·¥ä½ï¼ä¹ä¸å½±åæ´ä½ææãå¦å¤å¯æ©å±æ§ä¹é常好ã
105.Nginxæ¯ä»ä¹åä½ç¨ï¼
106.keepalivedæ¯ä»ä¹åä½ç¨?
107.haproxyæ¯ä»ä¹ä»¥åä½ç¨ï¼
108.ä»ä¹æ¯è´è½½åè¡¡ï¼
109.ä»ä¹æ¯rpcååºç¨åºæ¯ï¼
110.ç®è¿° asynio模åçä½ç¨ååºç¨åºæ¯ã
111.ç®è¿° gevent模åçä½ç¨ååºç¨åºæ¯ã
112.twistedæ¡æ¶ç使ç¨ååºç¨
æ°æ®åºåç¼åï¼46é¢ï¼
113.å举常è§çå ³ç³»åæ°æ®åºåéå ³ç³»å齿é£äºï¼
å
³ç³»åæ°æ®åº(éè¦æè¡¨ç»æ)
mysqlãoracle ã splãserverãdb2ãsybase
éå
³ç³»åæ°æ®åºï¼æ¯ä»¥key-valueåå¨çï¼æ²¡æè¡¨ç»æï¼ï¼NoSQLï¼
MongoDB
MongoDB æ¯ä¸ä¸ªé«æ§è½ï¼å¼æºï¼æ 模å¼çææ¡£åæ°æ®åºï¼å¼åè¯è¨æ¯C++ãå®å¨è®¸å¤åºæ¯ä¸å¯ç¨äºæ¿ä»£ä¼ ç»çå
³ç³»åæ°æ®åºæé®/å¼å卿¹å¼ã
Redis
Redis æ¯ä¸ä¸ªå¼æºç使ç¨ANSI Cè¯è¨ç¼åãæ¯æç½ç»ãå¯åºäºå
åäº¦å¯æä¹
åçæ¥å¿åãKey-Valueæ°æ®åºï¼å¹¶æä¾å¤ç§è¯è¨çAPIãç®åç±VMware主æå¼åå·¥ä½ã
114.MySQLå¸¸è§æ°æ®åºå¼æåæ¯è¾ï¼
InnoDB
æ¯æäºå¡
æ¯æè¡¨éãè¡éï¼for updateï¼
表éï¼select * from tb for update
è¡éï¼select id,name from tb where id=2 for update
myisam
æ¥è¯¢é度快
å
¨æç´¢å¼
æ¯æè¡¨é
表éï¼select * from tb for update
NDB
é«å¯ç¨ã 髿§è½ãé«å¯æ©å±æ§çæ°æ®åºé群系ç»
Memory
é»è®¤ä½¿ç¨çæ¯åå¸ç´¢å¼
115.ç®è¿°æ°æ®åºä¸å¤§èå¼ï¼
æ°æ®åºçä¸å¤§ç¹æ§ï¼
'å®ä½':表
'屿§'ï¼è¡¨ä¸çæ°æ®(åæ®µ)
'å
³ç³»'ï¼è¡¨ä¸è¡¨ä¹é´çå
³ç³»
----------------------------------------------------
# æ°æ®åºè®¾è®¡ä¸å¤§èå¼ï¼
1ï¼ç¡®ä¿æ¯åä¿æååæ§ï¼å³æ°æ®åºè¡¨ä¸çææåæ®µå¼æ¯ä¸å¯åè§£çååå¼ï¼
2ï¼ç¡®ä¿è¡¨ä¸çæ¯å齿¯å主é®ç¸å ³ï¼è¡¨ä¸åªè½ä¿åä¸ç§æ°æ®ï¼ä¸å¯ä»¥æå¤ç§æ°æ®ä¿åå¨åä¸å¼ 表ä¸ï¼â>å®å ¨å±äºå½åè¡¨çæ°æ®
3ï¼ç¡®ä¿æ¯åé½å主é®ç´æ¥ç¸å
³ï¼è䏿¯é´æ¥ç¸å
³ï¼å¨ä¸ä¸ªæ°æ®åºè¡¨ä¸ä¿åçæ°æ®åªè½ä¸ä¸»é®ç¸å
³ï¼----> æ¶é¤ä¼ éä¾èµï¼é´æ¥ï¼
æ¯å¦å¨è®¾è®¡ä¸ä¸ªè®¢åæ°æ®è¡¨çæ¶åï¼å¯ä»¥å°å®¢æ·ç¼å·ä½ä¸ºä¸ä¸ªå¤é®å订å表建ç«ç¸åºçå
³ç³»ã
èä¸å¯ä»¥å¨è®¢åè¡¨ä¸æ·»å å
³äºå®¢æ·å
¶å®ä¿¡æ¯ï¼æ¯å¦å§åãæå±å
¬å¸çï¼çåæ®µã
æ°æ®åºäºå¤§çº¦æ'
1.primary KEY:设置主é®çº¦æï¼
2.UNIQUEï¼è®¾ç½®å¯ä¸æ§çº¦æï¼ä¸è½æéå¤å¼ï¼
3.DEFAULT é»è®¤å¼çº¦æ
4.NOT NULLï¼è®¾ç½®é空约æï¼è¯¥å段ä¸è½ä¸ºç©ºï¼
5.FOREIGN key :设置å¤é®çº¦æã
116ãä»ä¹æ¯äºå¡ï¼MySQLå¦ä½æ¯æäºå¡ï¼
äºå¡ç¨äºå°æäºæä½çå¤ä¸ªSQLä½ä¸ºååæ§æä½ï¼ä¸æ¦ææä¸ä¸ªåºç°é误ï¼å³å¯åæ»å°åæ¥çç¶æï¼ä»èä¿è¯æ°æ®åºæ°æ®å®æ´æ§ã
äºå¡çç¹æ§ï¼
ååæ§: ç¡®ä¿å·¥ä½åå
å
çæææä½é½æå宿ï¼å¦åäºå¡å°è¢«ä¸æ¢å¨æ
éç¹ï¼å以åçæä½å°åæ»å°ä»¥åçç¶æã
ä¸è´æ§: ç¡®ä¿æ°æ®åºæ£ç¡®å°æ¹åç¶æåï¼æåæäº¤çäºå¡ã
é离æ§: 使äºå¡æä½å½¼æ¤ç¬ç«çåéæçã
æä¹
æ§: ç¡®ä¿æäº¤çäºå¡çç»ææææçç³»ç»åºç°æ
éçæ
åµä¸ä»ç¶åå¨ã
Mysqlå®ç°äºå¡
InnoDBæ¯æäºå¡ï¼MyISAM䏿¯æ
# å¯å¨äºå¡ï¼
# start transactionï¼
# update from account set money=money-100 where name=âaâ;
# update from account set money=money+100 where name=âbâ;
# commitï¼
âstart transaction æå¨å¼å¯äºå¡ï¼commit æå¨å
³éäºå¡â
117.ç®è¿°æ°æ®åºè®¾è®¡ä¸ä¸å¯¹å¤åå¤å¯¹å¤çåºç¨åºæ¯ï¼
FK(ä¸å¯¹å¤)
䏿æ¡éé¢çæ°æ®å°±éè¦ç¨FKå
³èå¦ä¸å¼ 表
M2Mï¼å¤å¯¹å¤ï¼
å¤éç䏿æ¡ï¼æè
checkbox
118.å¦ä½åºäºæ°æ®åºå®ç°åååå计æ°å¨ï¼
119.常è§SQLï¼å¿ å¤ï¼
group by åç»å¯¹èåçæ¡ä»¶è¿è¡çééè¦éè¿havhing
SQLçleft join ãright joinãinner joinä¹é´çåºå«
left join (å·¦è¿æ¥) è¿åå
æ¬å·¦è¡¨ä¸çææè®°å½åå³è¡¨ä¸èç»å段ç¸ççè®°å½
right join(å³è¿æ¥) è¿åå
æ¬å³è¡¨ä¸çææè®°å½1å左表ä¸èç»å段ç¸ççè®°å½
inner joinï¼å
è¿æ¥ï¼ï¼ åªè¿å两个表ä¸èç»å段ç¸ççè¡
https://www.cnblogs.com/wupeiqi/articles/5729934.html
120.ç®è¿°è§¦åå¨ã彿°ãè§å¾ãåå¨è¿ç¨ï¼
触åå¨ï¼
å¯¹æ°æ®åºæå¼ 表çå¢å ãå é¤ï¼ä¿®æ¹ååå®ä¹ä¸äºæä½
彿°ï¼(触å彿°æ¯éè¿select)
èå彿°ï¼max/sum/min/avg
æ¶é´æ ¼å¼åï¼date_format
åç¬¦ä¸²æ¼æ¥ï¼concat
åå¨è¿ç¨ï¼
å°SQLè¯å¥ä¿åå°æ°æ®åºä¸ï¼å¹¶å½åï¼ä»¥åå¨ä»£ç è°ç¨æ¶ï¼ç´æ¥è°ç¨åç§°å³å¯
åæ°ç±»åï¼
ããin åªå°åæ°ä¼ è¿å»
ããout åªæ¿ç»æ
ããinout æ¢å¯ä»¥ä¼ ï¼å¯ä»¥å
彿°ä¸åå¨è¿ç¨åºå«ï¼
æ¬è´¨ä¸æ²¡åºå«ãåªæ¯å½æ°æå¦ï¼åªè½è¿åä¸ä¸ªåéçéå¶ãèåå¨è¿ç¨å¯ä»¥è¿åå¤ä¸ªãè彿°æ¯å¯ä»¥åµå
¥å¨sqlä¸ä½¿ç¨ç,å¯ä»¥å¨selectä¸è°ç¨ï¼èåå¨è¿ç¨ä¸è¡ã
è§å¾ï¼
è§å¾æ¯ä¸ä¸ªèæè¡¨ï¼ä¸æ¯çå®åå¨çï¼åªè½æ¥ï¼ä¸è½æ¹ï¼
121.MySQLç´¢å¼ç§ç±»
åå
åè½
æ®éç´¢å¼ï¼å 鿥æ¾
å¯ä¸ç´¢å¼ï¼å éæ¥æ¾ + 约æï¼ä¸è½éå¤ï¼åªè½æä¸ä¸ªç©ºï¼ä¸ç¶å°±éå¤äºï¼
主é®ï¼primay keyï¼ï¼å éæ¥æ¾ + 约æï¼ä¸è½éå¤ + ä¸è½ä¸ºç©º
å¤å
ããèåç´¢å¼ï¼å¤ä¸ªåå建索å¼ï¼-----> ç¸å½äºååçæ®éç´¢å¼
ããèåå¯ä¸ç´¢å¼ -----> ç¸å½äºååçå¯ä¸ç´¢å¼
ããpsï¼èåç´¢å¼çç¹ç¹ï¼éµå¾ªæå·¦åç¼çè§å
å
¶ä»è¯è¯ï¼
·· - ç´¢å¼åå¹¶ï¼å©ç¨å¤ä¸ªåä¾ç´¢å¼æ¥è¯¢ï¼ï¼ä¾å¦å¨æ°æ®åºæ¥ç¨æ·ååå¯ç ï¼åå«ç»ç¨æ·ååå¯ç 建ç«ç´¢å¼ï¼
- è¦çç´¢å¼ï¼å¨ç´¢å¼è¡¨ä¸å°±è½å°æ³è¦çæ°æ®æ¥è¯¢å°ï¼
122.ç´¢å¼å¨ä»ä¹æ åµä¸éµå¾ªæå·¦åç¼çè§åï¼
èåç´¢å¼
123.主é®åå¤é®çåºå«ï¼
䏻鮿¯è½ç¡®å®ä¸æ¡è®°å½çå¯ä¸æ 示ãä¾å¦ï¼èº«ä»½è¯è¯å·
å¤é®ï¼ç¨äºä¸å¦ä¸å¼ 表çå ³èï¼æ¯è½ç¡®å®å¦ä¸å¼ 表记å½çåæ®µï¼ç¨äºä¿ææ°æ®çä¸è´æ§
ä¸»é® | å¤é® | |
å®ä¹ | å¯ä¸æ è¯ä¸æ¡è®°å½ï¼ä¸è½æéå¤çï¼ä¸å 许为空 | 表çå¤é®æ¯å¦ä¸å¼ 表ç主é®ï¼å¤é®å¯ä»¥æéå¤çï¼å¯ä»¥ä¸ºç©º |
ä½ç¨ | ç¨æ¥ä¿è¯æ°æ®å®æ´æ§ | ç¨æ¥ä¸å ¶ä»è¡¨å»ºç«èç³»ç |
ä¸ªæ° | 主é®åªè½æä¸ä¸ª | ä¸ä¸ªè¡¨å¯ä»¥æå¤ä¸ªå¤é® |
124.MySQL常è§ç彿°ï¼
èå彿°
max/sum/min/avg
æ¶é´æ ¼å¼å
date_format
åç¬¦ä¸²æ¼æ¥
concatï¼å½æ¼æ¥äºnullï¼åè¿ånullï¼
æªåå符串
substring
è¿ååè个æ°
length
125.å举 å建索å¼ä½æ¯æ æ³å½ä¸ç´¢å¼ç8ç§æ åµã
1.- like '%xx'
select * from tb1 where name like '%cn';
2.- 使ç¨å½æ°
select * from tb1 where reverse(name) = 'wupeiqi';
3.- or
select * from tb1 where nid = 1 or email = '[email protected]';
ç¹å«çï¼å½oræ¡ä»¶ä¸ææªå»ºç«ç´¢å¼çåæå¤±æï¼ä»¥ä¸ä¼èµ°ç´¢å¼
select * from tb1 where nid = 1 or name = 'seven';
select * from tb1 where nid = 1 or email = '[email protected]' and name = 'alex'
4.- ç±»åä¸ä¸è´
妿忝å符串类åï¼ä¼ å
¥æ¡ä»¶æ¯å¿
é¡»ç¨å¼å·å¼èµ·æ¥ï¼ä¸ç¶...
select * from tb1 where name = 999;
5.- !=
select * from tb1 where name != 'alex'
ç¹å«çï¼å¦ææ¯ä¸»é®ï¼åè¿æ¯ä¼èµ°ç´¢å¼
select * from tb1 where nid != 123
6.- >
select * from tb1 where name > 'alex'
ç¹å«çï¼å¦ææ¯ä¸»é®æç´¢å¼æ¯æ´æ°ç±»åï¼åè¿æ¯ä¼èµ°ç´¢å¼
select * from tb1 where nid > 123
select * from tb1 where num > 123
7.- order by
select email from tb1 order by name desc;
彿 ¹æ®ç´¢å¼æåºæ¶åï¼éæ©çæ å°å¦æä¸æ¯ç´¢å¼ï¼åä¸èµ°ç´¢å¼
ç¹å«çï¼å¦æå¯¹ä¸»é®æåºï¼åè¿æ¯èµ°ç´¢å¼ï¼
select * from tb1 order by nid desc;
8.- ç»åç´¢å¼æå·¦åç¼
妿ç»åç´¢å¼ä¸ºï¼(name,email)
name and email â 使ç¨ç´¢å¼
name â 使ç¨ç´¢å¼
email â ä¸ä½¿ç¨ç´¢å¼
126.å¦ä½å¼å¯æ ¢æ¥å¿æ¥è¯¢ï¼
ä¿®æ¹é
ç½®æä»¶
slow_query_log = OFF æ¯å¦å¼å¯æ
¢æ¥å¿è®°å½
long_query_time = 2 æ¶é´éå¶ï¼è¶
è¿æ¤æ¶é´ï¼åè®°å½
slow_query_log_file = /usr/slow.log æ¥å¿æä»¶
log_queries_not_using_indexes = OFF 为使ç¨ç´¢å¼çæç´¢æ¯å¦è®°å½
ä¸é¢æ¯å¼å¯
slow_query_log = ON
long_query_time = 2
log_queries_not_using_indexes = OFF
log_queries_not_using_indexes = ON
æ³¨ï¼æ¥çå½åé
置信æ¯ï¼
ãã show variables like â%query%â
ä¿®æ¹å½åé
ç½®ï¼
ããããset global åéå = å¼
127.æ°æ®åºå¯¼å ¥å¯¼åºå½ä»¤ï¼ç»æ+æ°æ®ï¼ï¼
导åºç°ææ°æ®åºæ°æ®ï¼ï¼å½ææç¤ºåºå
¥å¯ç ã-på°±ä¸ç¨å å¯ç ï¼
mysqldump -uç¨æ·å -på¯ç æ°æ®åºåç§° >å¯¼åºæä»¶è·¯å¾ # ç»æ+æ°æ®
mysqldump -uç¨æ·å -på¯ç -d æ°æ®åºåç§° >å¯¼åºæä»¶ è·¯å¾ # ç»æ
导å
¥ç°ææ°æ®åºæ°æ®ï¼
mysqldump -uroot -på¯ç æ°æ®åºåç§° < æä»¶è·¯å¾
128.æ°æ®åºä¼åæ¹æ¡ï¼
1ãåå»ºæ°æ®è¡¨æ¶æåºå®é¿åº¦çæ¾å¨åé¢ï¼ï¼
2ãå°åºå®æ°æ®æ¾å
¥å
åï¼ ä¾å¦ï¼choiceåæ®µ ï¼django䏿ç¨å°ï¼æ°å1ã2ã3â¦â¦ 对åºç¸åºå
容ï¼
3ãchar å varchar çåºå«(charå¯å, varcharä¸å¯å )
ãã
4ãèåç´¢å¼éµå¾ªæå·¦åç¼(仿左侧å¼å§æ£ç´¢)
5ãé¿å
ä½¿ç¨ select *
6ã读åå离
ãããã- å®ç°ï¼ä¸¤å°æå¡å¨åæ¥æ°æ®
ãããã- å©ç¨æ°æ®åºç主ä»å离ï¼ä¸»ï¼ç¨äºå é¤ãä¿®æ¹ãæ´æ°ï¼ä»ï¼ç¨äºæ¥ï¼
读åå离:å©ç¨æ°æ®åºç主ä»è¿è¡å离ï¼ä¸»ï¼ç¨äºå é¤ãä¿®æ¹æ´æ°ï¼ä»ï¼ç¨äºæ¥
7ãååº
ãããã- 彿°æ®åºä¸ç表太å¤ï¼å°æäºè¡¨åå°ä¸åçæ°æ®åºï¼ä¾å¦ï¼1Wå¼ è¡¨æ¶
ãããã- 代价ï¼è¿è¡¨æ¥è¯¢
8ãå表
ãããã- æ°´å¹³å表ï¼å°æäºåæåå°å¦å¤ä¸å¼ 表ï¼ä¾å¦ï¼å客+å客详æ
ãããã- åç´å表ï¼è®²äºåå²ä¿¡æ¯åå°å¦å¤ä¸å¼ 表ä¸ï¼ä¾å¦ï¼æ¯ä»å®è´¦å
9ãå ç¼å
ãããã- å©ç¨redisãmemcache ï¼å¸¸ç¨æ°æ®æ¾å°ç¼åéï¼æé«åæ°æ®é度ï¼
å¦æåªæ³è·å䏿¡æ°æ®
- select * from tb where name=âalexâ limit 1
129.charåvarcharçåºå«ï¼
char å varchar çåºå«(charå¯å, varcharä¸å¯å )
130.ç®è¿°MySQLçæ§è¡è®¡åï¼
æ¥çææ²¡æå½ä¸ç´¢å¼ï¼è®©æ°æ®åºå¸®ççè¿è¡é度快ä¸å¿«
explain select * from table;
å½type为allæ¶ï¼æ¯ä¸ºå ¨è¡¨ç´¢å¼
131.å¨å¯¹nameåäºå¯ä¸ç´¢å¼åæä¸ï¼ç®è¿°ä»¥ä¸åºå«ï¼
select * from tb where name = âOldboy-Wupeiqiâ
select * from tb where name = âOldboy-Wupeiqiâ limit 1
æ¯è¿æ ·ççï¼ç¨whereæ¡ä»¶è¿æ»¤åºç¬¦åæ¡ä»¶çæ°æ®çåæ¶ï¼è¿è¡è®¡æ°ï¼
æ¯å¦limit 1ï¼é£ä¹å¨whereè¿æ»¤åºç¬¬1æ¡æ°æ®åï¼ä»å°±ä¼ç´æ¥æç»æselectåºæ¥è¿åç»ä½ ï¼æ´ä¸ªè¿ç¨å°±ç»æäºã
没åå¯ä¸ç´¢å¼çè¯,åè
æ¥è¯¢ä¼å
¨è¡¨æ«æ,æçä½äº
limit 1,åªè¦æ¾å°å¯¹åºä¸æ¡æ°æ®,å°±ä¸ç»§ç»å¾ä¸æ«æ.
ç¶è name åæ®µæ·»å å¯ä¸ç´¢å¼äº,å ä¸å limit 1,æä¹é½ä¸å¤§;
132.1000wæ¡æ°æ®ï¼ä½¿ç¨limit offset å页æ¶ï¼ä¸ºä»ä¹è¶å¾åç¿»è¶æ ¢ï¼å¦ä½è§£å³ï¼
çæ¡ä¸ï¼
å
æ¥ä¸»é®ï¼å¨å页ã
select * from tb where id in (
select id from tb where limit 10 offset 30
)
çæ¡äºï¼
æç
§ä¹æ éæ±æ¯å¦å¯ä»¥è®¾ç½®åªè®©ç¨æ·ç200页
çæ¡ä¸ï¼
è®°å½å½å页 æ°æ®IDæå¤§å¼åæå°å¼
å¨ç¿»é¡µæ¶ï¼æ ¹æ®æ¡ä»¶å
è¿è¡çéï¼çé宿¯ä¹åï¼åæ ¹æ®limit offset æ¥è¯¢ã
select * from (select * from tb where id > 22222222) as B limit 10 offset 0
å¦æç¨æ·èªå·±ä¿®æ¹é¡µç ï¼ä¹å¯è½å¯¼è´æ
¢ï¼æ¤æ¶å¯¹urlç§ç页ç è¿è¡å å¯ï¼rest framework ï¼</span></pre>
133.ä»ä¹æ¯ç´¢å¼åå¹¶ï¼
1ãç´¢å¼åå¹¶æ¯æå 个索å¼çèå´æ«æåå¹¶æä¸ä¸ªç´¢å¼ã
2ãç´¢å¼åå¹¶çæ¶åï¼ä¼å¯¹ç´¢å¼è¿è¡å¹¶éï¼äº¤éæè
å
交éåå¹¶éæä½ï¼ä»¥ä¾¿åå¹¶æä¸ä¸ªç´¢å¼ã
3ãè¿äºéè¦åå¹¶çç´¢å¼åªè½æ¯ä¸ä¸ªè¡¨çãä¸è½å¯¹å¤è¡¨è¿è¡ç´¢å¼åå¹¶ã
ç®åç说ï¼ç´¢å¼åå¹¶ï¼è®©ä¸æ¡sqlå¯ä»¥ä½¿ç¨å¤ä¸ªç´¢å¼ã对è¿äºç´¢å¼å交éï¼å¹¶éï¼æè
å
å交éååå¹¶éã
ä»èåå°ä»æ°æ®è¡¨ä¸åæ°æ®ç次æ°ï¼æé«æ¥è¯¢æçã
134.ä»ä¹æ¯è¦çç´¢å¼ï¼
å¨ç´¢å¼è¡¨ä¸å°±è½å°æ³è¦çæ°æ®æ¥è¯¢å°
135.ç®è¿°æ°æ®åºè¯»åå离ï¼
- å®ç°ï¼ä¸¤å°æå¡å¨åæ¥æ°æ®
ãããã- å©ç¨æ°æ®åºç主ä»å离ï¼ä¸»ï¼ç¨äºå é¤ãä¿®æ¹ãæ´æ°ï¼ä»ï¼ç¨äºæ¥ï¼
æ¹å¼ä¸:æ¯è§å¾éé¢ç¨usingæ¹å¼å¯ä»¥è¿è¡æå®å°åªä¸ªæ°æ®è¯»å from django.shortcuts import render,HttpResponse from app01 import models def index(request):models.UserType.objects.using('db1').create(title='æ®éç¨æ·')
# æå¨æå®å»æä¸ªæ°æ®åºåæ°æ®
result = models.UserType.objects.all().using(âdb1â)
print(result)
return HttpResponse('...')
æ¹å¼äºï¼åé
ç½®æä»¶
class Router1:
ãã# æå®å°æä¸ªæ°æ®åºåæ°æ®
def db_for_read(self, model, **hints):
ââ"
Attempts to read auth models go to auth_db.
ââ"
if model._meta.model_name == âusertypeâ:
return âdb1â
else:
return âdefaultâ
ããã# æå®å°æä¸ªæ°æ®åºåæ°æ®
def db_for_write(self, model, **hints):
ââ"
Attempts to write auth models go to auth_db.
ââ"
return âdefaultâ
ååå°é
ç½®
DATABASES = {
âdefaultâ: {
âENGINEâ: âdjango.db.backends.sqlite3â,
âNAMEâ: os.path.join(BASE_DIR, âdb.sqlite3â),
},
âdb1â: {
âENGINEâ: âdjango.db.backends.sqlite3â,
âNAMEâ: os.path.join(BASE_DIR, âdb.sqlite3â),
}
}
DATABASE_ROUTERS = [âdb_router.Router1â,]
136.ç®è¿°æ°æ®åºååºå表ï¼ï¼æ°´å¹³ãåç´ï¼
1ãååº
彿°æ®åºä¸ç表太å¤ï¼å°æäºè¡¨åå°ä¸åæ°æ®åºï¼ä¾å¦ï¼1Wå¼ è¡¨æ¶
代价ï¼è¿è¡¨æ¥è¯¢è·¨æ°æ®åºï¼ä»£ç åå¤
# 2ãå表
æ°´å¹³å表ï¼å°æäºåæåå°å¦ä¸å¼ 表ï¼ä¾å¦ï¼å客+å客详æ
åç´å表ï¼å°æäºåå²ä¿¡æ¯ï¼åå°å¦å¤ä¸å¼ 表ä¸ï¼ä¾å¦ï¼æ¯ä»å®è´¦å
137.redisåmemcachedæ¯è¾ï¼
åºå«
1ï¼redisä¸ä»
æ¯æç®åçkey_valueç±»åï¼è¿æ¯æåå
¸ï¼å符串ï¼å表ï¼éåï¼æåºéåç±»å
2ï¼å
åä½¿ç¨æç对æ¯ï¼ä½¿ç¨ç®åçkey-valueåå¨çè¯ï¼
Memcachedçå
åå©ç¨çæ´é«è妿Rediséç¨hashç»ææ¥åkey-valueåå¨ï¼ç±äºå
¶ç»åå¼çå缩ï¼å
¶å
åå©ç¨çä¼é«äºMemcachedã
3.æ§è½å¯¹æ¯ï¼ç±äºRedisåªä½¿ç¨åæ ¸ï¼èMemcachedå¯ä»¥ä½¿ç¨å¤æ ¸ï¼.
æä»¥å¹³åæ¯ä¸ä¸ªæ ¸ä¸Rediså¨åå¨å°æ°æ®æ¶æ¯Memcachedæ§è½æ´é«ãèå¨100k以ä¸çæ°æ®ä¸ï¼Memcachedæ§è½è¦é«äºRedisï¼
4.Redisè½ç¶æ¯åºäºå
åçåå¨ç³»ç»ï¼ä½æ¯å®æ¬èº«æ¯æ¯æå
åæ°æ®çæä¹
åçï¼è䏿ä¾ä¸¤ç§ä¸»è¦çæä¹
åçç¥ï¼RDBå¿«ç
§åAOFæ¥å¿ã
èmemcachedæ¯ä¸æ¯ææ°æ®æä¹
åæä½çã
5.é群管çä¸åï¼Memcachedæ¬èº«å¹¶ä¸æ¯æåå¸å¼ï¼å æ¤åªè½å¨å®¢æ·ç«¯éè¿åä¸è´æ§åå¸è¿æ ·çåå¸å¼ç®æ³æ¥å®ç°Memcachedçåå¸å¼åå¨ã
138.redis䏿°æ®åºé»è®¤æ¯å¤å°ä¸ªdb åä½ç¨ï¼
Redisé»è®¤æ¯æ16ä¸ªæ°æ®åºï¼å¯ä»¥éè¿é
ç½®databasesæ¥ä¿®æ¹è¿ä¸æ°åã客æ·ç«¯ä¸Redis建ç«è¿æ¥åä¼èªå¨éæ©0å·æ°æ®åºï¼ä¸è¿å¯ä»¥éæ¶ä½¿ç¨SELECTå½ä»¤æ´æ¢æ°æ®åº
Redisæ¯æå¤ä¸ªæ°æ®åºï¼å¹¶ä¸æ¯ä¸ªæ°æ®åºçæ°æ®æ¯é离çä¸è½å ±äº«ï¼å¹¶ä¸åºäºåæºææï¼å¦ææ¯éç¾¤å°±æ²¡ææ°æ®åºçæ¦å¿µã
139.pythonæä½redisçæ¨¡åï¼
- è¿æ¥ - ç´æ¥è¿æ¥ï¼ import redis r = redis.Redis(host='10.211.55.4', port=6379) r.set('foo', 'Bar') print r.get('foo') - è¿æ¥æ± ï¼ import redis pool = redis.ConnectionPool(host='10.211.55.4', port=6379)r = redis.Redis(connection_pool=pool) r.set('foo', 'Bar') print r.get('foo')</span></pre>
140.妿redisä¸çæä¸ªå表ä¸çæ°æ®éé常大ï¼å¦æå®ç°å¾ªç¯æ¾ç¤ºæ¯ä¸ä¸ªå¼ï¼
- 妿ä¸ä¸ªå表å¨redisä¸ä¿åäº10w个å¼ï¼æéè¦å°ææå¼å ¨é¨å¾ªç¯å¹¶æ¾ç¤ºï¼è¯·é®å¦ä½å®ç°ï¼ ä¸ä¸ªä¸ä¸ªåå¼ï¼å表没æiteræ¹æ³ï¼ä½è½èªå®ä¹ ãããã def list_scan_iter(name,count=3): start = 0 while True: result = conn.lrange(name, start, start+count-1) start += count if not result: break for item in result: yield itemfor val in list_scan_iter('num_list'): print(val)
åºæ¯ï¼æç¥¨ç³»ç»ï¼script-redis
141.rediså¦ä½å®ç°ä¸»ä»å¤å¶ï¼ä»¥åæ°æ®åæ¥æºå¶ï¼
ä¼å¿ï¼
- é«å¯ç¨
- åæ
主åå
注æï¼
- slave设置åªè¯»
ä»çé
ç½®æä»¶æ·»å 以ä¸è®°å½ï¼å³å¯ï¼
slaveof 1.1.1.1 3306
142.redisä¸çsentinelçä½ç¨ï¼
叮婿们èªå¨å¨ä¸»ä»ä¹é´è¿è¡åæ¢ æ£æµä¸»ä»ä¸ 主æ¯å¦ææï¼ä¸è¶ è¿ä¸åçsentinelæ£æµå°æäºä¹åæè¿è¡è¿è¡åæ¢ã å¦æä¸»ä¿®å¤å¥½äºï¼å次å¯å¨æ¶åï¼ä¼åæä»ãå¯å¨ä¸»redis: redis-server /etc/redis-6379.conf å¯å¨ä¸»redis redis-server /etc/redis-6380.conf å¯å¨ä»redis å¨linuxä¸ï¼ æ¾å° /etc/redis-sentinel-8001.conf é ç½®æä»¶ï¼å¨å é¨ï¼ - å¨å µçç«¯å£ port = 8001 - 主redisçIPï¼å¨å µä¸ªæ°çä¸å/1 æ¾å° /etc/redis-sentinel-8002.conf é ç½®æä»¶ï¼å¨å é¨ï¼ - å¨å µçç«¯å£ port = 8002 - 主redisçIP, 1 å¯å¨ä¸¤ä¸ªå¨å µ </span></pre>
143.å¦ä½å®ç°redisé群ï¼
redisé群ãåçãåå¸å¼redis
redis-py-cluster
éç¾¤æ¹æ¡ï¼
- redis cluster 宿¹æä¾çéç¾¤æ¹æ¡ã
- codisï¼è±è±èææ¯å¢éã
- tweproxyï¼Twiterææ¯å¢éã
redis clusterçåçï¼
- åºäºåçæ¥å®æã
- rediså°ææè½æ¾ç½®æ°æ®çå°æ¹åå»ºäº 16384 个å叿§½ã
- å¦æè®¾ç½®é群çè¯ï¼å°±å¯ä»¥ä¸ºæ¯ä¸ªå®ä¾åé
å叿§½ï¼
- 192.168.1.20ã0-5000ã
- 192.168.1.21ã5001-10000ã
- 192.168.1.22ã10001-16384ã
- 以忳è¦å¨redisä¸å弿¶ï¼
set k1 123
å°k1éè¿crc16çç®æ³ï¼å°k1è½¬æ¢æä¸ä¸ªæ°åãç¶ååå°è¯¥æ°åå16384æ±ä½ï¼å¦æå¾å°ç使° 3000ï¼é£ä¹å°±å°è¯¥å¼åå
¥å° 192.168.1.20 å®ä¾ä¸ã
144.redisä¸é»è®¤æå¤å°ä¸ªå叿§½ï¼
16384
145.ç®è¿°redisçæåªå ç§æä¹ åçç¥åæ¯è¾ï¼
RDBï¼æ¯é䏿®µæ¶é´å¯¹redisè¿è¡ä¸æ¬¡æä¹
åã
- 缺ç¹ï¼æ°æ®ä¸å®æ´
- ä¼ç¹ï¼é度快
AOFï¼æææå½ä»¤ä¿åèµ·æ¥ï¼å¦ææ³å°éæ°çæå°redisï¼é£ä¹å°±è¦æå½ä»¤éæ°æ§è¡ä¸æ¬¡ã
- 缺ç¹ï¼é度æ
¢ï¼æä»¶æ¯è¾å¤§
- ä¼ç¹ï¼æ°æ®å®æ´
146.å举redisæ¯æçè¿æçç¥ã
voltile-lruï¼ ä»å·²è®¾ç½®è¿ææ¶é´çæ°æ®éï¼server.db[i].expiresï¼ä¸æéæè¿é¢çæå°æ°æ®æ·æ±°
volatile-ttlï¼ ä»å·²è®¾ç½®è¿ææ¶é´çæ°æ®éï¼server.db[i].expiresï¼ä¸æéå°è¦è¿æçæ°æ®æ·æ±°
volatile-randomï¼ä»å·²è®¾ç½®è¿ææ¶é´çæ°æ®éï¼server.db[i].expiresï¼ä¸ä»»æéæ©æ°æ®æ·æ±°
allkeys-lruï¼ ä»æ°æ®éï¼server.db[i].dictï¼ä¸æéæè¿æå°ä½¿ç¨çæ°æ®æ·æ±°
allkeys-randomï¼ ä»æ°æ®éï¼server.db[i].dictï¼ä¸ä»»æéæ©æ°æ®æ·æ±°
no-envictionï¼é©±éï¼ï¼ç¦æ¢é©±éæ°æ®
147.MySQL éæ 2000w æ°æ®ï¼redis ä¸åªå 20w çæ°æ®ï¼å¦ä½ä¿è¯ redis ä¸é½æ¯çç¹æ°æ®ï¼
ç¸å
³ç¥è¯ï¼redis å
åæ°æ®é大å°ä¸åå°ä¸å®å¤§å°çæ¶åï¼å°±ä¼æ½è¡æ°æ®æ·æ±°çç¥ï¼åæ¶çç¥ï¼ãredis æä¾ 6ç§æ°æ®æ·æ±°çç¥ï¼
volatile-lruï¼ä»å·²è®¾ç½®è¿ææ¶é´çæ°æ®éï¼server.db[i].expiresï¼ä¸æéæè¿æå°ä½¿ç¨çæ°æ®æ·æ±°
volatile-ttlï¼ä»å·²è®¾ç½®è¿ææ¶é´çæ°æ®éï¼server.db[i].expiresï¼ä¸æéå°è¦è¿æçæ°æ®æ·æ±°
volatile-randomï¼ä»å·²è®¾ç½®è¿ææ¶é´çæ°æ®éï¼server.db[i].expiresï¼ä¸ä»»æéæ©æ°æ®æ·æ±°
allkeys-lruï¼ä»æ°æ®éï¼server.db[i].dictï¼ä¸æéæè¿æå°ä½¿ç¨çæ°æ®æ·æ±°
allkeys-randomï¼ä»æ°æ®éï¼server.db[i].dictï¼ä¸ä»»æéæ©æ°æ®æ·æ±°
no-envictionï¼é©±éï¼ï¼ç¦æ¢é©±éæ°æ®
148.å代ç ï¼åºäºredisçå表å®ç° å è¿å åºãåè¿å åºéåãä¼å 级éåã
åçscriptâredisæºç
from scrapy.utils.reqser import request_to_dict, request_from_dict
from . import picklecompat
class Base(object):
âââPer-spider base queue classâ""
def __init__(self, server, spider, key, serializer=None):
"""Initialize per-spider redis queue.
Parameters
----------
server : StrictRedis
Redis client instance.
spider : Spider
Scrapy spider instance.
key: str
Redis key where to put and get messages.
serializer : object
Serializer object with ``loads`` and ``dumps`` methods.
"""
if serializer is None:
# Backward compatibility.
# TODO: deprecate pickle.
serializer = picklecompat
if not hasattr(serializer, 'loads'):
raise TypeError("serializer does not implement 'loads' function: %r"
% serializer)
if not hasattr(serializer, 'dumps'):
raise TypeError("serializer '%s' does not implement 'dumps' function: %r"
% serializer)
self.server = server
self.spider = spider
self.key = key % {'spider': spider.name}
self.serializer = serializer
def _encode_request(self, request):
"""Encode a request object"""
obj = request_to_dict(request, self.spider)
return self.serializer.dumps(obj)
def _decode_request(self, encoded_request):
"""Decode an request previously encoded"""
obj = self.serializer.loads(encoded_request)
return request_from_dict(obj, self.spider)
def __len__(self):
"""Return the length of the queue"""
raise NotImplementedError
def push(self, request):
"""Push a request"""
raise NotImplementedError
def pop(self, timeout=0):
"""Pop a request"""
raise NotImplementedError
def clear(self):
"""Clear queue/stack"""
self.server.delete(self.key)
class FifoQueue(Base):
âââPer-spider FIFO queueâ""
def __len__(self):
"""Return the length of the queue"""
return self.server.llen(self.key)
def push(self, request):
"""Push a request"""
self.server.lpush(self.key, self._encode_request(request))
def pop(self, timeout=0):
"""Pop a request"""
if timeout > 0:
data = self.server.brpop(self.key, timeout)
if isinstance(data, tuple):
data = data[1]
else:
data = self.server.rpop(self.key)
if data:
return self._decode_request(data)
class PriorityQueue(Base):
âââPer-spider priority queue abstraction using redisâ sorted setâ""
def __len__(self):
"""Return the length of the queue"""
return self.server.zcard(self.key)
def push(self, request):
"""Push a request"""
data = self._encode_request(request)
score = -request.priority
# We don't use zadd method as the order of arguments change depending on
# whether the class is Redis or StrictRedis, and the option of using
# kwargs only accepts strings, not bytes.
self.server.execute_command('ZADD', self.key, score, data)
def pop(self, timeout=0):
"""
Pop a request
timeout not support in this queue class
"""
# use atomic range/remove using multi/exec
pipe = self.server.pipeline()
pipe.multi()
pipe.zrange(self.key, 0, 0).zremrangebyrank(self.key, 0, 0)
results, count = pipe.execute()
if results:
return self._decode_request(results[0])
class LifoQueue(Base):
âââPer-spider LIFO queue.â""
def __len__(self):
"""Return the length of the stack"""
return self.server.llen(self.key)
def push(self, request):
"""Push a request"""
self.server.lpush(self.key, self._encode_request(request))
def pop(self, timeout=0):
"""Pop a request"""
if timeout > 0:
data = self.server.blpop(self.key, timeout)
if isinstance(data, tuple):
data = data[1]
else:
data = self.server.lpop(self.key)
if data:
return self._decode_request(data)
TODO: Deprecate the use of these names.
SpiderQueue = FifoQueue
SpiderStack = LifoQueue
SpiderPriorityQueue = PriorityQueue
149.å¦ä½åºäºrediså®ç°æ¶æ¯éåï¼
# éè¿åå¸è®¢é
模å¼çPUBãSUBå®ç°æ¶æ¯éå
# åå¸è
å叿¶æ¯å°é¢éäºï¼é¢éå°±æ¯ä¸ä¸ªæ¶æ¯éåã
# åå¸è
ï¼
import redis
conn = redis.Redis(host='127.0.0.1',port=6379)
conn.publish('104.9MH', "hahahahahaha")
# 订é
è
ï¼
import redis
conn = redis.Redis(host='127.0.0.1',port=6379)
pub = conn.pubsub()
pub.subscribe('104.9MH')
while True:
msg= pub.parse_response()
print(msg)
对äºï¼redis åæ¶æ¯éåä¸åé
ä¸å¡ä¸é¿å
è¿åº¦å¤ç¨ä¸ä¸ªredisï¼ç¨å®åç¼åãå计ç®ï¼è¿åä»»å¡éåï¼åå太大ï¼ä¸å¥½ã
150.å¦ä½åºäºrediså®ç°åå¸å订é ï¼ä»¥ååå¸è®¢é åæ¶æ¯éåçåºå«ï¼
åå¸å订é ï¼åªè¦æä»»å¡å°±ç»ææè®¢é è æ²¡äººä¸ä»½
åå¸è ï¼ import redisconn = redis.Redis(host='127.0.0.1',port=6379) conn.publish('104.9MH', "hahaha")
订é
è
ï¼
import redis
conn = redis.Redis(host='127.0.0.1',port=6379)
pub = conn.pubsub()
pub.subscribe('104.9MH')
while True:
msg= pub.parse_response()
print(msg)</span></pre>
151.ä»ä¹æ¯codisåä½ç¨ï¼
Codis æ¯ä¸ä¸ªåå¸å¼ Redis è§£å³æ¹æ¡, 对äºä¸å±çåºç¨æ¥è¯´, è¿æ¥å° Codis Proxy åè¿æ¥åçç Redis Server æ²¡æææ¾çåºå«
(䏿¯æçå½ä»¤å表), ä¸å±åºç¨å¯ä»¥å使ç¨åæºç Redis 䏿 ·ä½¿ç¨, Codis åºå±ä¼å¤ç请æ±ç转å, ä¸åæºçæ°æ®è¿ç§»çå·¥ä½,
ææåè¾¹çä¸åäºæ , 对äºåé¢ç客æ·ç«¯æ¥è¯´æ¯éæç, å¯ä»¥ç®åç认为åè¾¹è¿æ¥çæ¯ä¸ä¸ªå åæ é大ç Redis æå¡.
152.ä»ä¹æ¯twemproxyåä½ç¨ï¼
æ¯ Twtter 弿ºçä¸ä¸ª Redis å Memcache 代çæå¡å¨ï¼ä¸»è¦ç¨äºç®¡ç Redis å Memcached é群ï¼
åå°ä¸Cache æå¡å¨ç´æ¥è¿æ¥çæ°éã
153.å代ç å®ç°redisäºå¡æä½ã
import redis
pool = redis.ConnectionPool(host=â10.211.55.4â, port=6379)
conn = redis.Redis(connection_pool=pool)
pipe = r.pipeline(transaction=False)
pipe = conn.pipeline(transaction=True)
å¼å§äºå¡
pipe.multi()
pipe.set(ânameâ, âbendereâ)
pipe.set(âroleâ, âsbâ)
æäº¤
pipe.execute()
注æï¼å¨è¯¢æ¯å¦å½ååå¸å¼redisæ¯å¦æ¯æäºå¡
154.redisä¸çwatchçå½ä»¤çä½ç¨ï¼
å¨Redisçäºå¡ä¸ï¼WATCHå½ä»¤å¯ç¨äºæä¾CAS(check-and-set)åè½ã
å设æä»¬éè¿WATCHå½ä»¤å¨äºå¡æ§è¡ä¹åçæ§äºå¤ä¸ªKeysï¼åè¥å¨WATCHä¹åæä»»ä½Keyçå¼åçäºååï¼
EXECå½ä»¤æ§è¡çäºå¡é½å°è¢«æ¾å¼ï¼åæ¶è¿åNull multi-bulkåºç以éç¥è°ç¨è
äºå¡æ§è¡å¤±è´¥ã
é¢è¯é¢ï¼ä½ å¦ä½æ§å¶å©ä½çæ°éä¸ä¼åºé®é¢ï¼
æ¹å¼ä¸ï¼- éè¿redisçwatchå®ç°
import redis
conn = redis.Redis(host=â127.0.0.1â,port=6379)
# conn.set('count',1000)
val = conn.get('count')
print(val)
with conn.pipeline(transaction=True) as pipe:
# å
çè§ï¼èªå·±ç弿²¡æè¢«ä¿®æ¹è¿
conn.watch('count')
# äºå¡å¼å§
pipe.multi()
old_count = conn.get('count')
count = int(old_count)
print('ç°å¨å©ä½çååæ:%s',count)
input("é®åª³å¦è®©ä¸è®©ä¹°ï¼")
pipe.set('count', count - 1)
# æ§è¡ï¼æææå½ä»¤ä¸æ¬¡æ§æ¨éè¿å»
pipe.execute()
æ¹å¼äº - æ°æ®åºçé </span></pre>
155.åºäºrediså¦ä½å®ç°ååååæ°é计æ°å¨ï¼
import redis
conn = redis.Redis(host=â192.168.1.41â,port=6379)
conn.set(âcountâ,1000)
with conn.pipeline() as pipe:
# å
çè§ï¼èªå·±ç弿²¡æè¢«ä¿®æ¹è¿
conn.watch('count')
# äºå¡å¼å§
pipe.multi()
old_count = conn.get('count')
count = int(old_count)
if count > 0: # æåºå
pipe.set('count', count - 1)
# æ§è¡ï¼æææå½ä»¤ä¸æ¬¡æ§æ¨éè¿å»
pipe.execute()</span></pre>
156.ç®è¿°redisåå¸å¼éåredlockçå®ç°æºå¶ã
å¨ä¸åè¿ç¨éè¦äºæ¥å°è®¿é®å
±äº«èµæºæ¶ï¼åå¸å¼éæ¯ä¸ç§é常æç¨çææ¯ææ®µã
æå¾å¤ä¸æ¹åºåæç« æè¿°å¦ä½ç¨Rediså®ç°ä¸ä¸ªåå¸å¼é管çå¨ï¼ä½æ¯è¿äºåºå®ç°çæ¹å¼å·®å«å¾å¤§
ï¼èä¸å¾å¤ç®åçå®ç°å
¶å®åªééç¨ç¨å¾®å¢å ä¸ç¹å¤æç设计就å¯ä»¥è·å¾æ´å¥½çå¯é æ§ã
ç¨Rediså®ç°åå¸å¼é管çå¨çç®æ³ï¼æä»¬æè¿ä¸ªç®æ³ç§°ä¸ºRedLockã
å®ç°
- åå¼å¹¶è®¾ç½®è¶ æ¶æ¶é´
- è¶ è¿ä¸åçrediså®ä¾è®¾ç½®æåï¼å°±è¡¨ç¤ºå é宿ã
- 使ç¨ï¼å®è£
redlock-py
from redlock import Redlock
dlm = Redlock(
[
{âhostâ: âlocalhostâ, âportâ: 6379, âdbâ: 0},
{âhostâ: âlocalhostâ, âportâ: 6379, âdbâ: 0},
{âhostâ: âlocalhostâ, âportâ: 6379, âdbâ: 0},
]
)
å éï¼acquire
my_lock = dlm.lock(âmy_resource_nameâ,10000)
if my_lock:
# Jè¿è¡æä½
# è§£é,release
dlm.unlock(my_lock)
else:
print(âè·åé失败â)
redisåå¸å¼éï¼
# 䏿¯åæºæä½ï¼åå¤äºä¸/å¤å°æºå¨
# rediså
鍿¯åè¿ç¨ãå线ç¨ï¼æ¯æ°æ®å®å
¨ç(åªæèªå·±ç线ç¨å¨æä½æ°æ®)
----------------------------------------------------------------
\AãBãCï¼ä¸ä¸ªå®ä¾(主)
1ãæ¥äºä¸ä¸ª'éå£èç'è¦æä½ï¼ä¸ä¸æ³è®©å«äººæä½ï¼soï¼å éï¼
å éï¼'éå£èç'èªå·±çæä¸ä¸ªéæºå符串ï¼è®¾ç½®å°AãBãCé(xxx=666)
2ãæ¥äºä¸ä¸ª'é»å±
èæ'è¦æä½AãBãCï¼ä¸è¯»åç°é颿åç¬¦ä¸²ï¼æ¦ï¼è¢«å éäºï¼ä¸è½æä½äºï¼ççå§~
3ã'éå£èç'è§£å³å®é®é¢ï¼ä¸ç¨éäºï¼æAãBãCéçkeyï¼'xxx'å æï¼å®æè§£é
4ã'é»å±
èæ'ç°å¨å¯ä»¥è®¿é®ï¼å¯ä»¥å éäº
# é®é¢ï¼
1ã妿'éå£èç'å éåçªç¶æäºï¼å°±æ²¡äººè§£éï¼å°±æ»éäºï¼å
¶ä»äººå¹²ççæ²¡æ³ç¨ååï¼
2ã妿'éå£èç'å»ç»AãBãCå éçè¿ç¨ä¸ï¼åå å°ï¼¡ï¼'é»å±
èæ'就廿ä½Cäºï¼å éæåor失败ï¼
3ã妿'éå£èç'å»ç»AãBãCå éæ¶ï¼Cçªç¶æäºï¼è¿æ¬¡å 鿝æåè¿æ¯å¤±è´¥ï¼
4ã妿'éå£èç'å»ç»AãBãCå éæ¶ï¼è¶
æ¶æ¶é´ä¸º5ç§ï¼å ä¸ä¸ªéèæ¶3ç§ï¼æ¤æ¬¡å éè½æååï¼
# è§£å³
1ãå®å
¨èµ·è§ï¼è®©'éå£èç'å éæ¶è®¾ç½®è¶
æ¶æ¶é´ï¼è¶
æ¶çè¯å°±ä¼èªå¨è§£é(å é¤keyï¼'xxx')
2ãå éç¨åº¦è¾¾å°ï¼1/2ï¼+1个就表示å éæåï¼å³ä½¿æ²¡æç»å
¨é¨å®ä¾å éï¼
3ãå éç¨åº¦è¾¾å°ï¼1/2ï¼+1个就表示å éæåï¼å³ä½¿æ²¡æç»å
¨é¨å®ä¾å éï¼
4ãä¸è½æåï¼éè¿æ²¡å å®å°±è¿æï¼æ²¡ææä¹äºï¼åºè¯¥åçè®¾ç½®è¿ææ¶é´
# 注æ
使ç¨éè¦å®è£
redlock-py
----------------------------------------------------------------
from redlock import Redlock
dlm = Redlock(
[
{"host": "localhost", "port": 6379, "db": 0},
nbsp; {"host": "localhost", "port": 6379, "db": 0},
{"host": "localhost", "port": 6379, "db": 0},
]
)
# å éï¼acquire
my_lock = dlm.lock("my_resource_name",10000)
if my_lock:
# è¿è¡æä½
# è§£é,release
dlm.unlock(my_lock)
else:
print('è·åé失败')
\éè¿sever.eval(self.unlock_script)æ§è¡ä¸ä¸ªluaèæ¬ï¼ç¨æ¥å é¤å éæ¶çkey
157.ä»ä¹æ¯ä¸è´æ§åå¸ï¼Python䏿¯å¦æç¸åºæ¨¡åï¼
ä¸è´æ§åå¸
ä¸è´æ§hashç®æ³ï¼DHTï¼å¯ä»¥éè¿åå°å½±åèå´çæ¹å¼ï¼è§£å³å¢åæå¡å¨å¯¼è´çæ°æ®æ£åé®é¢ï¼ä»èè§£å³äºåå¸å¼ç¯å¢ä¸è´è½½åè¡¡é®é¢ï¼
妿åå¨çç¹æ°æ®ï¼å¯ä»¥éè¿å¢æ·»èç¹çæ¹å¼ï¼å¯¹çç¹åºé´è¿è¡ååï¼å°åååé
è³å
¶ä»æå¡å¨ï¼éæ°è¾¾å°è´è½½åè¡¡çç¶æã
Python模å--hash_ringï¼å³Pythonä¸çä¸è´æ§hash
158.å¦ä½é«æçæ¾å°redis䏿æä»¥aaaå¼å¤´çkeyï¼
redis æä¸ä¸ªkeyså½ä»¤ã
# è¯æ³ï¼KEYS pattern
# 说æï¼è¿å䏿宿¨¡å¼ç¸å¹é
çæç¨çkeysã
该å½ä»¤ææ¯æçå¹é
模å¼å¦ä¸ï¼
1ã?ï¼ç¨äºå¹é
å个å符ãä¾å¦ï¼h?lloå¯ä»¥å¹é
helloãhalloåhxlloçï¼
2ã*ï¼ç¨äºå¹é
é¶ä¸ªæè
å¤ä¸ªå符ãä¾å¦ï¼h*lloå¯ä»¥å¹é
hlloåheeeelloçï¼
2ã[]ï¼å¯ä»¥ç¨æ¥æå®æ¨¡å¼çéæ©åºé´ãä¾å¦h[ae]lloå¯ä»¥å¹é
helloåhalloï¼ä½æ¯ä¸è½å¹é
hilloãåæ¶ï¼å¯ä»¥ä½¿ç¨â/âç¬¦å·æ¥è½¬ä¹ç¹æ®çå符
# 注æ
KEYS çé度é常快ï¼ä½å¦ææ°æ®å¤ªå¤§ï¼å
åå¯è½ä¼å´©æï¼
妿éè¦ä»ä¸ä¸ªæ°æ®é䏿¥æ¾ç¹å®çkeyï¼æå¥½è¿æ¯ç¨Redisçéåç»æ(set)æ¥ä»£æ¿ã
第åé¨å åç«¯ãæ¡æ¶åå ¶ä»ï¼155é¢ï¼
1.è°è°ä½ 对httpåè®®ç认è¯ã
ããæµè§å¨æ¬è´¨,socket客æ·ç«¯éµå¾ªHttpåè®®
ããHTTPåè®®æ¬è´¨ï¼éè¿\r\nåå²çè§è+ 请æ±ååºä¹åæå¼é¾æ¥ == > æ ç¶æã çè¿æ¥
å
·ä½ï¼
ããHttpåè®®æ¯å»ºç«å¨tcpä¹ä¸çï¼æ¯ä¸ç§è§èï¼å®è§èå®äºåéçæ°æ®çæ°æ®æ ¼å¼ï¼
ç¶èè¿ä¸ªæ°æ®æ ¼å¼æ¯éè¿\r\n è¿è¡åå²çï¼è¯·æ±å¤´ä¸è¯·æ±ä½ä¹æ¯éè¿2个\r\nåå²çï¼ååºçæ¶åï¼
ååºå¤´ä¸ååºä½ä¹æ¯éè¿\r\nåå²ï¼å¹¶ä¸è¿è§å®å·²è¯·æ±å·²ååºå°±ä¼æå¼é¾æ¥
å³---> çè¿æ¥ãæ ç¶æ
2.è°è°ä½ 对websocketåè®®ç认è¯ã
websocketæ¯ç»æµè§å¨æ°å»ºçä¸å¥ï¼ç±»ä¼¼ä¸httpï¼åè®®ï¼åè®®è§å®ï¼ï¼\r\nåå²ï¼æµè§å¨åæå¡å¨è¿æ¥ä¹å䏿å¼ï¼
ãããã以æ¤å®æï¼æå¡ç«¯å客æ·ç«¯ä¸»å¨æ¨éæ¶æ¯ã
websocketåè®®é¢å¤åçä¸äºæä½
æ¡æ ----> è¿æ¥é±è¿è¡æ ¡éª
å å¯ ----> payload_len=127/126/<=125 --> mask key
æ¬è´¨
å建ä¸ä¸ªè¿æ¥å䏿å¼çsocket
å½è¿æ¥æåä¹åï¼
客æ·ç«¯ï¼æµè§å¨ï¼ä¼èªå¨åæå¡ç«¯åéæ¶æ¯ï¼å
å«ï¼ Sec-WebSocket-Key: iyRe1KMHi4S4QXzcoboMmw==
æå¡ç«¯æ¥æ¶ä¹åï¼ä¼å¯¹äºè¯¥æ°æ®è¿è¡å å¯ï¼base64(sha1(swk + magic_string))
æé ååºå¤´ï¼
HTTP/1.1 101 Switching Protocols\r\n
Upgrade:websocket\r\n
Connection: Upgrade\r\n
Sec-WebSocket-Accept: å å¯åçå¼\r\n
WebSocket-Location: ws://127.0.0.1:8002\r\n\r\n
åç»å®¢æ·ç«¯ï¼æµè§å¨ï¼
建ç«ï¼åå·¥ééï¼æ¥ä¸æ¥å°±å¯ä»¥è¿è¡æ¶åæ°æ®
åéæ°æ®æ¯å å¯ï¼è§£å¯ï¼æ ¹æ®payload_lençå¼è¿è¡å¤ç
payload_len <= 125
payload_len == 126
payload_len == 127
è·åå
容ï¼
mask_key
æ°æ®
æ ¹æ®mask_keyåæ°æ®è¿è¡ä½è¿ç®ï¼å°±å¯ä»¥æå¼è§£æåºæ¥ã
3.ä»ä¹æ¯magic string ï¼
客æ·ç«¯åæå¡ç«¯åéæ¶æ¯æ¶ï¼ä¼æä¸ä¸ª'sec-websocket-key'å'magic string'çéæºå符串(éæ³å符串)
# æå¡ç«¯æ¥æ¶å°æ¶æ¯å伿ä»ä»¬è¿æ¥æä¸ä¸ªæ°çkey串ï¼è¿è¡ç¼ç ãå å¯ï¼ç¡®ä¿ä¿¡æ¯çå®å
¨æ§
4.å¦ä½å建ååºå¼å¸å±ï¼
ååºå¼å¸å±æ¯éè¿@mediaå®ç°ç
@media ï¼min-widthï¼768pxï¼{
.pg-header{
background-color:green;
}
}
@media (min-width:992px){
.pg-header{
background-color:pink;
}
}
代ç
<!DOCTYPE html>
<html lang=âenâ>
<head>
<meta charset=âUTF-8â>
<meta http-equiv=âX-UA-Compatibleâ content=âIE=edgeâ>
<meta name=âviewportâ content=âwidth=device-width, initial-scale=1â>
<title>Title</title>
<style>
body{
margin: 0;
}
.pg-header{
background-color: red;
height: 48px;
}
@media (min-width: 768px) <span>{
.pg-header{
background-color<span>: aqua<span>;
<span>}
}
@media (min-width: 992px) <span>{
.pg-header{
background-color<span>: blueviolet<span>;
<span>}
}
</style>
</head>
<body>
<div class=âpg-headerâ></div>
</body>
</html>
5.ä½ æ¾ç»ä½¿ç¨è¿åªäºåç«¯æ¡æ¶ï¼
jQuery
- BootStrap
- Vue.js(ä¸vueé½åçåç«¯æ¡æ¶ReactåAngular)
6.ä»ä¹æ¯ajax请æ±ï¼å¹¶ä½¿ç¨jQueryåXMLHttpRequest对象å®ç°ä¸ä¸ªajax请æ±ã
http://www.cnblogs.com/wupeiqi/articles/5703697.html
7.å¦ä½å¨å端å®ç°è½®è®ï¼
轮询ï¼éè¿å®æ¶å¨è®©ç¨åºæ¯énç§æ§è¡ä¸æ¬¡æä½ã
<!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Title</title> </head> <body> <h1>请éåºæå¸ çç·äºº</h1> <ul> {% for k,v in gg.items() %} <li>ID:{{ k }}, å§åï¼{{ v.name }} ï¼ç¥¨æ°ï¼{{ v.count }}</li> {% endfor %} </ul><script><span> setInterval(function<span> () { location.reload(); },<span>2000<span>) </script>
</body>
</html>
8.å¦ä½å¨å端å®ç°é¿è½®è®ï¼
客æ·ç«¯åæå¡å¨åé请æ±ï¼æå¡å¨æ¥å°è¯·æ±åhangä½è¿æ¥ï¼çå¾
30ç§ï¼30sè¿ååéæ°å起请æ±ï¼
ç´å°ææ°æ¶æ¯æè¿åååºä¿¡æ¯å¹¶å
³éè¿æ¥ï¼å®¢æ·ç«¯å¤çå®ååºä¿¡æ¯åååæå¡å¨åéæ°ç请æ±ã
<!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Title</title> </head> <body> <h1>请éåºæå¸ çç·äºº</h1> <ul> {% for k,v in gg.items() %} <li style="cursor: pointer" id="user_{{ k }}" "vote({{ k }});">ID:{{ k }}, å§åï¼{{ v.name }} ï¼ç¥¨æ°ï¼<span>{{ v.count }}</span></li> {% endfor %} </ul><script src="/static/jquery-3.3.1.min.js"></script> <script><span> $(function<span> () { get_new_count(); }); function<span> get_new_count() { $.ajax({ url: <span>'<span>/get_new_count<span>'<span>, type:<span>'<span>GET<span>'<span>, dataType:<span>'<span>JSON<span>'<span>, success:function<span> (arg) { if<span> (arg.status){ // æ´æ°ç¥¨æ° var<span> gid <span>= <span>"<span>#user_<span>" <span>+<span> arg.data.gid; $(gid).find(<span>'<span>span<span>'<span>).text(arg.data.count); }else<span>{ // 10så æ²¡æäººæç¥¨
}
get_new_count();
}
})
}
function<span> vote(gid) {
$.ajax({
url: <span>'<span>/vote<span>'<span>,
type:<span>'<span>POST<span>'<span>,
data:{gid:gid},
dataType:<span>"<span>JSON<span>"<span>,
success:function<span> (arg) {
}
})
}
</script>
</body>
</html>
9.vuexçä½ç¨ï¼
å¤ç»ä»¶ä¹é´å
±äº«ï¼vuex
è¡¥å
luffyvue
1:router-link / router-view
2:ååç»å®ï¼ç¨æ·ç»å®v-model
3ï¼å¾ªç¯å±ç¤ºè¯¾ç¨ï¼v-for
4ï¼è·¯ç±ç³»ç»ï¼æ·»å 卿忰
5ï¼cookieæä½ï¼vue-cookies
6ï¼å¤ç»ä»¶ä¹é´å
±äº«ï¼vuex
7ï¼åéajax请æ±ï¼axios (js模å)
10.vueä¸çè·¯ç±çæ¦æªå¨çä½ç¨ï¼
vue-resourceçinterceptorsæ¦æªå¨çä½ç¨æ£æ¯è§£å³æ¤éæ±ç妿¹ã
卿¯æ¬¡httpç请æ±ååºä¹åï¼å¦æè®¾ç½®äºæ¦æªå¨å¦ä¸ï¼ä¼ä¼å æ§è¡æ¦æªå¨å½æ°ï¼è·åååºä½ï¼ç¶åæä¼å³å®æ¯å¦æresponseè¿åç»thenè¿è¡æ¥æ¶
11.axiosçä½ç¨ï¼
åéajax请æ±ï¼axios (js模å)
12.å举vueçå¸¸è§æä»¤ã
1ãv-ifæä»¤:夿æä»¤ï¼æ ¹æ®è¡¨è¾¾å¼å¼å¾ç忥æå
¥æå é¤ç¸åºçå¼ã
2ãv-showæä»¤:æ¡ä»¶æ¸²ææä»¤ï¼æ 论è¿åçå¸å°å¼æ¯trueè¿æ¯falseï¼å
ç´ é½ä¼åå¨å¨htmlä¸ï¼åªæ¯falseçå
ç´ ä¼éèå¨htmlä¸ï¼å¹¶ä¸ä¼å é¤.
3ãv-elseæä»¤:é
åv-ifæv-else使ç¨ã
4ãv-foræä»¤:å¾ªç¯æä»¤ï¼ç¸å½äºéåã
5ãv-bind:ç»DOMç»å®å
ç´ å±æ§ã
6ãv-onæä»¤:çå¬DOMäºä»¶ã
13.ç®è¿°jsonpåå®ç°åçï¼
JSONP
jsonpæ¯jsonç¨æ¥è·¨åçä¸ä¸ªä¸è¥¿ãåçæ¯éè¿scriptæ ç¾çè·¨åç¹æ§æ¥ç»è¿åæºçç¥ã
JSONPçç®åå®ç°æ¨¡å¼ï¼æè
说æ¯JSONPçååï¼å建ä¸ä¸ªåè°å½æ°ï¼ç¶åå¨è¿ç¨æå¡ä¸è°ç¨è¿ä¸ªå½æ°å¹¶ä¸å°JSON æ°æ®å½¢å¼ä½ä¸ºåæ°ä¼ éï¼
宿åè°ã
14.ä»ä¹æ¯cors ï¼
CORS
æµè§å¨å°CORS请æ±åæä¸¤ç±»ï¼ç®å请æ±åèµå¤æè¯·æ±
ç®å请æ±(åæ¶æ»¡è¶³ä»¥ä¸ä¸¤å¤§æ¡ä»¶)
ï¼1ï¼è¯·æ±æ¹æ³æ¯ä»¥ä¸ä¸ç§æ¹æ³ä¹ä¸:
HEAD
GET
POST
ï¼2ï¼HTTPç头信æ¯ä¸è¶
åºä»¥ä¸å ç§å段ï¼
Accept
Accept-Language
Content-Language
Last-Event-ID
Content-Type ï¼åªéäºä¸ä¸ªå¼application/x-www-form-urlencodedãmultipart/form-dataãtext/plain
塿¯ä¸åæ¶æ»¡è¶³ä¸é¢ä¸¤ä¸ªæ¡ä»¶ï¼å°±å±äºéç®å请æ±
15.å举Http请æ±ä¸å¸¸è§çè¯·æ±æ¹å¼ï¼
GETãPOSTã
PUTãpatchï¼ä¿®æ¹æ°æ®ï¼
HEAD(类似äºget请æ±ï¼åªä¸è¿è¿åçååºä¸æ²¡æå
·ä½çå
容ï¼ç¨äºè·åæ¥å¤´)
DELETE
ä¼ å¼ä»£ç f
Request.QueryStringæ¹æ³é对æ§ä»¶id
Request.Formæ¹æ³é对æ§ä»¶åç§°name
16.å举Http请æ±ä¸çç¶æç ï¼
åç±»ï¼
1** ä¿¡æ¯ï¼æå¡å¨æ¶å°è¯·æ±ï¼éè¦è¯·æ±è
ç»§ç»æ§è¡æä½
2** æåï¼æä½è¢«æåæ¥æ¶å¹¶å¤ç
3** éå®åï¼éè¦è¿ä¸æ¥çæä½ä»¥å®æè¯·æ±
4** 客æ·ç«¯é误ï¼è¯·æ±å
å«è¯æ³éè¯¯ææ æ³å®æè¯·æ±
5** æå¡å¨éè¯¯ï¼æå¡å¨å¨å¤ç请æ±çè¿ç¨ä¸åçäºé误
常è§çç¶æç
200 -è¯·æ±æå
202 -å·²æ¥å请æ±ï¼å°æªå¤ç
204 -è¯·æ±æåï¼ä¸ä¸éè¿åå
容
301 - èµæºï¼ç½é¡µçï¼è¢«æ°¸ä¹
转移å°å
¶ä»url
400 - 请æ±çè¯ä¹ææ¯åæ°æé
403 - æå¡å¨æç»è¯·æ±
404 - 请æ±èµæºï¼ç½é¡µï¼ä¸åå¨
500 - å
鍿å¡å¨é误
502 - ç½å
³é误ï¼ä¸è¬æ¯æå¡å¨ååè¿å¤§å¯¼è´è¿æ¥è¶
æ¶
503 - ç±äºè¶
è½½æç³»ç»ç»´æ¤ï¼æå¡å¨ææ¶çæ æ³å¤ç客æ·ç«¯ç请æ±ã
17.å举Http请æ±ä¸å¸¸è§ç请æ±å¤´ï¼
- user-agent
- host
- referer
- cookie
- content-type
18.çå¾åç»æï¼jsï¼ï¼
ææ°
çå¾åç»æï¼jsï¼ï¼
æ¦æ²å¥
çå¾åç»æï¼ï¼jsï¼
èç·å©
çå¾åç»æï¼ï¼jsï¼
undefined
çå¾åç»æï¼ï¼jsï¼
æ¦æ²å¥
çå¾åç»æï¼ï¼jsï¼
Alex
19.djangoãflaskãtornadoæ¡æ¶çæ¯è¾ï¼
对äºdjangoï¼å¤§èå
¨çæ¡æ¶å®çå
é¨ç»ä»¶æ¯è¾å¤ï¼å
鍿ä¾ï¼ORMãAdminãä¸é´ä»¶ãFormãModelFormãSessionã
ç¼åãä¿¡å·ãCSRFï¼åè½ä¹é½æºå®åç
- flaskï¼å¾®åæ¡æ¶ï¼å
é¨ç»ä»¶å°±æ¯è¾å°äºï¼ä½æ¯æå¾å¤ç¬¬ä¸æ¹ç»ä»¶æ¥æ©å±å®ï¼
ããæ¯å¦è¯´æé£ä¸ªwtformï¼ä¸djangoçmodelform类似ï¼è¡¨åéªè¯ï¼ãflask-sqlalchemyï¼æä½æ°æ®åºçï¼ã
ããflask-sessionãflask-migrateãflask-scriptãblinker坿©å±å¼ºï¼ç¬¬ä¸æ¹ç»ä»¶ä¸°å¯ãæä»¥å¯¹ä»æ¬èº«æ¥è¯´æé£ç§çå°ç²¾æçæè§ - tornadoï¼å¼æ¥éé»å¡ã
djangoåflaskçå
±åç¹å°±æ¯ï¼ä»ä»¬2ä¸ªæ¡æ¶é½æ²¡æåsocketï¼æä»¥ä»ä»¬é½æ¯å©ç¨ç¬¬ä¸æ¹æ¨¡åwsgiã
使¯å
é¨ä½¿ç¨çwsgi乿¯æäºä¸åçï¼djangoæ¬èº«è¿è¡èµ·æ¥ä½¿ç¨wsgirefï¼èflask使ç¨werkzeug wsgi
è¿æä¸ä¸ªåºå«å°±æ¯ä»ä»¬ç请æ±ç®¡çä¸å¤ªä¸æ ·ï¼djangoæ¯éè¿å°è¯·æ±å°è£
ærequest对象ï¼åéè¿åæ°ä¼ éï¼èflaskæ¯éè¿ä¸ä¸æç®¡çæºå¶
Tornado
# æ¯ä¸ä¸ªè½»é级çWebæ¡æ¶ï¼å¼æ¥éé»å¡+å ç½®WebSocketåè½ã
'ç®æ 'ï¼éè¿ä¸ä¸ªçº¿ç¨å¤çN个并å请æ±(å¤çIO)ã
'å é¨ç»ä»¶
#å é¨èªå·±å®ç°socket
#è·¯ç±ç³»ç»
#è§å¾
#模æ¿
ãã #cookie
#csrf
20.ä»ä¹æ¯wsgiï¼
æ¯webæå¡ç½å
³æ¥å£ï¼æ¯ä¸å¥åè®®ã
æ¯éè¿ä»¥ä¸æ¨¡åå®ç°äºwsgiåè®®ï¼
- wsgiref
- werkzurg
- uwsgi å
³äºé¨ç½²
以䏿¨¡åæ¬è´¨ï¼ç¼åsocketæå¡ç«¯ï¼ç¨äºçå¬è¯·æ±ï¼å½æè¯·æ±å°æ¥ï¼åå°è¯·æ±æ°æ®è¿è¡å°è£
ï¼ç¶å交ç»webæ¡æ¶å¤çã
21.django请æ±ççå½å¨æï¼
ç¨æ·è¯·æ±è¿æ¥å èµ°å° wsgi ç¶åå°è¯·æ±äº¤ç» jangoçä¸é´ä»¶ ç©¿è¿djangoä¸é´ä»¶ï¼æ¹æ³æ¯process_requestï¼
æ¥çå°±æ¯ è·¯ç±å¹é è·¯ç±å¹é æåä¹åå°±æ§è¡ç¸åºç è§å¾å½æ°
å¨è§å¾å½æ°ä¸å¯ä»¥è°ç¨ormåæ°æ®åºæä½ å仿¨¡æ¿è·¯å¾ å°æ¨¡æ¿æ¿å° ç¶åå¨åå°è¿è¡æ¨¡æ¿æ¸²æ
æ¨¡æ¿æ¸²æå®æä¹åå°±åæä¸ä¸ªå符串 åæè¿ä¸ªå符串ç»è¿ææä¸é´ä»¶ï¼æ¹æ³ï¼process_responseï¼ åwsgi è¿åç»ç¨æ·
22.å举djangoçå ç½®ç»ä»¶ï¼
form ç»ä»¶
- å¯¹ç¨æ·è¯·æ±çæ°æ®è¿è¡æ ¡éª
- çæHTMLæ ç¾
PSï¼
-
form对象æ¯ä¸ä¸ªå¯è¿ä»£å¯¹è±¡ã
-
é®é¢ï¼choiceçæ°æ®å¦æä»æ°æ®åºè·åå¯è½ä¼é ææ°æ®æ æ³å®æ¶æ´æ°
- éåæé æ¹æ³ï¼å¨æé æ¹æ³ä¸éæ°å»æ°æ®åºè·åå¼ã
- ModelChoiceFieldåæ®µ
from django.forms import Form
from django.forms import fields
from django.forms.models import ModelChoiceField
class UserForm(Form):
name = fields.CharField(label=âç¨æ·åâ,max_length=32)
email = fields.EmailField(label=âé®ç®±â)
ut_id = ModelChoiceField(queryset=models.UserType.objects.all())ä¾èµï¼ class UserType(models.Model): title = models.CharField(max_length=32) def __str__(self): return self.title</span></pre>
ä¿¡å·ã
djangoçä¿¡å·å
¶å®å°±æ¯djangoå
é¨ä¸ºå¼åè
é¢ççä¸äºèªå®å¶åè½çé©åã
åªè¦å¨æä¸ªä¿¡å·ä¸æ³¨åäºå½æ°ï¼é£ä¹djangoå
鍿§è¡çè¿ç¨ä¸å°±ä¼èªå¨è§¦å注åå¨ä¿¡å·ä¸ç彿°ã
å¦ï¼
pre_init # djangoçmodalæ§è¡å
¶æé æ¹æ³åï¼èªå¨è§¦å
post_init # djangoçmodalæ§è¡å
¶æé æ¹æ³åï¼èªå¨è§¦å
pre_save # djangoçmodal对象ä¿ååï¼èªå¨è§¦å
post_save # djangoçmodal对象ä¿ååï¼èªå¨è§¦å
åºæ¯:
卿°æ®åºæäºè¡¨ä¸æ·»å æ°æ®æ¶ï¼å¯ä»¥è¿è¡æ¥å¿è®°å½ã
CSRFã
ç®æ ï¼é²æ¢ç¨æ·ç´æ¥åæå¡ç«¯åèµ·POST请æ±ã
对ææçpost请æ±åéªè¯/ å°jangoçæçä¸ä¸²å符串åéç»æä»¬ï¼ä¸ç§æ¯ä»è¯·æ±ä½åè¿æ¥ï¼ä¸ç§æ¯æ¾å¨éèçæ ç¾éé¢ç¨çæ¯process_viewã
æ¹æ¡ï¼å
åéGETè¯·æ±æ¶ï¼å°tokenä¿åå°ï¼cookieãForm表åä¸ï¼éèçinputæ ç¾ï¼ï¼
以åååéè¯·æ±æ¶åªè¦æºå¸¦è¿æ¥å³å¯ã
ContentType
contenttypeæ¯djangoçä¸ä¸ªç»ä»¶ï¼appï¼ï¼
为æä»¬æ¾å°djangoç¨åºä¸ææappä¸çææè¡¨å¹¶æ·»å å°è®°å½ä¸ã
å¯ä»¥ä½¿ç¨ä»åå ä¸è¡¨ä¸çä¸¤ä¸ªåæ®µå®ç°ï¼ä¸å¼ 表åNå¼ è¡¨å建FKå
³ç³»ã - åæ®µï¼è¡¨åç§° - åæ®µï¼æ°æ®è¡ID
åºç¨ï¼è·¯é£è¡¨ç»æä¼æ å¸åä¸é¢è¯¾åå¦ä½è¯¾å
³èã
ä¸é´ä»¶
对ææç请æ±è¿è¡æ¹éå¤çï¼å¨è§å¾å½æ°æ§è¡ååè¿è¡èªå®ä¹æä½ã
åºç¨ï¼ç¨æ·ç»å½æ ¡éª
é®é¢ï¼ä¸ºçä¹ä¸ä½¿ç¨è£
饰å¨ï¼
妿ä¸ä½¿ç¨ä¸é´ä»¶ï¼å°±éè¦ç»æ¯ä¸ªè§å¾å½æ°æ·»å è£
饰å¨ï¼å¤ªç¹ç
æéç»ä»¶:
ç¨æ·ç»å½åï¼å°æéæ¾å°sessionä¸ï¼ç¶ååæ¯æ¬¡è¯·æ±è¿æ¥å¨ä¸é´ä»¶éï¼æ ¹æ®å½åçurlå»sessionä¸å¹é
ï¼
夿å½åç¨æ·æ¯å¦ææé访é®å½åurl,ææé就继ç»è®¿é®ï¼æ²¡æå°±è¿åï¼
ï¼æ£æ¥çä¸è¥¿å°±å¯ä»¥æ¾å°ä¸é´ä»¶ä¸è¿è¡ç»ä¸å¤çï¼å¨process_requestæ¹æ³éé¢åçï¼
ãæä»¬çä¸é´ä»¶æ¯æ¾å¨sessionåé¢ï¼å 为ä¸é´ä»¶éè¦å°sessionéé¢åæ°æ®
session
cookieä¸sessionåºå«
ï¼aï¼cookieæ¯ä¿å卿µè§å¨ç«¯çé®å¼å¯¹ï¼èsessionæ¯ä¿åçæå¡å¨ç«¯çé®å¼å¯¹ï¼ä½æ¯ä¾èµcookieã
ï¼ä¹å¯ä»¥ä¸ä¾èµcookieï¼å¯ä»¥æ¾å¨urlï¼æè¯·æ±å¤´ä½æ¯cookieæ¯è¾æ¹ä¾¿ï¼
ï¼bï¼ä»¥ç»å½ä¸ºä¾ï¼cookie为éè¿ç»å½æååï¼è®¾ç½®ææçé®å¼å¯¹ï¼å¹¶å°é®å¼å¯¹åé客æ·ç«¯åï¼ææä¿¡æ¯å¯è½å卿³æ¼ï¼ä¸å®å
¨ï¼
ããsession忝çæéæºå符串ï¼åç»ç¨æ·ï¼å¹¶åå°æµè§å¨çcookieä¸ï¼åæ¶æå¡å¨èªå·±ä¹ä¼ä¿åä¸ä»½ã
ï¼cï¼å¨ç»å½éªè¯æ¶ï¼cookieï¼æ ¹æ®æµè§å¨åéè¯·æ±æ¶é带çcookieçé®å¼å¯¹è¿è¡å¤æï¼å¦æåå¨ï¼åéªè¯éè¿ï¼
ããsessionï¼å¨è¯·æ±ç¨æ·çcookieä¸è·åéæºåç¬¦ä¸²ï¼æ ¹æ®éæºå符串å¨sessionä¸è·åå
¶å¯¹åºçå¼è¿è¡éªè¯
corsè·¨åï¼åºæ¯ï¼åå端å离æ¶ï¼æ¬å°æµè¯å¼åæ¶ä½¿ç¨ï¼
妿ç½ç«ä¹é´åå¨è·¨åï¼ååä¸åï¼ç«¯å£ä¸åä¼å¯¼è´åºç°è·¨åï¼ä½å¡åºç°è·¨åï¼æµè§å¨å°±ä¼åºç°åæºçç¥çéå¶
è§£å³ï¼å¨æä»¬çæå¡ç«¯ç»æä»¬ååºæ°æ®ï¼å ä¸ååºå¤´---> å¨ä¸é´ä»¶å ç
ç¼å/
常ç¨çæ°æ®æ¾å¨ç¼åéé¢ï¼å°±ä¸ç¨èµ°è§å¾å½æ°ï¼è¯·æ±è¿æ¥éè¿ææçprocess_request,ä¼å°ç¼åé颿¥æ°æ®ï¼æå°±ç´æ¥æ¿ï¼
ããããããããæ²¡æå°±èµ°è§å¾å½æ°
ããããããå ³é®ç¹ï¼1ï¼æ§è¡å®ææçprocess_requestæå»ç¼ååæ°æ®
ãããããããããã2ï¼æ§è¡å®ææçprocess_responseæå°æ°æ®æ¾å°ç¼å
å
³äºç¼åé®é¢
1:为ä»ä¹æ¾å¨æåä¸ä¸ªprocess_requestæå»ç¼å
å 为éè¦éªè¯å®ç¨æ·ç请æ±ï¼æè½è¿åæ°æ®
2:ä»ä¹æ¶åå°æ°æ®æ¾å°ç¼åä¸
ç¬¬ä¸æ¬¡èµ°ä¸é´ä»¶ï¼ç¼åæ²¡ææ°æ®ï¼ä¼èµ°è§å¾å½æ°ï¼åæ°æ®åºéé¢åæ°æ®ï¼
å½èµ°å®process_response,æå°æ°æ®æ¾å°ç¼åéï¼å 为ï¼èµ°process_responseçæ¶åå¯è½ç»æä»¬çååºå å¤ç
为ä»ä¹ä½¿ç¨ç¼å
å°å¸¸ç¨ä¸ä¸å¤ªé¢ç¹ä¿®æ¹çæ°æ®æ¾å
¥ç¼åã
以åç¨æ·åæ¥è®¿é®ï¼å
å»ç¼åæ¥çæ¯å¦åå¨ï¼å¦ææå°±è¿å
å¦åï¼å»æ°æ®åºä¸è·åå¹¶è¿åç»ç¨æ·ï¼åå å
¥å°ç¼åï¼ä»¥ä¾¿ä¸æ¬¡è®¿é®ï¼
23.å举djangoä¸é´ä»¶ç5ä¸ªæ¹æ³ï¼ä»¥ådjangoä¸é´ä»¶çåºç¨åºæ¯ï¼
process_request(self,request) å
èµ°request éè¿è·¯ç±å¹é
è¿å
process_view(self, request, callback, callback_args, callback_kwargs) åè¿åæ§è¡view
process_template_response(self,request,response) å½è§å¾å½æ°çè¿åå¼
process_exception(self, request, exception) å½è§å¾å½æ°çè¿åå¼å¯¹è±¡ä¸ærenderæ¹æ³æ¶ï¼è¯¥æ¹æ³æä¼è¢«è°ç¨
process_response(self, request, response)
æ§è¡æµç¨
24.ç®è¿°ä»ä¹æ¯FBVåCBVï¼
FBV åºäºå½æ°
# FBV åæ³
# urls.py
url(r'^login/$',views.login, name="login"),
views.py
def login(request):
if request.method == âPOSTâ:
print(request.POST)
return render(request,"login.html")
HTML
<!DOCTYPE html>
<html lang=âenâ>
<head>
<meta charset=âUTF-8â>
<meta http-equiv=âX-UA-Compatibleâ content=âIE=edgeâ>
<meta name=âviewportâ content=âwidth=device-width, initial-scale=1â>
<title>ç»å½é¡µé¢</title>
</head>
<body>
<form action="{% url âloginâ %}" method=âpostâ enctype=âmultipart/form-dataâ>
<input type=âtextâ name=âuser2â>
<input type=âfileâ name=âfileâ>
<input type=âsubmitâ value=âæäº¤â>
</form>
</body>
</html>
CBV åºäºç±»
urls.py
url(râ^login/$â,views.Login.as_view(), name=âloginâ),
views.py
from django.views import View
class Login(View): # ç±»é¦åæ¯å¤§å
def get(self,request):
return render(request,âlogin.htmlâ)
def post(self,request):
print(request.POST)
return HttpResponse(âOKâ)
å è£ é¥°å¨
=================================
class IndexView(View):
# 妿æ¯crsfç¸å
³ï¼å¿
é¡»æ¾å¨æ¤å¤
def dispach(self,request):
# éè¿åå°æ§è¡post/get
@method_decoretor(è£
饰å¨å½æ°)
def get(self,request):
pass
def post(self,request):
pass
è·¯ç±ï¼IndexView.as_view()
25.FBVä¸CBVçåºå«
- 没ä»ä¹åºå«ï¼å 为ä»ä»¬çæ¬è´¨é½æ¯å½æ°ãCBVç.as_view()è¿åçview彿°ï¼view彿°ä¸è°ç¨ç±»çdispatchæ¹æ³ï¼
å¨dispatchæ¹æ³ä¸éè¿åå°æ§è¡get/post/delete/putçæ¹æ³ãD
éè¦è¯´åºå«çè¯ï¼
- CBVæ¯è¾ç®æ´ï¼GET/POSTçä¸å¡åè½å嫿¾å¨ä¸åget/post彿°ä¸ãFBVèªå·±å夿è¿è¡åºåã
26.djangoçrequest对象æ¯å¨ä»ä¹æ¶åå建çï¼
å½è¯·æ±ä¸ä¸ªé¡µé¢æ¶, Djangoä¼å»ºç«ä¸ä¸ªå å«è¯·æ±å æ°æ®ç HttpRequest 对象.
å½Django å 载对åºçè§å¾æ¶, HttpRequest对象å°ä½ä¸ºè§å¾å½æ°ç第ä¸ä¸ªåæ°.
æ¯ä¸ªè§å¾ä¼è¿åä¸ä¸ªHttpResponse对象.
27.å¦ä½ç»CBVçç¨åºæ·»å è£ é¥°å¨ï¼
æ·»å è£
饰å¨
æ¹å¼ä¸ï¼
from django.views import View
from django.utils.decorators import method_decorator ---> éè¦å¼å
¥memethod_decorator
def auth(func):
def inner(*args,**kwargs):
return func(*args,**kwargs)
return inner
class UserView(View):
@method_decorator(auth)
def get(self,request,*args,**kwargs):
return HttpResponse(ââ¦â)
æ¹å¼äºï¼
- csrfçè£
饰å¨è¦å å°dispathåé¢
from django.views import View
from django.utils.decorators import method_decorator
from django.views.decorators.csrf import csrf_exempt,csrf_protect â> éè¦å¼å ¥ csrf_exempt
class UserView(View):
@method_decorator(csrf_exempt)
def dispatch(self, request, *args, **kwargs):
return HttpResponse(ââ¦â)
æè
ï¼
from django.views import View
from django.utils.decorators import method_decorator
from django.views.decorators.csrf import csrf_exempt,csrf_protect
@method_decorator(csrf_exempt,name=âdispatchâ) â> æå®åå
class UserView(View):
def dispatch(self, request, *args, **kwargs):
return HttpResponse(ââ¦â)
28.å举django orm 䏿æçæ¹æ³ï¼QuerySetå¯¹è±¡çæææ¹æ³ï¼
è¿åQuerySetå¯¹è±¡çæ¹æ³æï¼
all()
filter()
exclude()
order_by()
reverse()
distinct()
ç¹æ®çQuerySetï¼
values() è¿åä¸ä¸ªå¯è¿ä»£çåå
¸åºå
values_list() è¿åä¸ä¸ªå¯è¿ä»£çå
ç»åºå
è¿åå
·ä½å¯¹è±¡çï¼
get()
first()
last()
è¿åå¸å°å¼çæ¹æ³æï¼
exists()
è¿åæ°åçæ¹æ³æï¼
count()
29.onlyådeferçåºå«ï¼
def defer(self, *fields):
models.UserInfo.objects.defer('username','id')
æ
models.UserInfo.objects.filter(...).defer('username','id')
#æ å°ä¸æé¤æåæ°æ®
def only(self, *fields):
#ä»
åæä¸ªè¡¨ä¸çæ°æ®
models.UserInfo.objects.only(âusernameâ,âidâ)
æ
models.UserInfo.objects.filter(â¦).only(âusernameâ,âidâ)
30.select_relatedåprefetch_relatedçåºå«ï¼
# ä»ä¿©é½ç¨äºè¿è¡¨æ¥è¯¢ï¼åå°SQLæ¥è¯¢æ¬¡æ°
\select_related
select_related主è¦éä¸å¯¹ä¸åå¤å¯¹ä¸å
³ç³»è¿è¡ä¼åï¼éè¿å¤è¡¨joinå
³èæ¥è¯¢ï¼ä¸æ¬¡æ§è·å¾æææ°æ®ï¼
åæ¾å¨å
åä¸ï¼ä½å¦æå
³èç表太å¤ï¼ä¼ä¸¥é影忰æ®åºæ§è½ã
def index(request):
obj = Book.objects.all().select_related("publisher")
return render(request, "index.html", locals())
\prefetch_related
prefetch_relatedæ¯éè¿å表ï¼å
è·ååä¸ªè¡¨çæ°æ®ï¼åæ¾å¨å
åä¸ï¼ç¶åéè¿Pythonå¤çä»ä»¬ä¹é´çå
³èã
def index(request):
obj = Book.objects.all().prefetch_related("publisher")
return render(request, "index.html", locals())
def select_related(self, *fields)
æ§è½ç¸å
³ï¼è¡¨ä¹é´è¿è¡joinè¿è¡¨æä½ï¼ä¸æ¬¡æ§è·åå
³èçæ°æ®ã
model.tb.objects.all().select_related()
model.tb.objects.all().select_related('å¤é®å段')
model.tb.objects.all().select_related('å¤é®å段__å¤é®å段')
def prefetch_related(self, *lookups)
æ§è½ç¸å
³ï¼å¤è¡¨è¿è¡¨æä½æ¶éåº¦ä¼æ
¢ï¼ä½¿ç¨å
¶æ§è¡å¤æ¬¡SQLæ¥è¯¢å¨Python代ç ä¸å®ç°è¿è¡¨æä½ã
# è·åææç¨æ·è¡¨
# è·åç¨æ·ç±»å表where id in (ç¨æ·è¡¨ä¸çæ¥å°çææç¨æ·ID)
models.UserInfo.objects.prefetch_related(âå¤é®å段â)
from django.db.models import<span> Count, Case, When, IntegerField
Article.objects.annotate(
numviews=<span>Count(Case(
When(readership__what_time__lt=treshold, then=1<span>),
output_field=<span>CharField(),
))
)
students = Student.objects.all().annotate(num_excused_absences=<span>models.Sum(
models.Case(
models.When(absence__type='Excused', then=1<span>),
default=<span>0,
output_field=<span>models.IntegerField()
)))</span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
# 1次SQL
# select * from userinfo
objs = UserInfo.obejcts.all()
for item in objs:
print(item.name)
n+1次SQL
select * from userinfo
objs = UserInfo.obejcts.all()
for item in objs:
# select * from usertype where id = item.id
print(item.name,item.ut.title)
select_relatedï¼ï¼
1次SQL
select * from userinfo inner join usertype on userinfo.ut_id = usertype.id
objs = UserInfo.obejcts.all().select_related(âutâ) è¿è¡¨æ¥è¯¢
for item in objs:
print(item.name,item.ut.title)
.prefetch_related()
# select * from userinfo where id <= 8
# 计ç®ï¼[1,2]
# select * from usertype where id in [1,2]
objs = UserInfo.obejcts.filter(id__lte=8).prefetch_related(âutâ)
for obj in objs:
print(obj.name,obj.ut.title)
31.filteråexcludeçåºå«ï¼
def filter(self, *args, **kwargs)
# æ¡ä»¶æ¥è¯¢(ç¬¦åæ¡ä»¶)
# æ¥åºç¬¦åæ¡ä»¶
# æ¡ä»¶å¯ä»¥æ¯ï¼åæ°ï¼åå
¸ï¼Q
def exclude(self, *args, **kwargs)
# æ¡ä»¶æ¥è¯¢(æé¤æ¡ä»¶)
# æé¤ä¸æ³è¦ç
# æ¡ä»¶å¯ä»¥æ¯ï¼åæ°ï¼åå
¸ï¼Q
32.å举django ormä¸ä¸ç§è½åsqlè¯å¥çæ¹æ³ã
åçSQL ---> connection
from django.db import connection, connections
cursor = connection.cursor() # cursor = connections['default'].cursor()
cursor.execute("""SELECT * from auth_user where id = %s""", [1])
row = cursor.fetchone() # fetchall()/fetchmany(..)
é è¿åçSQL-->extra\raw
extra
- extra
def extra(self, select=None, where=None, params=None, tables=None, order_by=None,
select_params=None)
# æé é¢å¤çæ¥è¯¢æ¡ä»¶æè
æ å°ï¼å¦ï¼åæ¥è¯¢
Entry.objects.extra(select={'new_id': "select col from sometable where othercol > %s"},
select_params=(1,))
Entry.objects.extra(where=['headline=%s'], params=['Lennon'])
Entry.objects.extra(where=["foo='a' OR bar = 'a'", "baz = 'a'"])
Entry.objects.extra(select={'new_id': "select id from tb where id > %s"}, s
elect_params=(1,), order_by=['-nid'])
- raw
def raw(self, raw_query, params=None, translations=None, using=None):
# æ§è¡åçSQL
models.UserInfo.objects.raw(âselect * from userinfoâ)
# 妿SQLæ¯å
¶ä»è¡¨æ¶ï¼å¿
é¡»å°åå设置为å½åUserInfo对象ç主é®åå
models.UserInfo.objects.raw(âselect id as nid,name as title from å
¶ä»è¡¨â)
# 为åçSQLè®¾ç½®åæ°
models.UserInfo.objects.raw(âselect id as nid from userinfo where nid>%sâ, params=[12,])
# å°è·åçå°åå转æ¢ä¸ºæå®åå
name_map = {âfirstâ: âfirst_nameâ, âlastâ: âlast_nameâ, âbdâ: âbirth_dateâ, âpkâ: âidâ}
Person.objects.raw(âSELECT * FROM some_other_tableâ, translations=name_map)
# æå®æ°æ®åº
models.UserInfo.objects.raw(âselect * from userinfoâ, using=âdefaultâ)
33.django orm ä¸å¦ä½è®¾ç½®è¯»åå离ï¼
æ¹å¼ä¸ï¼æå¨ä½¿ç¨querysetçusingæ¹æ³ from django.shortcuts import render,HttpResponse from app01 import models def index(request):models.UserType.objects.using('db1').create(title='æ®éç¨æ·'<span>)
# æå¨æå®å»æä¸ªæ°æ®åºåæ°æ®
result = models.UserType.objects.all().using(âdb1â)
print(result)
return HttpResponse('...'<span>)
æ¹å¼äºï¼åé
ç½®æä»¶
class Router1:
ãã# æå®å°æä¸ªæ°æ®åºåæ°æ®
def db_for_read(self, model, **hints):
ââ"
Attempts to read auth models go to auth_db.
ââ"
if model._meta.model_name == âusertypeâ:
return âdb1â
else:
return âdefaultâ
ããã# æå®å°æä¸ªæ°æ®åºåæ°æ®
def db_for_write(self, model, **hints):
ââ"
Attempts to write auth models go to auth_db.
ââ"
return âdefaultâ
ååå°é
ç½®
DATABASES = {
âdefaultâ: {
âENGINEâ: âdjango.db.backends.sqlite3â,
âNAMEâ: os.path.join(BASE_DIR, âdb.sqlite3â),
},
âdb1â: {
âENGINEâ: âdjango.db.backends.sqlite3â,
âNAMEâ: os.path.join(BASE_DIR, âdb.sqlite3â),
}
}
DATABASE_ROUTERS = [âdb_router.Router1â,]
34.FåQçä½ç¨?
F:主è¦ç¨æ¥è·ååæ°æ®è¿è¡è®¡ç®ã
Django æ¯æ F() 对象ä¹é´ä»¥å F() 对象å常æ°ä¹é´çå åä¹é¤å忍¡çæä½ã
ä¿®æ¹æä½ä¹å¯ä»¥ä½¿ç¨F彿°,æ¯å¦å°æ¯ä»¶ååçä»·æ ¼é½å¨åä»·æ ¼çåºç¡ä¸å¢å 10
from django.db.models import F from app01.models import Goods
Goods.objects.update(price=F(âpriceâ)+10) # 对äºgoodsè¡¨ä¸æ¯ä»¶ååçä»·æ ¼é½å¨åä»·æ ¼çåºç¡ä¸å¢å 10å
Fæ¥è¯¢ä¸é¨å¯¹å¯¹è±¡ä¸æåå¼çæä½ï¼ä¸å¯ä½¿ç¨__åä¸å线ï¼
Q:ç¨æ¥è¿è¡å¤ææ¥è¯¢
Qæ¥è¯¢å¯ä»¥ç»åä½¿ç¨ â&â, â|â æä½ç¬¦ï¼å½ä¸ä¸ªæä½ç¬¦æ¯ç¨äºä¸¤ä¸ªQç对象,å®äº§çä¸ä¸ªæ°çQ对象ï¼
ããQ对象å¯ä»¥ç¨ â~â æä½ç¬¦æ¾å¨åé¢è¡¨ç¤ºå¦å®ï¼ä¹å¯å
许å¦å®ä¸ä¸å¦å®å½¢å¼çç»åã
ããQ对象å¯ä»¥ä¸å
³é®ååæ°æ¥è¯¢ä¸èµ·ä½¿ç¨ï¼ä¸è¿ä¸å®è¦æQ对象æ¾å¨å
³é®ååæ°æ¥è¯¢çåé¢ã
Q(æ¡ä»¶1) | Q(æ¡ä»¶2) æ
Q(æ¡ä»¶1) & Q(æ¡ä»¶2) ä¸
Q(æ¡ä»¶1) & ~Q(æ¡ä»¶2) é
35.valuesåvalues_listçåºå«ï¼
def values(self, *fields):
# è·åæ¯è¡æ°æ®ä¸ºåå
¸æ ¼å¼
def values_list(self, *fields, **kwargs):
# è·åæ¯è¡æ°æ®ä¸ºå
ç¥
36.å¦ä½ä½¿ç¨django ormæ¹éåå»ºæ°æ®ï¼
def bulk_create(self, objs, batch_size=None):
# æ¹éæå
¥
# batch_sizeè¡¨ç¤ºä¸æ¬¡æå
¥ç个æ°
objs = [
models.DDD(name='r11'),
models.DDD(name='r22')
]
models.DDD.objects.bulk_create(objs, 10)
37.djangoçFormåModeFormçä½ç¨ï¼
- ä½ç¨ï¼
- å¯¹ç¨æ·è¯·æ±æ°æ®æ ¼å¼è¿è¡æ ¡éª
- èªå¨çæHTMLæ ç¾
- åºå«ï¼
- Formï¼å段éè¦èªå·±æåã
class Form(Form):
xx = fields.CharField(.)
xx = fields.CharField(.)
xx = fields.CharField(.)
xx = fields.CharField(.)
- ModelFormï¼å¯ä»¥éè¿Metaè¿è¡å®ä¹
class MForm(ModelForm):
class Meta:
fields = "__all__"
model = UserInfo
- åºç¨ï¼åªè¦æ¯å®¢æ·ç«¯åæå¡ç«¯åéè¡¨åæ°æ®æ¶ï¼é½å¯ä»¥è¿è¡ä½¿ç¨ï¼å¦ï¼ç¨æ·ç»å½æ³¨å
38.djangoçFormç»ä»¶ä¸ï¼å¦æå段ä¸å å«choicesåæ°ï¼è¯·ä½¿ç¨ä¸¤ç§æ¹å¼å®ç°æ°æ®æºå®æ¶æ´æ°ã
æ¹å¼ä¸:éåæé æ¹æ³ï¼å¨æé æ¹æ³ä¸éæ°å»æ°æ®åºè·åå¼ class UserForm(Form): name = fields.CharField(label='ç¨æ·å',max_length=32) email = fields.EmailField(label='é®ç®±') ut_id = fields.ChoiceField( # choices=[(1,'æ®éç¨æ·'),(2,'IPç¨æ·')] choices=[] )def __init__(self,*args,**<span>kwargs): super(UserForm,self).__init__(*args,**<span>kwargs) self.fields['ut_id'].choices = models.UserType.objects.all().values_list('id','title'<span>)
æ¹å¼äº: ModelChoiceFieldåæ®µ
from django.forms import Form
from django.forms import fields
from django.forms.models import ModelChoiceField
class UserForm(Form):
name = fields.CharField(label=âç¨æ·åâ,max_length=32)
email = fields.EmailField(label=âé®ç®±â)
ut_id = ModelChoiceField(queryset=models.UserType.objects.all())
ä¾èµï¼
class UserType(models.Model):
title = models.CharField(max_length=32)
def __str__<span>(self):
return self.title</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
39.djangoçModelä¸çForeignKeyåæ®µä¸çon_deleteåæ°æä»ä¹ä½ç¨ï¼
å¨django2.0åï¼å®ä¹å¤é®åä¸å¯¹ä¸å
³ç³»çæ¶åéè¦å on_deleteéé¡¹ï¼æ¤åæ°ä¸ºäºé¿å
两个表éçæ°æ®ä¸ä¸è´é®é¢ï¼ä¸ç¶ä¼æ¥éï¼
TypeError: init() missing 1 required positional argument: âon_deleteâ
举ä¾è¯´æï¼
user=models.OneToOneField(User)
owner=models.ForeignKey(UserProfile)
éè¦æ¹æï¼
user=models.OneToOneField(User,on_delete=models.CASCADE) âå¨èçæ¬è¿ä¸ªåæ°ï¼models.CASCADEï¼æ¯é»è®¤å¼
owner=models.ForeignKey(UserProfile,on_delete=models.CASCADE) âå¨èçæ¬è¿ä¸ªåæ°ï¼models.CASCADEï¼æ¯é»è®¤å¼
åæ°è¯´æï¼
on_deleteæCASCADEãPROTECTãSET_NULLãSET_DEFAULTãSET()äºä¸ªå¯éæ©çå¼
CASCADEï¼æ¤å¼è®¾ç½®ï¼æ¯çº§èå é¤ã
PROTECTï¼æ¤å¼è®¾ç½®ï¼æ¯ä¼æ¥å®æ´æ§é误ã
SET_NULLï¼æ¤å¼è®¾ç½®ï¼ä¼æå¤é®è®¾ç½®ä¸ºnullï¼åææ¯å
许为nullã
SET_DEFAULTï¼æ¤å¼è®¾ç½®ï¼ä¼æè®¾ç½®ä¸ºå¤é®çé»è®¤å¼ã
SET()ï¼æ¤å¼è®¾ç½®ï¼ä¼è°ç¨å¤é¢çå¼ï¼å¯ä»¥æ¯ä¸ä¸ªå½æ°ã
ä¸è¬æ
åµä¸ä½¿ç¨CASCADEå°±å¯ä»¥äºã
40.djangoä¸csrfçå®ç°æºå¶ï¼
ç®çï¼é²æ¢ç¨æ·ç´æ¥åæå¡ç«¯åèµ·POST请æ±
- ç¨æ·å åéGETè·åcsrf token: Form表åä¸ä¸ä¸ªéèçæ ç¾ + token - åèµ·POSTè¯·æ±æ¶ï¼éè¦æºå¸¦ä¹ååéç»ç¨æ·çcsrf tokenï¼ - å¨ä¸é´ä»¶çprocess_viewæ¹æ³ä¸è¿è¡æ ¡éªã
å¨html䏿·»å {%csrf_token%}æ ç¾
41.djangoå¦ä½å®ç°websocketï¼
djangoä¸å¯ä»¥éè¿channelå®ç°websocket
42.åºäºdjango使ç¨ajaxåépostè¯·æ±æ¶ï¼é½å¯ä»¥ä½¿ç¨åªç§æ¹æ³æºå¸¦csrf tokenï¼
//æ¹å¼ä¸ç»æ¯ä¸ªajaxé½å ä¸ä¸è¯·æ±å¤´
function Do1(){
$.ajax({
url:"/index/",
data:{id:1},
type:'POST',
ãããããããdata:{csrfmiddlewaretoken:'{{ csrf_token }}',name:'alex'}
success:function(data){
console.log(data);
}
});
}
æ¹å¼äºï¼éè¦å
ä¸è½½jQuery-cookieï¼æè½å»cookieä¸è·åtoken
function Do1(){
$.ajax({
url:"/index/",
data:{id:1},
type:'POST',
headers:{
'X-CSRFToken':$.cookie('csrftoken') // å»cookieä¸è·å
},
success:function(data){
console.log(data);
}
});
}
æ¹å¼ä¸ï¼æä¸ªå½æ°ajaxSetupï¼å½æå¤çajax请æ±ï¼å³ä¼æ§è¡è¿ä¸ªå½æ°
KaTeX parse error: Expected '}', got 'EOF' at end of input: â¦("X-CSRFToken",.cookie(âcsrftokenâ))
}
});
彿°çæ¬
<body>
<input type=âbuttonâ âDo1();â value=âDo itâ/>
<input type=âbuttonâ âDo2();â value=âDo itâ/>
<input type=âbuttonâ âDo3();â value=âDo itâ/>
<script src="/static/jquery-3.3.1.min.js"></script>
<script src="/static/jquery.cookie.js"></script>
<script>
$.ajaxSetup({
beforeSend: function(xhr, settings) {
xhr.setRequestHeader(âX-CSRFTokenâ, $.cookie(âcsrftokenâ));
}
});
function Do1(){
$.ajax({
url:"/index/"<span>,
data:{id:1<span>},
type:'POST'<span>,
success:function(data){
console.log(data);
}
});
}
function Do2(){
$.ajax({
url:"/index/"<span>,
data:{id:1<span>},
type:'POST'<span>,
success:function(data){
console.log(data);
}
});
}
function Do3(){
$.ajax({
url:"/index/"<span>,
data:{id:1<span>},
type:'POST'<span>,
success:function(data){
console.log(data);
}
});
}
</script>
</body>
43.djangoä¸å¦ä½å®ç°ormè¡¨ä¸æ·»å æ°æ®æ¶åå»ºä¸æ¡æ¥å¿è®°å½ã
ç»ä¿¡å·æ³¨å彿°
使ç¨djangoçä¿¡å·æºå¶ï¼å¯ä»¥å¨æ·»å ãå 餿°æ®åå设置æ¥å¿è®°å½
pre_init # Djangoä¸çmodel对象æ§è¡å
¶æé æ¹æ³å,èªå¨è§¦å
post_init # Djangoä¸çmodel对象æ§è¡å
¶æé æ¹æ³å,èªå¨è§¦å
pre_save # Djangoä¸çmodel对象ä¿åå,èªå¨è§¦å
post_save # Djangoä¸çmodel对象ä¿åå,èªå¨è§¦å
pre_delete # Djangoä¸çmodel对象å é¤å,èªå¨è§¦å
post_delete # Djangoä¸çmodel对象å é¤å,èªå¨è§¦å
44.djangoç¼åå¦ä½è®¾ç½®ï¼
jango䏿ä¾äº6ç§ç¼åæ¹å¼ï¼
ããå¼åè°è¯ï¼ä¸å ç¼åï¼
ããå
å
ããæä»¶
ããæ°æ®åº
ããMemcacheç¼åï¼python-memcached模åï¼
ããMemcacheç¼åï¼pylibmc模åï¼
å®è£
ç¬¬ä¸æ¹ç»ä»¶æ¯æredisï¼
ããdjango-redisç»ä»¶
设置ç¼å
å ¨ç«ç¼åï¼ä¸é´ä»¶ï¼
MIDDLEWARE_CLASSES = (
âdjango.middleware.cache.UpdateCacheMiddlewareâ, #第ä¸
âdjango.middleware.common.CommonMiddlewareâ,
âdjango.middleware.cache.FetchFromCacheMiddlewareâ, #æå
)
è§å¾ç¼å
from django.views.decorators.cache import cache_page
import time
@cache_page(15) #è¶
æ¶æ¶é´ä¸º15ç§
def index(request):
t=time.time() #è·åå½åæ¶é´
return render(request,âindex.htmlâ,locals())
模æ¿ç¼å
{% load cache %}
<h3 style=âcolor: greenâ>ä¸ç¼å:-----{{ t }}</h3>
{% cache 2 ânameâ %} # åçkey
<h3>ç¼å:-----:{{ t }}</h3>
{% endcache %}
45.djangoçç¼åè½ä½¿ç¨redisåï¼å¦æå¯ä»¥çè¯ï¼å¦ä½é ç½®ï¼
pip install django-redis
apt-get install redis-serv
å¨settingæ·»å é
ç½®æä»¶
CACHES = {
âdefaultâ: {
âBACKENDâ: âdjango_redis.cache.RedisCacheâ, # ç¼åç±»å
âLOCATIONâ: â127.0.0.1:6379â, # ip端å£
âOPTIONSâ: {
âCLIENT_CLASSâ: âdjango_redis.client.DefaultClientâ, #
âCONNECTION_POOL_KWARGSâ: {âmax_connectionsâ: 100} # è¿æ¥æ± æå¤§è¿æ¥æ°
# âPASSWORDâ: âå¯ç â,
}
}
}
使ç¨
from django.shortcuts import render,HttpResponse
from django_redis import get_redis_connection
def index(request):
æ ¹æ®ååå»è¿æ¥æ± ä¸è·åè¿æ¥
conn = get_redis_connection(âdefaultâ)
conn.hset(ân1â,âk1â,âv1â) # åæ°æ®
return HttpResponse(ââ¦â)
46.djangoè·¯ç±ç³»ç»ä¸nameçä½ç¨ï¼
ååè§£æè·¯ç±å符串
è·¯ç±ç³»ç»ä¸nameçä½ç¨ï¼ååè§£æ
url(r'^home', views.home, name='home')
卿¨¡æ¿ä¸ä½¿ç¨ï¼{ % url 'home' %}
å¨è§å¾ä¸ä½¿ç¨ï¼reverse(âhomeâï¼
47.djangoçæ¨¡æ¿ä¸filteråsimple_tagçåºå«ï¼
filter : 类似管é,åªè½æ¥åä¸¤ä¸ªåæ°ç¬¬ä¸ä¸ªåæ°æ¯|åçæ°æ®
simple_tag : ç±»ä¼¼å½æ°
1ãæ¨¡æ¿ç»§æ¿ï¼{ % extends 'layouts.html' %}
2ãèªå®ä¹æ¹æ³
&nbnbsp; 'filter'ï¼åªè½ä¼ éä¸¤ä¸ªåæ°ï¼å¯ä»¥å¨ifãforè¯å¥ä¸ä½¿ç¨
'simple_tag'ï¼å¯ä»¥æ çº¿ä¼ åï¼ä¸è½å¨if forä¸ä½¿ç¨
'inclusion_tags'ï¼å¯ä»¥ä½¿ç¨æ¨¡æ¿ååç«¯æ°æ®
3ãé²xssæ»å»ï¼ '|safe'ã'mark_safe'
48.django-debug-toolbarçä½ç¨ï¼
ä¸ãæ¥ç访é®çéåº¦ãæ°æ®åºçè¡ä¸ºãcacheå½ä¸çä¿¡æ¯ã
äºãå°¤å
¶å¨Mysql访é®ççåæä¸å¤§æç¨å¤(sqlæ¥è¯¢é度)
49.djangoä¸å¦ä½å®ç°åå æµè¯ï¼
å¯¹äºæ¯ä¸ä¸ªæµè¯æ¹æ³é½ä¼å°setUp()åtearDown()æ¹æ³æ§è¡ä¸é
ä¼åç¬æ°å»ºä¸ä¸ªæµè¯æ°æ®åºæ¥è¿è¡æ°æ®åºçæä½æ¹é¢çæµè¯ï¼é»è®¤å¨æµè¯å®æå鿝ã
卿µè¯æ¹æ³ä¸å¯¹æ°æ®åºè¿è¡å¢å æä½ï¼æåé½ä¼è¢«æ¸
é¤ãä¹å°±æ¯è¯´ï¼å¨test_add䏿å
¥çæ°æ®ï¼å¨test_addæµè¯ç»æåæå
¥çæ°æ®ä¼è¢«æ¸
é¤ã
djangoåå
æµè¯æ¶ä¸ºäºæ¨¡æç产ç¯å¢ï¼ä¼ä¿®æ¹settingsä¸çåéï¼ä¾å¦, æDEBUGåéä¿®æ¹ä¸ºTrue, æALLOWED_HOSTSä¿®æ¹ä¸º[*]ã
50.è§£éormä¸ db first å code firstçå«ä¹ï¼
db first: å
åå»ºæ°æ®åºï¼åæ´æ°è¡¨æ¨¡å
code firstï¼å
å表模åï¼åæ´æ°æ°æ®åº
https://www.cnblogs.com/jassin-du/p/8988897.html
51.djangoä¸å¦ä½æ ¹æ®æ°æ®åºè¡¨çæmodelä¸çç±»ï¼
1ãä¿®æ¹setingæä»¶ï¼å¨settingéé¢è®¾ç½®è¦è¿æ¥çæ°æ®åºç±»åååç§°ãå°å
2ãè¿è¡ä¸é¢ä»£ç å¯ä»¥èªå¨çæmodels模åæä»¶
- python manage.py inspectdb
3ãå建ä¸ä¸ªappæ§è¡ä¸ä¸é¢ä»£ç ï¼
- python manage.py inspectdb > app/models.py
52.使ç¨ormååçsqlçä¼ç¼ºç¹ï¼
SQLï¼
# ä¼ç¹ï¼
æ§è¡é度快
# 缺ç¹ï¼
ç¼å夿ï¼å¼åæçä¸é«
---------------------------------------------------------------------------
ORMï¼
# ä¼ç¹ï¼
è®©ç¨æ·ä¸ååSQLè¯å¥ï¼æé«å¼åæç
å¯ä»¥å¾æ¹ä¾¿å°å¼å
¥æ°æ®ç¼åä¹ç±»çéå åè½
# 缺ç¹ï¼
å¨å¤çå¤è¡¨èæ¥ãwhereæ¡ä»¶å¤ææ¥è¯¢æ¶ï¼ORMçè¯æ³ä¼åå¾å¤æã
没æåçSQLé度快
53.ç®è¿°MVCåMTV
MVCï¼modelãview(模å)ãcontroller(è§å¾)
MTVï¼modelãtempalteãview
54.djangoçcontenttypeç»ä»¶çä½ç¨ï¼
contenttypeæ¯djangoçä¸ä¸ªç»ä»¶(app)ï¼å®å¯ä»¥å°django䏿æappä¸ç表记å½ä¸æ¥
å¯ä»¥ä½¿ç¨ä»åå ä¸è¡¨ä¸çä¸¤ä¸ªåæ®µ,å®ç°ä¸å¼ 表åNå¼ è¡¨å¨æå建FKå
³ç³»ã
- åæ®µï¼è¡¨åç§°
- åæ®µï¼æ°æ®è¡ID
åºç¨ï¼è·¯é£è¡¨ç»æä¼æ å¸åä¸é¢è¯¾åå¦ä½è¯¾å
³è
55.è°è°ä½ 对restfull è§èç认è¯ï¼
restfulå
¶å®å°±æ¯ä¸å¥ç¼åæ¥å£ç'åè®®'ï¼è§å®å¦ä½ç¼å以åå¦ä½è®¾ç½®è¿åå¼ãç¶æç çä¿¡æ¯ã
# ææ¾èçç¹ç¹ï¼
# ç¨restful:
ç»ç¨æ·ä¸ä¸ªurlï¼æ ¹æ®methodä¸åå¨å端åä¸åçå¤ç
æ¯å¦ï¼poståå»ºæ°æ®ãgetè·åæ°æ®ãputåpatchä¿®æ¹æ°æ®ãdeleteå 餿°æ®ã
# ä¸ç¨restful:
ç»è°ç¨è
å¾å¤urlï¼æ¯ä¸ªurl代表ä¸ä¸ªåè½ï¼æ¯å¦ï¼add_user/delte_user/edit_user/
# å½ç¶ï¼è¿æåè®®å
¶ä»çï¼æ¯å¦ï¼
'çæ¬'æ¥æ§å¶è®©ç¨åºæå¤ä¸ªçæ¬å
񆇑
åµï¼çæ¬å¯ä»¥æ¾å¨ urlã请æ±å¤´ï¼accept/èªå®ä¹ï¼ãGETåæ°
'ç¶æç '200/300/400/500
'urlä¸å°½é使ç¨åè¯'restfulä¹å¯ä»¥ç§°ä¸ºâé¢åèµæºç¼ç¨â
'apiæ 示'
api.luffycity.com
www.luffycity.com/api/
56.æ¥å£çå¹çæ§æ¯ä»ä¹ææï¼
'ä¸ä¸ªæ¥å£éè¿1次ç¸åç访é®ï¼å对该æ¥å£è¿è¡N次ç¸åçè®¿é®æ¶ï¼å¯¹èµæºä¸é å½±å就认为æ¥å£å
·æå¹çæ§ã'
GETï¼ #ç¬¬ä¸æ¬¡è·åç»æãç¬¬äºæ¬¡ä¹æ¯è·åç»æå¯¹èµæºé½ä¸ä¼é æå½±åï¼å¹çã
POSTï¼ #ç¬¬ä¸æ¬¡æ°å¢æ°æ®ï¼ç¬¬äºæ¬¡ä¹ä¼å次æ°å¢ï¼éå¹çã
PUTï¼ #ç¬¬ä¸æ¬¡æ´æ°æ°æ®ï¼ç¬¬äºæ¬¡ä¸ä¼åæ¬¡æ´æ°ï¼å¹çã
PATCHï¼#ç¬¬ä¸æ¬¡æ´æ°æ°æ®ï¼ç¬¬äºæ¬¡ä¸ä¼åæ¬¡æ´æ°ï¼éå¹çã
DELTEï¼#ç¬¬ä¸æ¬¡å 餿°æ®ï¼ç¬¬äºæ¬¡ä¸å¨åå é¤ï¼å¹çã
57.ä»ä¹æ¯RPCï¼
'è¿ç¨è¿ç¨è°ç¨åè®®'
æ¯ä¸ç§éè¿ç½ç»ä»è¿ç¨è®¡ç®æºç¨åºä¸è¯·æ±æå¡ï¼èä¸éè¦äºè§£åºå±ç½ç»ææ¯çåè®®ã
è¿åç顺åº: ç°æçRPC,ç¶åæçRESTfulè§è
58.HttpåHttpsçåºå«ï¼
#Http: 80端å£
#https: 443端å£
# httpä¿¡æ¯æ¯ææä¼ è¾ï¼https忝å
·æå®å
¨æ§çsslå å¯ä¼ è¾åè®®ã
#- èªå®ä¹è¯ä¹¦
- æå¡ç«¯ï¼å建ä¸å¯¹è¯ä¹¦
- 客æ·ç«¯ï¼å¿
é¡»æºå¸¦è¯ä¹¦
#- è´ä¹°è¯ä¹¦
- æå¡ç«¯ï¼ å建ä¸å¯¹è¯ä¹¦ï¼ãããã
- 客æ·ç«¯ï¼ 廿ºæè·åè¯ä¹¦ï¼æ°æ®å å¯ååç»å±ä»¬çæå¡å
- è¯ä¹¦æºæ:å
¬é¥ç»æ¹æºæ
59.为ä»ä¹è¦ä½¿ç¨django rest frameworkæ¡æ¶ï¼
# å¨ç¼åæ¥å£æ¶å¯ä»¥ä¸ä½¿ç¨django rest frameworkæ¡æ¶ï¼
# ä¸ä½¿ç¨ï¼ä¹å¯ä»¥åï¼å¯ä»¥ç¨djangoçCBVæ¥å®ç°ï¼å¼åè
ç¼åç代ç 伿´å¤ä¸äºã
# 使ç¨ï¼å
é¨å¸®å©æä»¬æä¾äºå¾å¤æ¹ä¾¿çç»ä»¶ï¼æä»¬éè¿é
置就å¯ä»¥å®æç¸åºæä½ï¼å¦ï¼
'åºåå'å¯ä»¥åç¨æ·è¯·æ±æ°æ®æ ¡éª+queryset对象çåºåå称为json
'è§£æå¨'è·åç¨æ·è¯·æ±æ°æ®request.dataï¼ä¼èªå¨æ ¹æ®content-type请æ±å¤´çä¸è½å¯¹æ°æ®è¿è¡è§£æ
'å页'å°ä»æ°æ®åºè·åå°çæ°æ®å¨é¡µé¢è¿è¡å页æ¾ç¤ºã
# è¿æå
¶ä»ç»ä»¶ï¼
'认è¯'ã'æé'ã'访é®é¢çæ§å¶
60.django rest frameworkæ¡æ¶ä¸é½æé£äºç»ä»¶ï¼
#- è·¯ç±ï¼èªå¨å¸®å©å¼åè
å¿«é为ä¸ä¸ªè§å¾å建4个url
www.oldboyedu.com/api/v1/student/$
www.oldboyedu.com/api/v1/student(?P<format>\w+)$
www.oldboyedu.com/api/v1/student/(?P<pk>\d+)/$
www.oldboyedu.com/api/v1/student/(?P<pk>\d+)(?P<format>\w+)$
#- çæ¬å¤ç
- é®é¢ï¼çæ¬é½å¯ä»¥æ¾å¨é£éï¼
- url
- GET
- 请æ±å¤´
#- 认è¯
- é®é¢ï¼è®¤è¯æµç¨ï¼
#- æé
- æéæ¯å¦å¯ä»¥æ¾å¨ä¸é´ä»¶ä¸ï¼ä»¥å为ä»ä¹ï¼
#- 访é®é¢ççæ§å¶
å¿åç¨æ·å¯ä»¥çæ£ç鲿¢ï¼æ æ³åå°çæ£ç访é®é¢çæ§å¶ï¼åªè½æå°ç½æä¹é¨å¤ã
妿è¦å°IPï¼ä½¿ç¨é²ç«å¢æ¥åã
ç»å½ç¨æ·å¯ä»¥éè¿ç¨æ·åä½ä¸ºå¯ä¸æ 示è¿è¡æ§å¶ï¼å¦ææäººæ³¨åå¾å¤è´¦å·ï¼åæ æ³é²æ¢ã
#- è§å¾
#- è§£æå¨ ï¼æ ¹æ®Content-Type请æ±å¤´å¯¹è¯·æ±ä½ä¸çæ°æ®æ ¼å¼è¿è¡å¤çãrequest.data
#- å页
#- åºåå
- åºåå
- source
- å®ä¹æ¹æ³
- è¯·æ±æ°æ®æ ¼å¼æ ¡éª
#- 渲æå¨
61.django rest frameworkæ¡æ¶ä¸çè§å¾é½å¯ä»¥ç»§æ¿åªäºç±»
a. ç»§æ¿APIViewï¼æåå§ï¼ä½å®å¶æ§æ¯è¾å¼º
è¿ä¸ªç±»å±äºrest frameworkä¸çé¡¶å±ç±»ï¼å
é¨å¸®å©æä»¬å®ç°äºåªæ¯åºæ¬åè½ï¼è®¤è¯ãæéãé¢çæ§å¶ï¼
ä½å¡æ¯æ°æ®åºãå页çæä½é½éè¦æå¨å»å®æï¼æ¯è¾åå§ã
class GenericAPIView(APIView)
def post(...):
pass
b.ç»§æ¿GenericViewSetï¼ViewSetMixinï¼generics.GenericAPIViewï¼
ããé¦å
ä»çè·¯ç±å°±åçåå
å¦æç»§æ¿å®ä¹åï¼è·¯ç±ä¸ças_viewéè¦å¡«å对åºå
³ç³»
ããå¨å
é¨ä¹å¸®å©æä»¬æä¾äºä¸äºæ¹ä¾¿çæ¹æ³ï¼
ããget_queryset
ããget_object
ããget_serializer
ããget_serializer_class
ããget_serializer_context
ããfilter_queryset
注æï¼è¦è®¾ç½®querysetåæ®µï¼å¦åä¼æåºæè¨çå¼å¸¸ã
代ç
åªæä¾å¢å åè½ åªç»§æ¿GenericViewSet
class TestView(GenericViewSet):
ããserialazer_class = xxx
ããdef creat(self,*args,**kwargs):
ããããpass # è·åæ°æ®å¹¶å¯¹æ°æ®
c. ç»§æ¿ modelviewset --> å¿«éå¿«å
ãããã-ModelViewSet(å¢å æ¹æ¥å
¨æ+æ°æ®åºæä½)
ãããã-mixins.CreateModelMixinï¼åªæå¢ï¼,GenericViewSet
ãããã-mixins.CreateModelMixin,DestroyModelMixin,GenericViewSet
ããå¯¹æ°æ®åºåå页çæä½ä¸ç¨æä»¬å¨ç¼åï¼åªéè¦ç»§æ¿ç¸å
³ç±»å³å¯ã
ãã
示ä¾ï¼åªæä¾å¢å åè½
class TestView(mixins.CreateModelMixin,GenericViewSet):
ããããserializer_class = XXXXXXX
***
ããmodelviewset --> å¿«éå¼åï¼å¤æç¹çgenericviewãapiview
62.ç®è¿° django rest frameworkæ¡æ¶çè®¤è¯æµç¨ã
- å¦ä½ç¼åï¼å类并å®ç°authenticators
ãã请æ±è¿æ¥è®¤è¯éè¦ç¼åä¸ä¸ªç±»ï¼ç±»é颿ä¸ä¸ªauthenticatorsæ¹æ³ï¼æä»¬å¯ä»¥èªå®ä¹è¿ä¸ªæ¹æ³ï¼å¯ä»¥å®å¶3ç±»è¿åå¼ã
ããæåè¿åå
ç»ï¼è¿ånone为å¿åç¨æ·ï¼æåºå¼å¸¸ä¸ºè®¤è¯å¤±è´¥ã
æºç æµç¨ï¼è¯·æ±è¿æ¥å
èµ°dispatchæ¹æ³ï¼ç¶åå°è£
çrequestå¯¹è±¡ä¼æ§è¡useræ¹æ³ï¼ç±user触åauthenticatorsè®¤è¯æµç¨
- æ¹æ³ä¸å¯ä»¥å®ä¹ä¸ç§è¿åå¼ï¼
- ï¼user,authï¼ï¼è®¤è¯æå
- None , å¿åç¨æ·
- å¼å¸¸ ï¼è®¤è¯å¤±è´¥
- æµç¨ï¼
- dispatch
- åå»requestä¸è¿è¡è®¤è¯å¤ç
63.django rest frameworkå¦ä½å®ç°çç¨æ·è®¿é®é¢çæ§å¶ï¼
# 对å¿åç¨æ·ï¼æ ¹æ®ç¨æ·IPæä»£çIPä½ä¸ºæ è¯è¿è¡è®°å½ï¼ä¸ºæ¯ä¸ªç¨æ·å¨redisä¸å»ºä¸ä¸ªå表
{
throttle_1.1.1.1:[1526868876.497521,152686885.497521...]ï¼
throttle_1.1.1.2:[1526868876.497521,152686885.497521...]ï¼
throttle_1.1.1.3:[1526868876.497521,152686885.497521...]ï¼
}
æ¯ä¸ªç¨æ·åæ¥è®¿é®æ¶ï¼éå
å»è®°å½ä¸åé¤è¿æè®°å½ï¼åæ ¹æ®å表çé¿åº¦å¤ææ¯å¦å¯ä»¥ç»§ç»è®¿é®ã
'å¦ä½å°IP'ï¼å¨é²ç«å¢ä¸è¿è¡è®¾ç½®
--------------------------------------------------------------------------
# 对注åç¨æ·ï¼æ ¹æ®ç¨æ·åæé®ç®±è¿è¡å¤æã
{
throttle_xxxx1:[1526868876.497521,152686885.497521...]ï¼
throttle_xxxx2:[1526868876.497521,152686885.497521...]ï¼
throttle_xxxx3:[1526868876.497521,152686885.497521...]ï¼
}
æ¯ä¸ªç¨æ·åæ¥è®¿é®æ¶ï¼éå
å»è®°å½ä¸åé¤è¿æè®°å½ï¼åæ ¹æ®å表çé¿åº¦å¤ææ¯å¦å¯ä»¥ç»§ç»è®¿é®ã
\å¦1åéï¼40次ï¼å表é¿åº¦éå¶å¨40ï¼è¶
è¿40åä¸å¯è®¿é®
64.Flaskæ¡æ¶çä¼å¿ï¼
Flaskèªç±ãçµæ´»ï¼å¯æ©å±æ§å¼ºï¼éæå¯æ§ï¼ç¬¬ä¸æ¹åºçéæ©é¢å¹¿ï¼
å¼åæ¶å¯ä»¥ç»åææµè¡æå¼ºå¤§çPythonåºï¼
65.Flaskæ¡æ¶ä¾èµç»ä»¶
# ä¾èµjinja2模æ¿å¼æ # ä¾èµwerkzurgåè®®
66.Flaskèå¾çä½ç¨
# blueprintæå®ç°ä¸ååè½çmoduleåå¼.ä¹å°±æ¯æä¸ä¸ªå¤§çAppå岿åèªå®ç°ä¸ååè½çmodule. # å¨ä¸ä¸ªblueprintä¸å¯ä»¥è°ç¨å¦ä¸ä¸ªblueprintçè§å¾å½æ°, ä½è¦å ç¸åºçblueprintå.
67.å举使ç¨çFlaskç¬¬ä¸æ¹ç»ä»¶ï¼
# Flaskç»ä»¶
flask-session sessionæ¾å¨redis
flask-SQLAlchemy å¦djangoéçORMæä½
flask-migrate æ°æ®åºè¿ç§»
flask-script èªå®ä¹å½ä»¤
blinker ä¿¡å·-触åä¿¡å·
# ç¬¬ä¸æ¹ç»ä»¶
Wtforms å¿«éå建å端æ ç¾ãææ¬æ ¡éª
dbutile åå»ºæ°æ®åºè¿æ¥æ±
gevnet-websocket å®ç°websocket
# èªå®ä¹Flaskç»ä»¶
èªå®ä¹auth认è¯
åèflask-loginç»ä»¶
68.ç®è¿°Flaskä¸ä¸æç®¡çæµç¨?
# aãç®åæ¥è¯´ï¼falskä¸ä¸æç®¡çå¯ä»¥å为ä¸ä¸ªé¶æ®µï¼
ãã1ã'请æ±è¿æ¥æ¶'ï¼å°è¯·æ±ç¸å
³çæ°æ®æ¾å
¥ä¸ä¸é®ç®¡çä¸
ãã2ã'å¨è§å¾å½æ°ä¸'ï¼è¦å»ä¸ä¸æç®¡çä¸åå¼
ãã3ã'请æ±ååº'ï¼è¦å°ä¸ä¸æç®¡çä¸çæ°æ®æ¸
é¤
# bã详ç»ç¹æ¥è¯´ï¼
ãã1ã'请æ±åè¿æ¥'ï¼
å°requestï¼sessionå°è£
å¨RequestContextç±»ä¸
appï¼gå°è£
å¨AppContextç±»ä¸
å¹¶éè¿LocalStackå°requestcontextåappcontextæ¾å
¥Localç±»ä¸
ãã2ã'è§å¾å½æ°ä¸'ï¼
éè¿localproxy--->å彿°--->localstack--->localåå¼
ãã3ã'请æ±ååºæ¶'ï¼
å
æ§è¡save.session()ååèªæ§è¡pop(),å°localä¸çæ°æ®æ¸
é¤
69.Flaskä¸çgçä½ç¨ï¼
# gæ¯è´¯ç©¿äºä¸æ¬¡è¯·æ±çå ¨å±åéï¼å½è¯·æ±è¿æ¥å°gåcurrent_appå°è£ 为ä¸ä¸ªAPPContextç±»ï¼ # åéè¿LocalStackå°Appcontextæ¾å ¥Localä¸ï¼å弿¶éè¿å彿°å¨LocalStackãlocalä¸åå¼ï¼ # ååºæ¶å°localä¸çgæ°æ®å é¤ï¼
Flaskä¸ä¸ä¸æç®¡çä¸»è¦æ¶åå°äºé£äºç¸å ³çç±»ï¼å¹¶æè¿°ç±»ä¸»è¦ä½ç¨ï¼
RequestContext #å°è£ è¿æ¥ç请æ±ï¼èµå¼ç»ctxï¼ AppContext #å°è£ app_ctx LocalStack #å°local对象ä¸çæ°æ®ç»´æ¤æä¸ä¸ªæ ï¼å è¿ååºï¼ Local #ä¿å请æ±ä¸ä¸æå¯¹è±¡åappä¸ä¸æå¯¹è±¡
为ä»ä¹è¦FlaskæLocal对象ä¸ççå¼stack ç»´æ¤æä¸ä¸ªå表ï¼
# å 为éè¿ç»´æ¤æå表ï¼å¯ä»¥å®ç°ä¸ä¸ªæ çæ°æ®ç»æï¼è¿æ åºæ æ¶åªåä¸ä¸ªæ°æ®ï¼å·§å¦çç®åäºé®é¢ã # è¿æï¼å¨å¤appåºç¨æ¶ï¼å¯ä»¥å®ç°æ°æ®é离ï¼å表éä¸ä¼å æ°æ®ï¼èæ¯ä¼çæä¸ä¸ªæ°çå表 # localæ¯ä¸ä¸ªåå ¸ï¼åå ¸ékeyï¼stackï¼æ¯å¯ä¸æ è¯ï¼valueæ¯ä¸ä¸ªå表
Flaskä¸å¤appåºç¨æ¯æä¹å®æï¼
请æ±è¿æ¥æ¶ï¼å¯ä»¥æ ¹æ®URLçä¸åï¼äº¤ç»ä¸åçAPPå¤çãèå¾ä¹å¯ä»¥å®ç°ã
#app1 = Flask('app01')
#app2 = Flask('app02')
#@app1.route('/index')
#@app2.route('/index2')
æºç ä¸å¨DispatcherMiddlewareç±»éè°ç¨app2.__call__ï¼
åçå
¶å®å°±æ¯URLåå²ï¼ç¶åå°è¯·æ±ååç»æå®çappã
ä¹åapp乿åappçæµç¨èµ°ãå°±æ¯ä»app.__call__èµ°ã
å¨Flaskä¸å®ç°WebSocketéè¦ä»ä¹ç»ä»¶ï¼
gevent-websocket
wtformsç»ä»¶çä½ç¨ï¼
#å¿«éå建å端æ ç¾ãææ¬æ ¡éªï¼å¦djangoçModelForm
Flaskæ¡æ¶é»è®¤sessionå¤çæºå¶ï¼
# åæ:
ä¸ççè¯:è®°ä¸å¤ªæ¸
äº,åºè¯¥æ¯â¦â¦åä¸¤ä¸ªé¶æ®µå§
# å建:
å½è¯·æ±åè¿æ¥çæ¶å,ä¼å°requeståsessionå°è£
æä¸ä¸ªRequestContext()对象,
æ¥ä¸æ¥æè¿ä¸ªå¯¹è±¡éè¿LocalStack()æ¾å
¥å
é¨çä¸ä¸ªLocal()对象ä¸;
ãã å 为åå¼å§ Local çctxä¸sessionæ¯ç©ºç;
ãã æä»¥,æ¥çæ§è¡open_session,å°cookie éé¢ç弿¿è¿æ¥,éæ°èµå¼å°ctxä¸
(Localå®ç°å¯¹æ°æ®é离,类似threading.local)
# 鿝:
æåè¿åæ¶æ§è¡ save_session() å°ctx ä¸çsessionè¯»åºæ¥è¿è¡åºåå,åå°cookie
ç¶åç»ç¨æ·,æ¥çæ ctx popæ
è§£éFlaskæ¡æ¶ä¸çLocal对象åthreading.local对象çåºå«ï¼
# a.threading.local
ä½ç¨ï¼ä¸ºæ¯ä¸ªçº¿ç¨å¼è¾ä¸å空é´è¿è¡æ°æ®åå¨(æ°æ®é离)ã
é®é¢ï¼èªå·±éè¿åå
¸å建ä¸ä¸ªç±»ä¼¼äºthreading.localçä¸è¥¿ã
storage = {
4740: {val: 0},
4732: {val: 1},
4731: {val: 3},
}
b.èªå®ä¹Local对象
ä½ç¨ï¼ä¸ºæ¯ä¸ªçº¿ç¨(åç¨)å¼è¾ä¸å空é´è¿è¡æ°æ®åå¨(æ°æ®é离)ã
class Local(object):
def init(self):
object.setattr(self, âstorageâ, {})
def setattr(self, k, v):
ident = get_ident()
if ident in self.storage:
self.storage[ident][k] = v
else:
self.storage[ident] = {k: v}
def getattr(self, k):
ident = get_ident()
return self.storage[ident][k]
obj = Local()
def task(arg):
obj.val = arg
obj.xxx = arg
print(obj.val)
for i in range(10):
t = Thread(target=task, args=(i,))
t.start()
Flaskä¸ blinker æ¯ä»ä¹ï¼
# flaskä¸çä¿¡å·blinker
ä¿¡å·ä¸»è¦æ¯è®©å¼åè
坿¯å¨flask请æ±è¿ç¨ä¸å®å¶ä¸äºè¡ä¸ºã
æè
说flaskå¨å表éé¢é¢çäºå 个空å表ï¼å¨éé¢åä¸è¥¿ã
ç®è¨ä¹ï¼ä¿¡å·å
许æä¸ª'åéè
'éç¥'æ¥æ¶è
'æäºæ
åçäº
@ before_requestæè¿åå¼ï¼blinker没æè¿åå¼
# 10个信å·
request_started = _signals.signal('request-started') #请æ±å°æ¥åæ§è¡
request_finished = _signals.signal('request-finished') #请æ±ç»æåæ§è¡
before_render_template = _signals.signal('before-render-template')#æ¨¡æ¿æ¸²æåæ§è¡
template_rendered = _signals.signal('template-rendered')#æ¨¡æ¿æ¸²æåæ§è¡
got_request_exception = _signals.signal('got-request-exception') #è¯·æ±æ§è¡åºç°å¼å¸¸æ¶æ§è¡
request_tearing_down = _signals.signal('request-tearing-down')#è¯·æ±æ§è¡å®æ¯åèªå¨æ§è¡ï¼æ 论æåä¸å¦ï¼
appcontext_tearing_down = _signals.signal('appcontext-tearing-down')# 请æ±ä¸ä¸ææ§è¡å®æ¯åèªå¨æ§è¡ï¼æ 论æåä¸å¦ï¼
appcontext_pushed = _signals.signal('appcontext-pushed') #请æ±appä¸ä¸æpushæ¶æ§è¡
appcontext_popped = _signals.signal('appcontext-popped') #请æ±ä¸ä¸æpopæ¶æ§è¡
message_flashed = _signals.signal('message-flashed')#è°ç¨flaskå¨å ¶ä¸æ·»å æ°æ®æ¶ï¼èªå¨è§¦å
SQLAlchemyä¸ç sessionåscoped_session çåºå«ï¼
# Sessionï¼
ç±äºæ æ³æä¾çº¿ç¨å
±äº«åè½ï¼å¼åæ¶è¦ç»æ¯ä¸ªçº¿ç¨é½å建èªå·±çsession
æå°sesionå¯ç¥ä»æ¯sqlalchemy.orm.session.Sessionç对象
# scoped_sessionï¼
为æ¯ä¸ªçº¿ç¨é½å建ä¸ä¸ªsessionï¼å®ç°æ¯æçº¿ç¨å®å
¨
卿´ä¸ªç¨åºè¿è¡çè¿ç¨å½ä¸ï¼åªåå¨å¯ä¸çä¸ä¸ªsession对象ã
å建æ¹å¼:
éè¿æ¬å°çº¿ç¨Threading.Local()
# session=scoped_session(Session)
å建å¯ä¸æ è¯çæ¹æ³(åèflaskè¯·æ±æºç )
SQLAlchemyå¦ä½æ§è¡åçSQLï¼
# 使ç¨executeæ¹æ³ç´æ¥æä½SQLè¯å¥(导å
¥create_enginãsessionmaker)
engine=create_engine('mysql://root:*****@127.0.0.1/database?charset=utf8')
DB_Session = sessionmaker(bind=engine)
session = DB_Session()
session.execute('alter table mytablename drop column mycolumn ;')
ORMçå®ç°åçï¼
# ORMçå®ç°åºäºä¸ä¸ä¸ç¹
æ å°ç±»ï¼æè¿°æ°æ®åºè¡¨ç»æï¼
æ å°æä»¶ï¼æå®æ°æ®åºè¡¨åæ å°ç±»ä¹é´çå
³ç³»
æ°æ®åºé
ç½®æä»¶ï¼æå®ä¸æ°æ®åºè¿æ¥æ¶éè¦çè¿æ¥ä¿¡æ¯(æ°æ®åºãç»å½ç¨æ·åãå¯ç orè¿æ¥å符串)
DBUtils模åçä½ç¨ï¼
# æ°æ®åºè¿æ¥æ±
ä½¿ç¨æ¨¡å¼ï¼
1ã为æ¯ä¸ªçº¿ç¨å建ä¸ä¸ªè¿æ¥ï¼è¿æ¥ä¸å¯æ§ï¼éè¦æ§å¶çº¿ç¨æ°
2ãå建æå®æ°éçè¿æ¥å¨è¿æ¥æ± ï¼å½çº¿ç¨è®¿é®çæ¶åå»åï¼ä¸å¤äºçº¿ç¨æéï¼ç´å°æäººéæ¾(æ¨è)
---------------------------------------------------------------------------
两ç§åæ³ï¼
1ãç¨éææ¹æ³è£
饰å¨ï¼éè¿ç´æ¥æ§è¡ç±»çæ¹æ³æ¥è¿æ¥ä½¿ç¨æ°æ®åº
2ãéè¿å®ä¾å对象ï¼éè¿å¯¹è±¡æ¥è°ç¨æ¹æ³æ§è¡è¯å¥
https://www.cnblogs.com/ArmoredTitan/p/Flask.html
以ä¸SQLAlchemyçåæ®µæ¯å¦æ£ç¡®ï¼å¦æä¸æ£ç¡®è¯·æ´æ£ï¼
from
datetime
import
datetime
from
sqlalchemy.ext.declarative
import
declarative_base
from
sqlalchemy
import
Column, Integer, String, DateTime
Base
=
declarative_base()
class
UserInfo(Base):
__tablename__
=
'userinfo'
id
=
Column(Integer, primary_key
=
True
, autoincrement
=
True
)
name
=
Column(String(
64
), unique
=
True
)
ctime
=
Column(DateTime, default
=
datetime.now())
from datetime import datetime
from sqlalchemy.ext.declarative
import declarative_base
from sqlalchemy import Column, Integer, String, DateTime
Base = declarative_base()
class UserInfo(Base):
tablename = âuserinfoâ
id = Column(Integer, primary_key=True, autoincrement=True)
name = Column(String(64), unique=True)
ctime = Column(DateTime, default=datetime.now())
-----------------------------------------------------------------------
䏿£ç¡®ï¼
Ctimeåæ®µä¸åæ°åºä¸ºâdefault=datetime.nowâ
now åé¢ä¸åºè¯¥å æ¬å·ï¼å äºçè¯ï¼å段ä¸ä¼å®æ¶æ´æ°ã
SQLAchemyä¸å¦ä½ä¸ºè¡¨è®¾ç½®å¼æåå符ç¼ç ï¼
sqlalchemy设置ç¼ç å符éï¼ä¸å®è¦å¨æ°æ®åºè®¿é®çURLä¸å¢å 'charset=utf8'
å¦åæ°æ®åºçè¿æ¥å°±ä¸æ¯'utf8'çç¼ç æ ¼å¼
eng=create_engine(âmysql://root:[email protected]:3306/test2?charset=utf8â,echo=True)
1. è®¾ç½®å¼æç¼ç æ¹å¼ä¸ºutf8ãengine = create_engine("mysql+pymysql://root:[email protected]:3306/sqldb01?charset=utf8"<span>)
2. è®¾ç½®æ°æ®åºè¡¨ç¼ç æ¹å¼ä¸ºutf8
class UserType(Base):
tablename = âusertypeâ
id = Column(Integer, primary_key=True)
caption = Column(String(50), default=â管çåâ)
# æ·»å é
置设置ç¼ç
table_args = {
âmysql_charsetâ:âutf8â
}
è¿æ ·çæçSQLè¯å¥å°±èªå¨è®¾ç½®æ°æ®è¡¨ç¼ç 为utf8äº,__table_args__è¿å¯è®¾ç½®åå¨å¼æãå¤é®çº¦æççä¿¡æ¯ã
SQLAchemyä¸å¦ä½è®¾ç½®èåå¯ä¸ç´¢å¼ï¼
éè¿'UniqueConstraint'åæ®µæ¥è®¾ç½®èåå¯ä¸ç´¢å¼
__table_args=(UniqueConstraint('h_id','username',name='_h_username_uc'))
#h_idåusernameç»æèåå¯ä¸çº¦æ
ç®è¿°Tornadoæ¡æ¶çç¹ç¹ã
弿¥éé»å¡+websocket
ç®è¿°Tornadoæ¡æ¶ä¸Future对象çä½ç¨ï¼
# å®ç°å¼æ¥éé»å¡
è§å¾å½æ°yieldä¸ä¸ªfutrue对象ï¼futrue对象é»è®¤ï¼
self._done = False ï¼è¯·æ±æªå®æ
self._result = None ï¼è¯·æ±å®æåè¿åå¼ï¼ç¨äºä¼ éç»åè°å½æ°ä½¿ç¨ã
tornadoå°±ä¼ä¸ç´å»æ£æµfutrue对象ç_doneæ¯å¦å·²ç»åæTrueã
妿IOè¯·æ±æ§è¡å®æ¯ï¼èªå¨ä¼è°ç¨futureçset_resultæ¹æ³ï¼
self._result = result
self._done = True
åèï¼http://www.cnblogs.com/wupeiqi/p/6536518.htmlï¼èªå®ä¹å¼æ¥éé»å¡webæ¡æ¶ï¼
Tornadoæ¡æ¶ä¸å¦ä½ç¼åWebSocketç¨åºï¼
Tornadoå¨websocket模å䏿ä¾äºä¸ä¸ªWebSocketHandlerç±»ã
è¿ä¸ªç±»æä¾äºåå·²è¿æ¥ç客æ·ç«¯éä¿¡çWebSocketäºä»¶åæ¹æ³çé©åã
å½ä¸ä¸ªæ°çWebSocketè¿æ¥æå¼æ¶ï¼openæ¹æ³è¢«è°ç¨ï¼
èon_messageåon_closeæ¹æ³ï¼åå«å¨è¿æ¥ãæ¥æ¶å°æ°çæ¶æ¯å客æ·ç«¯å
³éæ¶è¢«è°ç¨ã
æ¤å¤ï¼WebSocketHandlerç±»è¿æä¾äºwrite_messageæ¹æ³ç¨äºå客æ·ç«¯åéæ¶æ¯ï¼closeæ¹æ³ç¨äºå ³éè¿æ¥ã
Tornadoä¸éææä»¶æ¯å¦ä½å¤ççï¼ å¦ï¼ <link href="{{static_url("commons.css")}}" rel="stylesheet" />
# settings.py
settings = {
"static_path": os.path.join(os.path.dirname(__file__), "static"),
# æå®äºéææä»¶çä½ç½®å¨å½åç®å½ä¸ç"static"ç®å½ä¸
"cookie_secret": "61oETzKXQAGaYdkL5gEmGeJJFuYh7EQnp2XdTP1o/Vo=",
"login_url": "/login",
"xsrf_cookies": True,
}
ç»ä¸é¢é
ç½®å
static_url()èªå¨å»é
ç½®çè·¯å¾ä¸æ¾âcommons.cssâæä»¶
Tornadoæä½MySQL使ç¨ç模åï¼
torndb
torndbæ¯åºäºmysqldbçåå°è£
ï¼æä»¥ä½¿ç¨æ¶è¦å
å®è£
myqldb
Tornadoæä½redis使ç¨ç模åï¼
tornado-redis
ç®è¿°Tornadoæ¡æ¶çéç¨åºæ¯ï¼
webè天室ï¼å¨çº¿æç¥¨
git常è§å½ä»¤ä½ç¨ï¼
# git init
åå§åï¼å½åæå¨çæä»¶å¤¹å¯ä»¥è¢«ç®¡çä¸ä»¥åçæ¬ç¸å
³çæ°æ®é½ä¼åå¨å°.gitæä»¶ä¸
# git status
æ¥çå½åæä»¶å¤¹ä»¥ååç®å½ä¸æä»¶æ¯å¦åçååï¼
å
容修æ¹/æ°å¢æä»¶/å é¤ï¼å·²ç»ååçæä»¶ä¼åæçº¢è²ï¼å·²ç»addçæä»¶ä¼åæç»¿è²
# git add .
ç»åçååçæä»¶ï¼è´´ä¸ä¸ä¸ªæ ç¾ï¼æ å°åçååçæä»¶æ¾å°æä¸ªå°æ¹ï¼
åªåä¸ä¸ªå¥ç¹ç¬¦å°±ä»£è¡¨ægit statusä¸çº¢è²çæä»¶å
¨é¨æä¸æ ç¾
# git commit -m
æ°å¢ç¨æ·ç»å½è®¤è¯åè½ä»¥åxxxåè½å°â绿è²âæä»¶æ·»å å°çæ¬ä¸
# git log
æ¥çææçæ¬æäº¤è®°å½ï¼å¯ä»¥è·åçæ¬å·
# git reset --hard çæ¬å·
å°ææ°ççæ¬åéå°æ´æ©ççæ¬
# git reflog
åéå°ä¹åçæ¬åæäºï¼åæ´æ°å°ææ°æè
ææ°ä¹åççæ¬
# git reset --hard çæ¬ åé
ç®è¿°ä»¥ä¸gitä¸stashå½ä»¤ä½ç¨ä»¥åç¸å ³å ¶ä»å½ä»¤ã
'git stash'ï¼å°å½åå·¥ä½åºææä¿®æ¹è¿çå
容åå¨å°âæä¸ªå°æ¹âï¼å°å·¥ä½åºè¿åå°å½åçæ¬æªä¿®æ¹è¿çç¶æ
'git stash list'ï¼æ¥çâæä¸ªå°æ¹âåå¨çææè®°å½
'git stash clear'ï¼æ¸
空âæä¸ªå°æ¹â
'git stash pop'ï¼å°ç¬¬ä¸ä¸ªè®°å½ä»âæä¸ªå°æ¹âéæ°æ¿å°å·¥ä½åºï¼å¯è½æå²çªï¼
'git stash apply'ï¼ç¼å·, å°æå®ç¼å·è®°å½ä»âæä¸ªå°æ¹âéæ°æ¿å°å·¥ä½åºï¼å¯è½æå²çªï¼
'git stash drop'ï¼ç¼å·ï¼å 餿å®ç¼å·çè®°å½
git ä¸ merge å rebaseå½ä»¤ çåºå«ã
mergeï¼
ä¼å°ä¸å忝çæäº¤åå¹¶æä¸ä¸ªæ°çèç¹ï¼ä¹åçæäº¤å弿¾ç¤ºï¼
注éåå²ä¿¡æ¯ãå¯ä»¥çåºæ¯ä¸ªåæ¯ä¿¡æ¯ï¼åºäºæ¶é´ç¹,éå°å²çª,æå¨è§£å³,忬¡æäº¤
rebaseï¼
å°ä¸¤ä¸ªåæ¯çæäº¤ç»æèåæçº¿æ§ï¼ä¸ä¼äº§çæ°çèç¹;
注éå¼åè¿ç¨ï¼éå°å²çªï¼æå¨è§£å³ï¼ç»§ç»æä½
å ¬å¸å¦ä½åºäºgitåçååå¼åï¼
1ãä½ ä»¬å
¬å¸ç代ç review忝æä¹åï¼è°æ¥åï¼
çï¼ç»é¿å建reviewåæ¯ï¼æä»¬å°åè½å¼åå®ä¹åï¼åå¹¶å°reviewåæ¯äº¤ç»è大ï¼å°ç»é¿ï¼æ¥çï¼
1.1ãä½ ç»é¿ä¸å¼å代ç åï¼
ä»å¼å代ç ï¼ä½æ¯å®åªå¼åæ ¸å¿çä¸è¥¿ï¼ä»»å¡æ¯è¾å°ã
æè
æ½åºæ¶é´ï¼æä»¬ä¸èµ·åè¿ä¸ªäºæ
2ãä½ ä»¬å
¬å¸ååå¼åæ¯æä¹ååå¼åçï¼
æ¯ä¸ªäººé½æèªå·±ç忝ï¼é¶æ®µæ§ä»£ç 宿ä¹åï¼åå¹¶å°reviewï¼ç¶å交ç»è大ç
--------------------------------------------------------------------------
# 大è´å·¥ä½æµç¨
å
¬å¸ï¼
ä¸è½½ä»£ç
git clone https://gitee.com/wupeiqi/xianglong.git
æå建ç®å½
cd ç®å½
git init
git remote add origin https://gitee.com/wupeiqi/xianglong.git
git pull origin maste
å建dev忝
git checkout dev
git pull origin dev
ç»§ç»å代ç
git add .
git commit -m 'æäº¤è®°å½'
git push origin dev
åå®¶ï¼
æä»£ç ï¼
git pull origin dev
ç»§ç»åï¼
ç»§ç»å代ç
git add .
git commit -m 'æäº¤è®°å½'
git push origin dev
å¦ä½åºäºgitå®ç°ä»£ç reviewï¼
https://blog.****.net/june_y/article/details/50817993
gitå¦ä½å®ç°v1.0 ãv2.0 ççæ¬ç管çï¼
å¨å½ä»¤è¡ä¸ï¼ä½¿ç¨âgit tag âa tagname âm âcommentâå¯ä»¥å¿«éå建ä¸ä¸ªæ ç¾ã
éè¦æ³¨æï¼å½ä»¤è¡åå»ºçæ ç¾åªå卿¬å°Gitåºä¸ï¼è¿éè¦ä½¿ç¨Git push âtagsæä»¤åå¸å°æå¡å¨çGitåºä¸
ä»ä¹æ¯gitlab
gitlabæ¯å ¬å¸èªå·±æå»ºç项ç®ä»£ç æç®¡å¹³å°
githubågitlabçåºå«ï¼
1ãgitHubæ¯ä¸ä¸ªé¢å弿ºåç§æè½¯ä»¶é¡¹ç®çæç®¡å¹³å°
(åå»ºç§æçè¯ï¼éè¦è´ä¹°ï¼æä½çº§çä»è´¹ä¸ºæ¯æ7åï¼æ¯æ5ä¸ªç§æé¡¹ç®)
2ãgitlabæ¯å
¬å¸èªå·±æå»ºçé¡¹ç®æç®¡å¹³å°
å¦ä½ä¸ºgithubä¸çé¼ç弿ºé¡¹ç®è´¡ç®ä»£ç ï¼
1ãforkéè¦åä½é¡¹ç®
2ãå
é/å
³èforkç项ç®å°æ¬å°
3ãæ°å»ºåæ¯ï¼branchï¼å¹¶æ£åºï¼checkoutï¼æ°åæ¯
4ã卿°åæ¯ä¸å®æä»£ç å¼å
5ãå¼å宿åå°ä½ ç代ç åå¹¶å°master忝
6ãæ·»å åä½è
çä»åºå°åä½ä¸ºä¸ä¸ªæ°çä»åºå°å
7ãåå¹¶åä½è
çmaster忝å°ä½ èªå·±çmaster忝,ç¨äºåä½è
ä»åºä»£ç 忥
8ãpushä½ çæ¬å°ä»åºå°GitHub
9ãå¨Githubä¸æäº¤ pull requests
10ãçå¾
管çåï¼ä½ éè¦è´¡ç®ç弿ºé¡¹ç®ç®¡çåï¼å¤ç
gitä¸ .gitignoreæä»¶çä½ç¨
ä¸è¬æ¥è¯´æ¯ä¸ªGit项ç®ä¸é½éè¦ä¸ä¸ªâ.gitignoreâæä»¶ï¼
è¿ä¸ªæä»¶çä½ç¨å°±æ¯åè¯Gitåªäºæä»¶ä¸éè¦æ·»å å°çæ¬ç®¡çä¸ã
å®é 项ç®ä¸ï¼å¾å¤æä»¶é½æ¯ä¸éè¦çæ¬ç®¡ççï¼æ¯å¦Pythonç.pycæä»¶åä¸äºå å«å¯ç çé ç½®æä»¶ççã
ä»ä¹æ¯ææ·å¼åï¼
'ææ·å¼å'ï¼æ¯ä¸ç§ä»¥äººä¸ºæ ¸å¿ãè¿ä»£ãå¾ªåºæ¸è¿çå¼åæ¹å¼ã
å®å¹¶ä¸æ¯ä¸é¨ææ¯ï¼èæ¯ä¸ç§å¼åæ¹å¼ï¼ä¹å°±æ¯ä¸ç§è½¯ä»¶å¼åçæµç¨ã
å®ä¼æå¯¼æä»¬ç¨è§å®çç¯èå»ä¸æ¥ä¸æ¥å®æé¡¹ç®çå¼åã
å 为å®éç¨çæ¯è¿ä»£å¼å¼åï¼æä»¥è¿ç§å¼åæ¹å¼ç主è¦é©±å¨æ ¸å¿æ¯äºº
ç®è¿° jenkins å·¥å ·çä½ç¨?
'Jenkins'æ¯ä¸ä¸ªå¯æ©å±çæç»éæå¼æã
主è¦ç¨äºï¼
æç»ãèªå¨å°æå»º/æµè¯è½¯ä»¶é¡¹ç®ã
çæ§ä¸äºå®æ¶æ§è¡çä»»å¡ã
å ¬å¸å¦ä½å®ç°ä»£ç åå¸ï¼
ç®è¿° RabbitMQãKafkaãZeroMQçåºå«ï¼
https://blog.****.net/zhailihua/article/details/7899006
RabbitMQå¦ä½å¨æ¶è´¹è è·åä»»å¡åæªå¤çå®åå°±æææ¶ï¼ä¿è¯æ°æ®ä¸ä¸¢å¤±ï¼
为äºé¢é²æ¶æ¯ä¸¢å¤±ï¼rabbitmqæä¾äºack
å³å·¥ä½è¿ç¨å¨æ¶å°æ¶æ¯å¹¶å¤çåï¼åéackç»rabbitmqï¼åç¥rabbitmqè¿æ¶åå¯ä»¥æè¯¥æ¶æ¯ä»éåä¸å é¤äºã
妿工ä½è¿ç¨ææ äºï¼rabbitmqæ²¡ææ¶å°ackï¼é£ä¹ä¼æè¯¥æ¶æ¯ éæ°ååç»å
¶ä»å·¥ä½è¿ç¨ã
ä¸éè¦è®¾ç½®timeoutï¼å³ä½¿è¯¥ä»»å¡éè¦å¾é¿æ¶é´ä¹å¯ä»¥å¤çã
acké»è®¤æ¯å¼å¯çï¼å·¥ä½è¿ç¨æ¾ç¤ºæå®äºno_ack=True
RabbitMQå¦ä½å¯¹æ¶æ¯åæä¹ åï¼
1ãå建éåååéæ¶æ¯æ¶å°è®¾ç½®durable=Tureï¼å¦æå¨æ¥æ¶å°æ¶æ¯è¿æ²¡æå卿¶ï¼æ¶æ¯ä¹æå¯è½ä¸¢å¤±ï¼å°±å¿
é¡»é
ç½®publisher confirm
channel.queue_declare(queue='task_queue', durable=True)
2ãè¿åä¸ä¸ªackï¼è¿ç¨æ¶å°æ¶æ¯å¹¶å¤çå®ä»»å¡åï¼åç»rabbitmqä¸ä¸ªack表示任å¡å·²ç»å®æï¼å¯ä»¥å é¤è¯¥ä»»å¡
3ãéåéåï¼å°queueéåå°clusterä¸å
¶ä»çèç¹ä¹ä¸ã
å¨è¯¥å®ç°ä¸ï¼å¦æé群ä¸çä¸ä¸ªèç¹å¤±æäºï¼queueè½èªå¨å°åæ¢å°éåä¸çå¦ä¸ä¸ªèç¹ä»¥ä¿è¯æå¡çå¯ç¨æ§
RabbitMQå¦ä½æ§å¶æ¶æ¯è¢«æ¶è´¹ç顺åºï¼
é»è®¤æ¶æ¯éåéçæ°æ®æ¯æç
§é¡ºåºè¢«æ¶è´¹è
æ¿èµ°ï¼
ä¾å¦ï¼æ¶è´¹è
1 å»éåä¸è·å奿°åºåçä»»å¡ï¼æ¶è´¹è
2å»éåä¸è·åå¶æ°åºåçä»»å¡ã
channel.basic_qos(prefetch_count=1)
è¡¨ç¤ºè°æ¥è°åï¼ä¸åæç
§å¥å¶æ°æåï¼åæ¶ä¹ä¿è¯äºå
¬å¹³çæ¶è´¹ååï¼
以ä¸RabbitMQçexchange typeåå«ä»£è¡¨ä»ä¹ææï¼å¦ï¼fanoutãdirectãtopicã
amqpåè®®ä¸çæ ¸å¿ææ³å°±æ¯ç产è
åæ¶è´¹è
é离ï¼ç产è
ä»ä¸ç´æ¥å°æ¶æ¯åéç»éåã
ç产è
é常ä¸ç¥éæ¯å¦ä¸ä¸ªæ¶æ¯ä¼è¢«åéå°éåä¸ï¼åªæ¯å°æ¶æ¯åéå°ä¸ä¸ªäº¤æ¢æºã
å
ç±Exchangeæ¥æ¥æ¶ï¼ç¶åExchangeæç
§ç¹å®ççç¥è½¬åå°Queueè¿è¡åå¨ã
åçï¼æ¶è´¹è
乿¯å¦æ¤ãExchange 就类似äºä¸ä¸ªäº¤æ¢æºï¼è½¬ååä¸ªæ¶æ¯ååå°ç¸åºçéåä¸ã
--------------------------------------------------
type=fanout 类似åå¸è
订é
è
模å¼ï¼ä¼ä¸ºæ¯ä¸ä¸ªè®¢é
è
å建ä¸ä¸ªéåï¼èåå¸è
å叿¶æ¯æ¶ï¼ä¼å°æ¶æ¯æ¾ç½®å¨ææç¸å
³éåä¸
type=direct éåç»å®å
³é®åï¼åéè
å°æ°æ®æ ¹æ®å
³é®ååéå°æ¶æ¯exchangeï¼exchangeæ ¹æ® å
³é®å å¤å®åºè¯¥å°æ°æ®åéè³æå®éåã
type=topic éåç»å®å 个模ç³çå
³é®åï¼ä¹ååéè
å°æ°æ®åéå°exchangeï¼exchangeå°ä¼ å
¥âè·¯ç±å¼âå âå
³é®åâè¿è¡å¹é
ï¼å¹é
æåï¼
åå°æ°æ®åéå°æå®éåã
---------------------------------------------------
åéè
è·¯ç±å¼ éåä¸
old.boy.python old.* -- ä¸å¹é
*表示å¹é
ä¸ä¸ª
old.boy.python old.# -- å¹é
#表示å¹é
0个æå¤ä¸ª
ç®è¿° celery æ¯ä»ä¹ä»¥ååºç¨åºæ¯ï¼
# Celeryæ¯ç±Pythonå¼åçä¸ä¸ªç®åãçµæ´»ãå¯é çå¤ç大éä»»å¡çååç³»ç»ï¼ # å®ä¸ä» æ¯æå®æ¶å¤ç乿¯æä»»å¡è°åº¦ã # http://www.cnblogs.com/wupeiqi/articles/8796552.html
ç®è¿°celeryè¿è¡æºå¶ã
celeryå¦ä½å®ç°å®æ¶ä»»å¡ï¼
# celeryå®ç°å®æ¶ä»»å¡
å¯ç¨Celeryç宿¶ä»»å¡éè¦è®¾ç½®CELERYBEAT_SCHEDULE ã
CELERYBEAT_SCHEDULE='djcelery.schedulers.DatabaseScheduler'#宿¶ä»»å¡
'åå»ºå®æ¶ä»»å¡'
# éè¿é
ç½®CELERYBEAT_SCHEDULEï¼
#æ¯30ç§è°ç¨task.add
from datetime import timedelta
CELERYBEAT_SCHEDULE = {
'add-every-30-seconds': {
'task': 'tasks.add',
'schedule': timedelta(seconds=30),
'args': (16, 16)
},
}
ç®è¿° celeryå¤ä»»å¡ç»æç®å½
pro_cel
âââ celery_tasks # celeryç¸å
³æä»¶å¤¹
â âââ celery.py # celeryè¿æ¥åé
ç½®ç¸å
³æä»¶
â âââ tasks.py # ææä»»å¡å½æ°
âââ check_result.py # æ£æ¥ç»æ
âââ send_task.py # 触åä»»å¡
celeryä¸è£ é¥°å¨ @app.task å @shared_taskçåºå«ï¼
# ä¸è¬æ åµä½¿ç¨çæ¯ä»celeryappä¸å¼å ¥çappä½ä¸ºçè£ é¥°å¨ï¼@app.task # djangoé£ç§å¨appä¸å®ä¹çtaskåéè¦ä½¿ç¨@shared_task
ç®è¿° requests模åçä½ç¨ååºæ¬ä½¿ç¨ï¼
# ä½ç¨ï¼
使ç¨requestså¯ä»¥æ¨¡ææµè§å¨ç请æ±
# 常ç¨åæ°ï¼
urlãheadersãcookiesãdata
jsonãparamsãproxy
# 常ç¨è¿åå¼ï¼
content
iter_content
text
encoding="utf-8"
cookie.get_dict()
ç®è¿° beautifulsoup模åçä½ç¨ååºæ¬ä½¿ç¨ï¼
# BeautifulSoup
ç¨äºä»HTMLæXMLæä»¶ä¸æåãè¿æ»¤æ³è¦çæ°æ®å½¢å¼
#å¸¸ç¨æ¹æ³
è§£æï¼html.parser æè
lxmlï¼éè¦ä¸è½½å®è£
ï¼
findãfind_allãtextãattrsãget
ç®è¿° seleninu模åçä½ç¨ååºæ¬ä½¿ç¨?
Seleniumæ¯ä¸ä¸ªç¨äºWebåºç¨ç¨åºæµè¯çå·¥å
·ï¼
ä»çæµè¯ç´æ¥è¿è¡å¨æµè§å¨ä¸ï¼æ¨¡æçå®ç¨æ·ï¼æç
§ä»£ç ååºç¹å»ãè¾å
¥ãæå¼çæä½
ç¬è«ä¸ä½¿ç¨ä»æ¯ä¸ºäºè§£å³requestsæ æ³è§£å³javascript卿é®é¢
scrapyæ¡æ¶ä¸åç»ä»¶ç工使µç¨ï¼
#1ãçæåå§çRequestsæ¥ç¬å第ä¸ä¸ªURLSï¼å¹¶ä¸æ è¯ä¸ä¸ªåè°å½æ°
第ä¸ä¸ªè¯·æ±å®ä¹å¨start_requests()æ¹æ³å
é»è®¤ä»start_urlså表ä¸è·å¾urlå°åæ¥çæRequest请æ±ï¼
é»è®¤çåè°å½æ°æ¯parseæ¹æ³ãåè°å½æ°å¨ä¸è½½å®æè¿åresponseæ¶èªå¨è§¦å
#2ãå¨åè°å½æ°ä¸ï¼è§£æresponseå¹¶ä¸è¿åå¼
è¿åå¼å¯ä»¥4ç§ï¼
aãå
å«è§£ææ°æ®çåå
¸
bãItem对象
cãæ°çRequestå¯¹è±¡ï¼æ°çRequestsä¹éè¦æå®ä¸ä¸ªåè°å½æ°ï¼
dãæè
æ¯å¯è¿ä»£å¯¹è±¡ï¼å
å«ItemsæRequestï¼
#3ãå¨åè°å½æ°ä¸è§£æé¡µé¢å
容
é常使ç¨Scrapyèªå¸¦çSelectorsï¼ä½å¾ææ¾ä½ ä¹å¯ä»¥ä½¿ç¨Beutifulsoupï¼lxmlæå
¶ä»ä½ ç±ç¨å¥ç¨å¥ã
#4ãæåï¼é对è¿åçItems对象å°ä¼è¢«æä¹
åå°æ°æ®åº
éè¿Item Pipelineç»ä»¶åå°æ°æ®åº
æè
导åºå°ä¸åçæä»¶ï¼éè¿Feed exportsï¼
http://www.cnblogs.com/wupeiqi/articles/6229292.html
å¨scrapyæ¡æ¶ä¸å¦ä½è®¾ç½®ä»£çï¼ä¸¤ç§æ¹æ³ï¼ï¼
æ¹å¼ä¸ï¼å
置添å 代çåè½
# -*- coding: utf-8 -*-
import os
import scrapy
from scrapy.http import Request
class ChoutiSpider(scrapy.Spider):
name = âchoutiâ
allowed_domains = [âchouti.comâ]
start_urls = [âhttps://dig.chouti.com/â]
def<span> start_requests(self):
os.environ['HTTP_PROXY'] = "http://192.168.11.11"
for url in<span> self.start_urls:
yield Request(url=url,callback=<span>self.parse)
def<span> parse(self, response):
print<span>(response)
æ¹å¼äºï¼èªå®ä¹ä¸è½½ä¸é´ä»¶
import random
import base64
import six
def to_bytes(text, encoding=None, errors=âstrictâ):
âââReturn the binary representation of text
. If text
is already a bytes object, return it as-is.â""
if isinstance(text, bytes):
return text
if not isinstance(text, six.string_types):
raise TypeError('to_bytes must receive a unicode, str or bytes â
âobject, got %sâ % type(text).name)
if encoding is None:
encoding = âutf-8â
return text.encode(encoding, errors)
class MyProxyDownloaderMiddleware(object):
def process_request(self, request, spider):
proxy_list = [
{âip_portâ: â111.11.228.75:80â, âuser_passâ: âxxx:123â},
{âip_portâ: â120.198.243.22:80â, âuser_passâ: ââ},
{âip_portâ: â111.8.60.9:8123â, âuser_passâ: ââ},
{âip_portâ: â101.71.27.120:80â, âuser_passâ: ââ},
{âip_portâ: â122.96.59.104:80â, âuser_passâ: ââ},
{âip_portâ: â122.224.249.122:8088â, âuser_passâ: ââ},
]
proxy = random.choice(proxy_list)
if proxy[âuser_passâ] is not None:
request.meta[âproxyâ] = to_bytes(âhttp://%sâ % proxy[âip_portâ])
encoded_user_pass = base64.encodestring(to_bytes(proxy[âuser_passâ]))
request.headers[âProxy-Authorizationâ] = to_bytes('Basic â + encoded_user_pass)
else:
request.meta[âproxyâ] = to_bytes(âhttp://%sâ % proxy[âip_portâ])
é
ç½®ï¼
DOWNLOADER_MIDDLEWARES = {
# âxiaohan.middlewares.MyProxyDownloaderMiddlewareâ: 543,
}
scrapyæ¡æ¶ä¸å¦ä½å®ç°å¤§æä»¶çä¸è½½ï¼
from twisted.web.client import Agent, getPage, ResponseDone, PotentialDataLoss
from twisted.internet import defer, reactor, protocol
from twisted.web._newclient import Response
from io import BytesIO
class _ResponseReader(protocol.Protocol):
def init(self, finished, txresponse, file_name):
self._finished = finished
self._txresponse = txresponse
self._bytes_received = 0
self.f = open(file_name, mode=âwbâ)
def dataReceived(self, bodyBytes):
self._bytes_received += len(bodyBytes)
# ä¸ç¹ä¸ç¹çä¸è½½
self.f.write(bodyBytes)
self.f.flush()
def connectionLost(self, reason):
if self._finished.called:
return
if reason.check(ResponseDone):
# ä¸è½½å®æ
self._finished.callback((self._txresponse, âsuccessâ))
elif reason.check(PotentialDataLoss):
# ä¸è½½é¨å
self._finished.callback((self._txresponse, âpartialâ))
else:
# ä¸è½½å¼å¸¸
self._finished.errback(reason)
self.f.close()
scrapyä¸å¦ä½å®ç°ééï¼
http://scrapy-chs.readthedocs.io/zh_CN/1.0/topics/autothrottle.html
scrapyä¸å¦ä½å®ç°æåç¬è«ï¼
# æäºæ
åµä¸ï¼ä¾å¦ç¬å大çç«ç¹ï¼æä»¬å¸æè½æåç¬åï¼ä¹å忢å¤è¿è¡ã
# Scrapyéè¿å¦ä¸å·¥å
·æ¯æè¿ä¸ªåè½:
ä¸ä¸ªæè°åº¦è¯·æ±ä¿åå¨ç£ççè°åº¦å¨
ä¸ä¸ªæè®¿é®è¯·æ±ä¿åå¨ç£çç坿¬è¿æ»¤å¨[duplicates filter]
ä¸ä¸ªè½æç»ä¿æç¬è«ç¶æ(é®/å¼å¯¹)çæ©å±
Job è·¯å¾
è¦å¯ç¨æä¹
忝æï¼ä½ åªéè¦éè¿ JOBDIR 设置 job directory é项ã
è¿ä¸ªè·¯å¾å°ä¼å卿æçè¯·æ±æ°æ®æ¥ä¿æä¸ä¸ªåç¬ä»»å¡çç¶æ(ä¾å¦ï¼ä¸æ¬¡spiderç¬å(a spider run))ã
å¿
é¡»è¦æ³¨æçæ¯ï¼è¿ä¸ªç®å½ä¸å
许被ä¸åçspider å
±äº«ï¼çè³æ¯åä¸ä¸ªspiderçä¸åjobs/runsä¹ä¸è¡ã
ä¹å°±æ¯è¯´ï¼è¿ä¸ªç®å½å°±æ¯åå¨ä¸ä¸ª åç¬ jobçç¶æä¿¡æ¯ã
scrapyä¸å¦ä½è¿è¡èªå®å¶å½ä»¤ï¼
å¨spiderså级å建任æç®å½ï¼å¦ï¼commands
å¨å
¶ä¸å建'crawlall.py'æä»¶ï¼æ¤å¤æä»¶åå°±æ¯èªå®ä¹çå½ä»¤ï¼
from scrapy.commands import ScrapyCommand
from scrapy.utils.project import get_project_settings
class Command(ScrapyCommand):
requires_project = True
def syntax(self):
return '[options]'
def short_desc(self):
return 'Runs all of the spiders'
def run(self, args, opts):
spider_list = self.crawler_process.spiders.list()
for name in spider_list:
self.crawler_process.crawl(name, **opts.__dict__)
self.crawler_process.start()
å¨'settings.py'䏿·»å é
ç½®'COMMANDS_MODULE = '项ç®åç§°.ç®å½åç§°''
å¨é¡¹ç®ç®å½æ§è¡å½ä»¤ï¼'scrapy crawlall'
scrapyä¸å¦ä½å®ç°çè®°å½ç¬è«ç深度ï¼
'DepthMiddleware'æ¯ä¸ä¸ªç¨äºè¿½è¸ªæ¯ä¸ªRequestå¨è¢«ç¬åçç½ç«ç深度çä¸é´ä»¶ã
å
¶å¯ä»¥ç¨æ¥éå¶ç¬å深度çæå¤§æ·±åº¦æç±»ä¼¼çäºæ
ã
'DepthMiddleware'å¯ä»¥éè¿ä¸å设置è¿è¡é
ç½®(æ´å¤å
容请åèè®¾ç½®ææ¡£):
âDEPTH_LIMITâ:ç¬åæå
许çæå¤§æ·±åº¦ï¼å¦æä¸º0ï¼å没æéå¶ã
âDEPTH_STATSâ:æ¯å¦æ¶éç¬åç¶æã
âDEPTH_PRIORITYâ:æ¯å¦æ ¹æ®å
¶æ·±åº¦å¯¹requet宿ä¼å
scrapyä¸çpipelineså·¥ä½åçï¼
Scrapy æä¾äº pipeline æ¨¡åæ¥æ§è¡ä¿åæ°æ®çæä½ã
å¨å建ç Scrapy 项ç®ä¸èªå¨å建äºä¸ä¸ª pipeline.py æä»¶ï¼åæ¶å建äºä¸ä¸ªé»è®¤ç Pipeline ç±»ã
æä»¬å¯ä»¥æ ¹æ®éè¦èªå®ä¹ Pipeline ç±»ï¼ç¶åå¨ settings.py æä»¶ä¸è¿è¡é
ç½®å³å¯
scrapyçpipelineså¦ä½ä¸¢å¼ä¸ä¸ªitem对象ï¼
éè¿raise DropItem()æ¹æ³
ç®è¿°scrapyä¸ç¬è«ä¸é´ä»¶åä¸è½½ä¸é´ä»¶çä½ç¨ï¼1
http://www.cnblogs.com/wupeiqi/articles/6229292.html
scrapy-redisç»ä»¶çä½ç¨ï¼
å®ç°äºåå¸å¼ç¬è«ï¼urlå»éãè°åº¦å¨ãæ°æ®æä¹
å
'scheduler'è°åº¦å¨
'dupefilter'URLå»éè§åï¼è¢«è°åº¦å¨ä½¿ç¨ï¼
'pipeline'æ°æ®æä¹
å
scrapy-redisç»ä»¶ä¸å¦ä½å®ç°çä»»å¡çå»éï¼
a. å
é¨è¿è¡é
ç½®ï¼è¿æ¥Redis
b.å»éè§åéè¿redisçéå宿ï¼éåçKey为ï¼
key = defaults.DUPEFILTER_KEY % {'timestamp': int(time.time())}
é»è®¤é
ç½®ï¼
DUPEFILTER_KEY = 'dupefilter:%(timestamp)s'
c.å»éè§åä¸å°urlè½¬æ¢æå¯ä¸æ 示ï¼ç¶åå¨redis䏿£æ¥æ¯å¦å·²ç»å¨éåä¸åå¨
from scrapy.utils import request
from scrapy.http import Request
req = Request(url='http://www.cnblogs.com/wupeiqi.html')
result = request.request_fingerprint(req)
print(result) # 8ea4fd67887449313ccc12e5b6b92510cc53675c
scrapyåscrapy-redisçå»éè§åï¼æºç ï¼ 1. scrapyä¸å»éè§åæ¯å¦ä½å®ç°ï¼ class RFPDupeFilter(BaseDupeFilter): """Request Fingerprint duplicates filter"""def __init__(self, path=None, debug=<span>False): self.fingerprints =<span> set() @classmethod def<span> from_settings(cls, settings): debug = settings.getbool('DUPEFILTER_DEBUG'<span>) return<span> cls(job_dir(settings), debug) def<span> request_seen(self, request): # å°requestå¯¹è±¡è½¬æ¢æå¯ä¸æ è¯ã fp =<span> self.request_fingerprint(request) # 夿å¨éå䏿¯å¦åå¨ï¼å¦æåå¨åè¿åTrueï¼è¡¨ç¤ºå·²ç»è®¿é®è¿ã if fp in<span> self.fingerprints: return<span> True # ä¹åæªè®¿é®è¿ï¼å°urlæ·»å å°è®¿é®è®°å½ä¸ã
self.fingerprints.add(fp)
def<span> request_fingerprint(self, request):
return<span> request_fingerprint(request)
-
scrapy-redisä¸å»éè§åæ¯å¦ä½å®ç°ï¼
class RFPDupeFilter(BaseDupeFilter):
ââ"Redis-based request duplicates filter.This class can also be used with default Scrapyâs scheduler.
ââ"
logger = logger
def init(self, server, key, debug=False):
# self.server = redisè¿æ¥ self.server =<span> server # self.key = dupefilter:123912873234 self.key =<span> key
@classmethod
def from_settings(cls, settings):# 读åé ç½®ï¼è¿æ¥redis server =<span> get_redis_from_settings(settings) # key = dupefilter:123912873234 key = defaults.DUPEFILTER_KEY % {'timestamp'<span>: int(time.time())} debug = settings.getbool('DUPEFILTER_DEBUG'<span>) return cls(server, key=key, debug=<span>debug)
@classmethod
def from_crawler(cls, crawler):return<span> cls.from_settings(crawler.settings)
def request_seen(self, request):
fp =<span> self.request_fingerprint(request) # This returns the number of values added, zero if already exists. # self.server=redisè¿æ¥ # æ·»å å°rediséåä¸ï¼1ï¼æ·»å å·¥ç¨ï¼0ï¼å·²ç»åå¨ added =<span> self.server.sadd(self.key, fp) return added ==<span> 0
def request_fingerprint(self, request):
return<span> request_fingerprint(request)
def close(self, reason=ââ):
self.clear()
def clear(self):
âââClears fingerprints data.â""
self.server.delete(self.key)
scrapy-redisçè°åº¦å¨å¦ä½å®ç°ä»»å¡ç深度ä¼å å广度ä¼å ï¼....
ç®è¿° vitualenv ååºç¨åºæ¯?
'vitualenv'æ¯ä¸ä¸ªç¬ç«çpythonèæç¯å¢
å¦ï¼
å½å项ç®ä¾èµçæ¯ä¸ä¸ªçæ¬ï¼ä½æ¯å¦ä¸ä¸ªé¡¹ç®ä¾èµçæ¯å¦ä¸ä¸ªçæ¬ï¼è¿æ ·å°±ä¼é æä¾èµå²çªï¼
èvirtualenvå°±æ¯è§£å³è¿ç§æ
åµçï¼virtualenvéè¿å建ä¸ä¸ªèæåçpythonè¿è¡ç¯å¢ï¼
尿们æéçä¾èµå®è£
è¿å»çï¼ä¸å项ç®ä¹é´ç¸äºä¸å¹²æ°
ç®è¿° pipreqs ååºç¨åºæ¯ï¼
å¯ä»¥éè¿å¯¹é¡¹ç®ç®å½æ«æï¼èªå¨åç°ä½¿ç¨äºé£äºç±»åºï¼å¹¶ä¸èªå¨çæä¾èµæ¸
åã
pipreqs ./ çærequirements.txt
å¨Pythonä¸ä½¿ç¨è¿ä»ä¹ä»£ç æ£æ¥å·¥å ·ï¼
1ï¼PyFlakesï¼éææ£æ¥Python代ç é»è¾é误çå·¥å
·ã
2ï¼Pep8ï¼ éææ£æ¥PEP8ç¼ç 飿 ¼çå·¥å
·ã
3ï¼NedBatchelderâs McCabe scriptï¼éæåæPython代ç å¤æåº¦çå·¥å
·ã
Python