1.DebugåReleaseçåºå«
2.深入理解 Hadoop (七)YARN资源管理和调度详解
3.djangoå端ç¨ä»ä¹åï¼
4.djangoè·drfåªä¸ªå¥½(djangoådrf)
5.django是前端还是后端
DebugåReleaseçåºå«
ããDebugåReleaseåºå«
ããVCä¸DebugåReleaseåºå«
ããæè¿å代ç è¿ç¨ä¸ï¼åç° Debug ä¸è¿è¡æ£å¸¸ï¼Release ä¸å°±ä¼åºç°é®é¢ï¼ç¾æä¸å¾å ¶è§£ï¼èRelease ä¸åæ æ³è¿è¡è°è¯ï¼äºæ¯åªè½éç¨printfæ¹å¼éæ¥å®ä½å°é®é¢æå¨å¤ï¼æåç°åæ¥æ¯ç»å®çä¸ä¸ªæ°ç»æªåå§åï¼å¯¼è´åé¢å¤çå¼å¸¸ãç½ä¸æ¥æ¾äºäºèµæï¼å¨è¿ ç½åæ±æ»ä¸ï¼å为å¤å¿ï½
ããä¸ãDebug å Release çåºå«
ããDebug é常称为è°è¯çæ¬ï¼å®å å«è°è¯ä¿¡æ¯ï¼å¹¶ä¸ä¸ä½ä»»ä½ä¼åï¼ä¾¿äºç¨åºåè°è¯ç¨åºãRelease 称为åå¸çæ¬ï¼å®å¾å¾æ¯è¿è¡äºåç§ä¼åï¼ä½¿å¾ç¨åºå¨ä»£ç 大å°åè¿è¡é度ä¸é½æ¯æä¼çï¼ä»¥ä¾¿ç¨æ·å¾å¥½å°ä½¿ç¨ã
ããDebug å Release ççæ£åºå«ï¼å¨äºä¸ç»ç¼è¯é项ã
ããDebug çæ¬
ããåæ° å«ä¹
ãã/MDd /MLd æ /MTd ä½¿ç¨ Debug runtime library(è°è¯çæ¬çè¿è¡æ¶å»å½æ°åº)
ãã/Od å ³éä¼åå¼å ³
ãã/D "_DEBUG" ç¸å½äº #define _DEBUG,æå¼ç¼è¯è°è¯ä»£ç å¼å ³(主è¦é对assertå½æ°)
ãã/ZI
ããå建 Edit and continue(ç¼è¾ç»§ç»)æ°æ®åºï¼è¿æ ·å¨è°è¯è¿ç¨ä¸å¦æä¿®æ¹äºæºä»£ç ä¸ééæ°ç¼è¯
ããGZ å¯ä»¥å¸®å©æè·å åé误
ãã
ããRelease çæ¬ åæ°å«ä¹
ãã/MD /ML æ /MT 使ç¨åå¸çæ¬çè¿è¡æ¶å»å½æ°åº
ãã/O1 æ /O2 ä¼åå¼å ³ï¼ä½¿ç¨åºæå°ææå¿«
ãã/D "NDEBUG" å ³éæ¡ä»¶ç¼è¯è°è¯ä»£ç å¼å ³(å³ä¸ç¼è¯assertå½æ°)
ãã/GF å并éå¤çå符串ï¼å¹¶å°å符串常éæ¾å°åªè¯»å åï¼é²æ¢è¢«ä¿®æ¹
ããDebug å Release 并没ææ¬è´¨ççéï¼ä»ä»¬åªæ¯ä¸ç»ç¼è¯é项çéåï¼ç¼è¯å¨åªæ¯æç §é¢å®çé项è¡å¨ã
ãã
ãããã1. åéã
ãã大家é½ç¥éï¼debugè·releaseå¨åå§ååéæ¶æåçæä½æ¯ä¸åçï¼debugæ¯å°æ¯ä¸ªåèä½é½èµæ0xcc(注1)ï¼èreleaseçèµå¼è¿ ä¼¼äºéæº(ææ³æ¯ç´æ¥ä»å åä¸åé çï¼æ²¡æåå§åè¿)ãè¿æ ·å°±æç¡®äºï¼å¦æä½ çç¨åºä¸çæ个åé没被åå§å就被å¼ç¨ï¼å°±å¾æå¯è½åºç°å¼å¸¸ï¼ç¨ä½æ§å¶åéå° å¯¼è´æµç¨å¯¼åä¸ä¸è´ï¼ç¨ä½æ°ç»ä¸æ å°ä¼ä½¿ç¨åºå´©æºï¼æ´å å¯è½æ¯é æå ¶ä»åéçä¸åç¡®èå¼èµ·å ¶ä»çé误ãæ以å¨å£°æåéå马ä¸å¯¹å ¶åå§åä¸ä¸ªé»è®¤çå¼æ¯æç® åææçåæ³ï¼å¦å项ç®å¤§äºä½ æ¾é½æ²¡å°æ¹æ¾ã代ç åå¨é误å¨debugæ¹å¼ä¸å¯è½ä¼å¿½ç¥èä¸è¢«å¯è§å°ï¼å¦debugæ¹å¼ä¸æ°ç»è¶çä¹å¤§å¤ä¸ä¼åºéï¼å¨ releaseä¸å°±æ´é²åºæ¥äºï¼è¿ä¸ªæ¾èµ·æ¥å°±æ¯è¾é¾äº:( è¿æ¯èªå·±å¤å 注æå§
ããåµåµï¼å°±æ¯æç¯çé®é¢ï½ï½
ãã2. èªå®ä¹æ¶æ¯çæ¶æ¯åæ°ã
ããMFC为æ们æä¾äºå¾å¥½çæ¶æ¯æºå¶ï¼æ´å¢å äºèªå®ä¹æ¶æ¯ï¼å¥½å¤æå°±ä¸ç¨å¤è¯´äºãè¿ä¹åå¨debugè·releaseçé®é¢åï¼çæ¡æ¯è¯å®çãå¨èªå®ä¹æ¶æ¯ çå½æ°ä½å£°ææ¶ï¼æ¶å¸¸ä¼çå°è¿æ ·çåæ³ï¼afx_msg LRESULT OnMessageOwn(); Debugæ åµä¸ä¸è¬ä¸ä¼æä»»ä½é®é¢ï¼èå½ä½ å¨Releaseä¸ä¸å¤çº¿ç¨æè¿ç¨é´ä½¿ç¨äºæ¶æ¯ä¼ éæ¶å°±ä¼å¯¼è´æ æå¥æä¹ç±»çé误ã导è´è¿ä¸ªé误ç´æ¥åå æ¯æ¶ æ¯ä½çåæ°æ²¡ææ·»å ï¼å³åºè¯¥åæï¼afx_msg LRESULT OnMessageOwn(WPARAM wparam, LPARAM lparam); (注2)
ãã3. release模å¼ä¸ä¸åºéï¼ä½debug模å¼ä¸æ¥éã
ããè¿ç§æ åµä¸å¤§å¤ä¹æ¯å 为代ç 书åä¸æ£ç¡®å¼èµ·çï¼æ¥çMFCçæºç ï¼å¯ä»¥åç°å¥½å¤ASSERTçè¯å¥(æè¨)ï¼è¿ä¸ªå®åªæ¯å¨debug模å¼ä¸æææï¼é£ä¹å°± æ¸ æ¥äºï¼releaseçä¸æ¥éæ¯å¿½ç¥äºé误èä¸æ¯æ²¡æé误ï¼è¿å¯è½åå¨å¾å¤§çéæ£ï¼å 为æ¯Debug模å¼ä¸ï¼æ¯è¾æ¹ä¾¿è°è¯ï¼å¥½å¥½çæ£æ¥èªå·±ç代ç ï¼åæ¤ å°±ä¸å¤è¯´äºã
ãã4. ASSERT, VERIFY, TRACE..........è°è¯å®
ããè¿ç§æ åµå¾å®¹æ解éã举个ä¾åï¼è¯·å¨VCä¸è¾å ¥ASSERTç¶åéä¸æFè·³å°å®å®ä¹çå°æ¹ï¼è¿éä½ å°±è½å¤åç°Debugä¸ASSERTè¦æ§è¡ AfxAssertFailedLineï¼èReleaseä¸çå®å®ä¹å´ä¸º"#define ASSERT(f) ((void)0)"ãæ以注æå¨è¿äºè°è¯å®çè¯å¥ä¸è¦ç¨ç¨åºç¸å ³åéå¦i++åæä½çè¯å¥ãVERIFYæ¯ä¸ªä¾å¤ï¼"#define VERIFY(f) ((void)(f))"ï¼å³æ§è¡ï¼è¿éçä½ç¨å°±ä¸å¤è¿½ç©¶äºï¼æå ´è¶£å¯èªå·±ç 究:)ã
ããæ»ç»ï¼
ããDebugä¸Releaseä¸åçé®é¢å¨åå¼å§ç¼å代ç æ¶ä¼ç»å¸¸åçï¼%æ¯å ä¸ºä½ ç代ç 书åé误è导è´çï¼æ以ä¸è¦å¨ä¸å¨å°±è¯´ç³»ç»é®é¢æç¼è¯å¨é®é¢ï¼ åªåæ¾æ¾èªå·±çåå ææ¯æ ¹æ¬ãæä»å就常常éå°è¿æ åµï¼ç»åè¿ä¸æ¬¡æ¬¡çæè®åæå°±å¼å§æ³¨æäºï¼ç°å¨ææåè¿ç代ç æå·²ç»å¥½ä¹ 没éå°è¿ç§é®é¢äºãä¸é¢æ¯å 个 é¿å çæ¹é¢ï¼å³ä½¿æ²¡æè¿ç§é®é¢ä¹åºæ³¨æä¸ä¸ï¼
ãã1. 注æåéçåå§åï¼å°¤å ¶æ¯æéåéï¼æ°ç»åéçåå§å(å¾å¤§çæ åµä¸å¦ä½èèäº)ã
ãã2. èªå®ä¹æ¶æ¯åå ¶ä»å£°æçæ ååæ³
ãã3. 使ç¨è°è¯å®æ¶ä½¿ç¨åæ好注éæ
ãã4. å°½é使ç¨try - catch(...)
ãã5. å°½é使ç¨æ¨¡åï¼ä¸ä½è¡¨è¾¾æ¸ æ¥èä¸æ¹ä¾¿è°è¯ã
ãã注1ï¼
ããdebugçåå§åæ0xccæ¯å 为0xccå¨xä¸æ¯ä¸æ¡int 3åæ¥ä¸ææ令ï¼è¿æ ·ç¨åºå¦æè·é£äºéå°0xccå°±ä¼åä¸æ¥ï¼è¿ååçæºç¼ç¨æ¶ä¸è¬å°æ²¡ç¨ç代ç 空é´å¡«å ¥jmp è¯å¥æ¯ä¸æ ·å°è½¬è´´äºï¼è®¡ç®æºäºçº§èè¯_èè¯å¤§ãè´£ç¼:drfcy çº éã
ãã[VC]DEBUGåRELEASEå¹´ææ¥ æææ¥ ä¸å : I. å ååé é®é¢
ãã
ãã1. åéæªåå§åãä¸é¢çç¨åºå¨debugä¸è¿è¡çå¾å¥½ã
ãã
ããthing * search(thing * something)
ããBOOL found;
ããfor(int i = 0; i < whatever.GetSize(); i++)
ãã{
ããif(whatever[i]->field == something->field)
ãã{ /* found it */
ããfound = TRUE;
ããbreak;
ãã} /* found it */
ãã}
ããif(found)
ããreturn whatever[i];
ããelse
ããreturn NULL;
ããèå¨releaseä¸å´ä¸è¡ï¼å 为debugä¸ä¼èªå¨ç»åéåå§åfound=FALSE,èå¨releaseçä¸åä¸ä¼ãæ以尽å¯è½çç»åéãç±»æç»æåå§åã
ãã
ãã2. æ°æ®æº¢åºçé®é¢
ãã
ããå¦ï¼char buffer[];
ããint counter;
ãã
ããlstrcpy(buffer, "abcdefghik");
ãã
ããå¨debugçä¸bufferçNULLè¦çäºcounterçé«ä½ï¼ä½æ¯é¤écounter>M,ä»ä¹é®é¢ä¹æ²¡æãä½æ¯å¨releaseç ä¸ï¼counterå¯è½è¢«æ¾å¨å¯åå¨ä¸ï¼è¿æ ·NULLå°±è¦çäºbufferä¸é¢ç空é´ï¼å¯è½å°±æ¯å½æ°çè¿åå°åï¼è¿å°å¯¼è´ACCESS ERRORã
ãã
ãã3. DEBUGçåRELEASEççå ååé æ¹å¼æ¯ä¸åç ãå¦æä½ å¨DEBUGçä¸ç³è¯· ele 为 6*sizeof(DWORD)=bytes,å®é ä¸åé ç»ä½ çæ¯bytesï¼debugç以bytes为åä½åé ï¼ï¼ èå¨releaseçï¼åé ç»ä½ çå°±æ¯bytesï¼releaseç以8bytes为åä½ï¼ï¼æ以å¨debugçä¸å¦æä½ åele[6],å¯è½ä¸ä¼æ ä»ä¹é®é¢ï¼èå¨releaseçä¸ï¼å°±æACCESS VIOLATEã
ãã
ããII. ASSERTåVERIFY
ãã
ãã1. ASSERTå¨Releaseçæ¬ä¸æ¯ä¸ä¼è¢«ç¼è¯çã
ãã
ããASSERTå®æ¯è¿æ ·å®ä¹ç
ãã
ãã#ifdef _DEBUG
ãã#define ASSERT(x) if( (x) == 0) report_assert_failure()
ãã#else
ãã#define ASSERT(x)
ãã#endif
ããå®é ä¸å¤æä¸äºï¼ä½æ å ³ç´§è¦ãåå¦ä½ å¨è¿äºè¯å¥ä¸å äºç¨åºä¸å¿ é¡»è¦æç代ç
ããæ¯å¦
ãã
ããASSERT(pNewObj = new CMyClass);
ãã
ããpNewObj->MyFunction();
ãã
ããè¿ç§æ¶åReleaseçæ¬ä¸çpNewObjä¸ä¼åé å°ç©ºé´
ãã
ããæ以æ§è¡å°ä¸ä¸ä¸ªè¯å¥çæ¶åç¨åºä¼æ¥è¯¥ç¨åºæ§è¡äºéæ³æä½çé误ãè¿æ¶å¯ä»¥ç¨VERIFY ï¼
ãã
ãã#ifdef _DEBUG
ãã#define VERIFY(x) if( (x) == 0) report_assert_failure()
ãã#else
ãã#define VERIFY(x) (x)
ãã#endif
ããè¿æ ·çè¯ï¼ä»£ç å¨releaseçä¸å°±å¯ä»¥æ§è¡äºã
ãã
ããIII. åæ°é®é¢ï¼
ãã
ããèªå®ä¹æ¶æ¯çå¤çå½æ°ï¼å¿ é¡»å®ä¹å¦ä¸ï¼
ãã
ããafx_msg LRESULT OnMyMessage(WPARAM, LPARAM);
ãã
ããè¿åå¼å¿ é¡»æ¯HRESULTåï¼å¦åDebugä¼è¿ï¼èReleaseåºé
ãã
ããIV. å ååé
ãã
ããä¿è¯æ°æ®å建åæ¸ é¤çç»ä¸æ§ï¼å¦æä¸ä¸ªDLLæä¾ä¸ä¸ªè½å¤å建æ°æ®çå½æ°ï¼é£ä¹è¿ä¸ªDLLåæ¶åºè¯¥æä¾ä¸ä¸ªå½æ°éæ¯è¿äºæ°æ®ãæ°æ®çå建åæ¸ é¤åºè¯¥å¨åä¸ä¸ªå±æ¬¡ä¸ã
ãã
ããV. DLLçç¾é¾
ãã
ãã人们å°ä¸åçæ¬DLLæ··åé æçä¸ä¸è´æ§å½¢è±¡ç称为 âå¨æè¿æ¥åºçå°ç±â(DLL Hell) ï¼çè³å¾®è½¯èªå·±ä¹è¿ä¹è¯´
ãã
ããå¦æä½ çç¨åºä½¿ç¨ä½ èªå·±çDLLæ¶è¯·æ³¨æï¼
ãã
ãã1. ä¸è½å°debugåreleaseççDLLæ··åå¨ä¸èµ·ä½¿ç¨ãdebugé½æ¯debugçï¼releaseçé½æ¯releaseçã
ãã
ãã解å³åæ³æ¯å°debugåreleaseçç¨åºåå«æ¾å¨ä¸»ç¨åºçdebugåreleaseç®å½ä¸
ãã
ãã
ãã2. åä¸ä¸è¦ä»¥ä¸ºéæè¿æ¥åºä¼è§£å³é®é¢ï¼é£åªä¼ä½¿æ åµæ´ç³ç³ã
ãã
ããVI. RELEASEæ¿ä¸çè°è¯ ï¼
ãã
ãã1. å°ASSERT() æ¹ä¸º VERIFY() ãæ¾åºå®ä¹å¨"#ifdef _DEBUG"ä¸ç代ç ï¼å¦æå¨RELEASEçæ¬ä¸éè¦è¿äºä»£ç 请å°ä»ä»¬ç§»å°å®ä¹å¤ãæ¥æ¾TRACE(...)ä¸ä»£ç ï¼å 为è¿äºä»£ç å¨RELEASEä¸ ä¹ä¸è¢«ç¼è¯ã 请认çæ£æ¥é£äºå¨RELEASEä¸éè¦ç代ç æ¯å¦å¹¶æ²¡æ被便å®ã
ãã
ãã2. åéçåå§åæ带æ¥çä¸åï¼å¨ä¸åçç³»ç»ï¼ææ¯å¨DEBUG/RELEASEçæ¬é´é½åå¨è¿æ ·çå·®å¼ï¼æ以请对åéè¿è¡åå§åã
ãã
ãã3. æ¯å¦å¨ç¼è¯æ¶å·²ç»æäºè¦å?请å°è¦å级å«è®¾ç½®ä¸º3æ4,ç¶åä¿è¯å¨ç¼è¯æ¶æ²¡æè¦ååºç°.
ãã
ããVII. å°Project Settings" ä¸ "C++/C " 项ç®ä¸ä¼åé项æ¹ä¸ºDisbaleï¼Debugï¼ãç¼è¯å¨çä¼åå¯è½å¯¼è´è®¸å¤ææ³ä¸å°çé误
ãã
ãã1. æ¤å¤å¯¹RELEASEçæ¬ç软件ä¹å¯ä»¥è¿è¡è°è¯ï¼è¯·åå¦ä¸æ¹å¨ï¼
ãã
ããå¨"Project Settings" ä¸ "C++/C " 项ç®ä¸è®¾ç½® "category" 为 "General" 并ä¸å°"Debug Info"设置为 "Program Database"ã
ãã
ããå¨"Link"项ç®ä¸éä¸"Generate Debug Info"æ£æ¥æ¡ã
ãã
ãã"Rebuild All"
ãã
ããå¦æ¤åæ³ä¼äº§ççä¸äºéå¶ï¼
ãã
ããæ æ³è·å¾å¨MFC DLLä¸çåéçå¼ã
ãã
ããå¿ é¡»å¯¹è¯¥è½¯ä»¶æ使ç¨çææDLLå·¥ç¨é½è¿è¡æ¹å¨ã
深入理解 Hadoop (七)YARN资源管理和调度详解
Hadoop最初为批处理设计,其资源管理与调度仅支持FIFO机制。然而,随着Hadoop的普及与用户量的增加,单个集群内的应用程序类型与数量激增,FIFO调度机制难以高效利用资源,海龟 mc源码也无法满足不同应用的服务质量需求,故需设计适用于多用户的资源调度系统。
YARN采用双层资源调度模型:ResourceManager中的资源调度器分配资源给ApplicationMaster,由YARN决定;ApplicationMaster再将资源分配给内部任务Task,用户自定。YARN作为统一调度系统,网游加速器 源码满足调度规范的分布式应用皆可在其中运行,调度规范包括定义ApplicationMaster向RM申请资源,AM自行完成Container至Task分配。YARN采用拉模型实现异步资源分配,RM分配资源后暂存缓冲区,等待AM通过心跳获取。
Hadoop-2.x版本中YARN提供三种资源调度器,分别为...
YARN的队列管理机制包括用户权限管理与系统资源管理两部分。CapacityScheduler的核心特点包括...
YARN的更多理解请参考官方文档:...
在分布式资源调度系统中,资源分配保证机制常见有...
YARN采用增量资源分配,避免浪费但不会出现资源饿死现象。逆战易语言源码YARN默认资源分配算法为DefaultResourceCalculator,专注于内存调度。DRF算法将最大最小公平算法应用于主资源上,解决多维资源调度问题。实例分析中,系统中有9个CPU和GB RAM,两个用户分别运行两种任务,所需资源分别为...
资源抢占模型允许每个队列设定最小与最大资源量,以确保资源紧缺与极端情况下的需求。资源调度器在负载轻队列空闲时会暂时分配资源给负载重队列,仅在队列突然收到新提交应用程序时,微信抢红包 源码调度器将资源归还给该队列,避免长时间等待。
YARN最初采用平级队列资源管理,新版本改用层级队列管理,优点包括...
CapacityScheduler配置文件capacity-scheduler.xml包含资源最低保证、使用上限与用户资源限制等参数。管理员修改配置文件后需运行"yarn rmadmin -refreshQueues"。
ResourceScheduler作为ResourceManager中的关键组件,负责资源管理和调度,采用可插拔策略设计。初始化、手机聊天室源码接收应用和资源调度等关键功能实现,RM收到NodeManager心跳信息后,向CapacityScheduler发送事件,调度器执行一系列操作。
CapacityScheduler源码解读涉及树型结构与深度优先遍历算法,以保证队列优先级。其核心方法包括...
在资源分配逻辑中,用户提交应用后,AM申请资源,资源表示为Container,包含优先级、资源量、容器数目等信息。YARN采用三级资源分配策略,按队列、应用与容器顺序分配空闲资源。
对比FairScheduler,二者均以队列为单位划分资源,支持资源最低保证、上限与用户限制。最大最小公平算法用于资源分配,确保资源公平性。
最大最小公平算法分配示意图展示了资源分配过程与公平性保证。
djangoå端ç¨ä»ä¹åï¼
导读ï¼ä»å¤©é¦å¸CTOç¬è®°æ¥ç»åä½åäº«å ³äºdjangoå端ç¨ä»ä¹åçç¸å ³å 容ï¼å¦æè½ç¢°å·§è§£å³ä½ ç°å¨é¢ä¸´çé®é¢ï¼å«å¿äºå ³æ³¨æ¬ç«ï¼ç°å¨å¼å§å§ï¼ç¨Djangoå¼åwebå端,ççæ¯SpringBootè¦çäºå?ç¨Djangoå¼åwebå端并ä¸æ¯SpringBootè¦çäºã
spring好å¤å°±æ¯å½ä½ éè¦æ¶æ¯éåï¼æè æå¡æ³¨ååç°ï¼é ç½®ä¸å¿çççæ¶åé ç½®æ¯è¾æ¹ä¾¿ï¼å¦æä¸èèå¾®æå¡ï¼springbootä¹åªæ¯æ¯javaä¸çéé¢å ¶ä»çæ¹ä¾¿èå·²ã
èpythonä¸çæ³è¦éæä¸è¿°å 个åè½å¹¶ä¸è¾¾å°ä¸å®çç产级å«æ¯è¦æ¯spring麻ç¦çå¤ã
ä»æ§è½ä¸è®²ï¼çè¿ä¸äºæµè¯ï¼springå 为æ¿ç¨æ·åäºå¾å¤ç±»åæ¨æçäºæ ï¼çº¯æ§è½å¨javaä¸çä¹å°±æ¯ç¨çã
pythonå¦æä¸æ¯ä¸å¼å§å°±ä¸pypyï¼é£å°±æ¯ä¸ä¸ªjitçæ§è½å·®è·ï¼å¤§æ¦å°±æ¯ååå§ã
æå讨论ä¸é对软件å¼åã
javaå®å°±æ¯æ¶è代ç ï¼å®æåæ ·åè½è°éè¦åç代ç æ´å¤å°±æ´èæ¶ï¼æ¾ç¶goæ¯è¦å°äºä¸å°ä»£ç ã
èæçç解ä¸ï¼pythonéè¦1å®æçä¸è¥¿goå¾1.5以ä¸javaå°2以ä¸ï¼æ¾ç¶èè´¹çæ¶é´ä¹å°±æ¯åºäºè¿ä¸ªæ¯ä¾ã
对äºä¸ªäººå¿æºè´æ èå´å ç项ç®ï¼ææ¯æ²¡ä»ä¹çç±éæ©javaçï¼å 为代ç è¡æ°å°±æ¯æ¶é´ï¼æ¶é´å°±æ¯éé±ã
è对äºä¸åæµè¯è®¾è®¡ç¨çç项ç®ï¼è¿é javaä¹èä¸ä½ãæ以å§ï¼å¦æä¸æ¯ä¸ªå¤§é¡¹ç®ï¼æè§å¹¶ä¸å¤ªéè¦javaåºé©¬ä»¥åï¼é¤éæ¯æäºå¿ ç¶è¦éæ©çåå ã
è³äºå¤§é¡¹ç®ï¼è¿äºæè¿æ²¡ç没å¥æ¦å¿µï¼å¤§è´ç»è®¡äºä¸ä»¥å项ç®çææ代ç ï¼ä¸ç®æ³¨é第ä¸æ¹åºï¼ç°å¨å ¬å¸ä¸¤ä¸å¹´ç项ç®å¤ç«¯ååå°å èµ·æ¥ä¹å°±æ¯æ¥ä¸è¡ãè¿ä¹å°±ç®æ¯æ碰å°ç°å¨è§æ¨¡æ大çäºã
å©ä¸çæ¾ç»æ个åä¸é¡¹ç®åäºä¸ä¸ªæå·®ä¸å¤ååå°ä¹å°±æ¯ä¸ä¸å¤è¡ã
æå说ç»è®ºå§ï¼é¡¹ç®å°ï¼å¨æçï¼æå ¥å°ï¼è¿æ¯å°±djangoå§ã
djangoæ¡æ¶ä»ç»
Djangoæ¯é«æ°´åçPythonç¼ç¨è¯è¨é©±å¨çä¸ä¸ªå¼æºæ¨¡åï¼è§å¾ï¼æ§å¶å¨é£æ ¼çWebåºç¨ç¨åºæ¡æ¶ï¼å®èµ·æºäºå¼æºç¤¾åºã使ç¨è¿ç§æ¶æï¼ç¨åºåå¯ä»¥æ¹ä¾¿ãå¿«æ·å°å建é«åè´¨ãæç»´æ¤ãæ°æ®åºé©±å¨çåºç¨ç¨åºãè¿ä¹æ£æ¯OpenStackçHorizonç»ä»¶éç¨è¿ç§æ¶æè¿è¡è®¾è®¡ç主è¦åå ã
å¦å¤ï¼å¨Djangoæ¡æ¶ä¸ï¼è¿å å«è®¸å¤åè½å¼ºå¤§ç第ä¸æ¹æ件ï¼ä½¿å¾Djangoå ·æè¾å¼ºçå¯æ©å±æ§ãDjango项ç®æºèªä¸ä¸ªå¨çº¿æ°é»Webç«ç¹ï¼äºå¹´ä»¥å¼æºçå½¢å¼è¢«éæ¾åºæ¥ã
Djangoæ¡æ¶çæ ¸å¿ç»ä»¶æï¼
1ãç¨äºå建模åçå¯¹è±¡å ³ç³»æ å°ã
2ã为æç»ç¨æ·è®¾è®¡è¾å¥½ç管ççé¢ã
3ãURL设计ã
4ã设计è å好ç模æ¿è¯è¨ã
5ãç¼åç³»ç»ã
Django(åé³ï¼[`dÉ¡?])æ¯ç¨pythonè¯è¨åçå¼æºwebå¼åæ¡æ¶(opensourcewebframework)ï¼å®é¼å±å¿«éå¼å,并éµå¾ªMVC设计ãDjangoéµå®BSDçæï¼å次åå¸äºå¹´7æ,并äºå¹´9æåå¸äºç¬¬ä¸ä¸ªæ£å¼çæ¬1.0ã
Djangoæ ¹æ®æ¯å©æ¶ççµå£«é³ä¹å®¶DjangoReinhardtå½åï¼ä»æ¯ä¸ä¸ªåæ®èµäººï¼ä¸»è¦ä»¥æ¼å¥åå®ä¸ºä¸»ï¼è¿æ¼å¥è¿å°æç´çã
ç±äºDjangoå¨è¿å¹´æ¥çè¿ éåå±ï¼åºç¨è¶æ¥è¶å¹¿æ³ï¼è¢«èåITå¼åæå¿SDTimesè¯é为SDTimesï¼ä½åâAPIãåºåæ¡æ¶âå类第6ä½ï¼è¢«è®¤ä¸ºæ¯è¯¥é¢åç佼佼è ã
django+vueåå端å离项ç®é¨ç½²
å端ç¨çdrfï¼ä½¿ç¨çæ¯uwsgi+nginx
è¿å ¥æå¡å¨é¡¹ç®æ件ç®å½ä¸ï¼æçdjango项ç®æ¾å¨äºâ/usr/myProjects/âç®å½ä¸äºãå¨manage.pyå级ç®å½ä¸å建uwsgi.iniæ件ï¼é ç½®å¦ä¸ï¼
æµè¯ææå½ä»¤ï¼
å¦æ访é®ï¼xxx.xxx.xxx.xx:æåï¼åuwsgi.inié ç½®æå
æçnginx.confæå¨ä½ç½®æ¯â/etc/nginx/nginx.confâ
é ç½®æ件å¦ä¸ï¼
1ã第ä¸è¡
主è¦å°±æ¯ç»nginxå æéï¼vueé¨ç½²å使ç¨historyè·¯ç±æ¶ä¼å»æå°ååé¢çâ#âå·ï¼æå é¨ç½²åä¸å æéä¼æbugã
2ãå¦é ç½®æ示ï¼æ两个Serverï¼åå«é¨ç½²äºå端æå¡ï¼åå端æå¡ï¼å¼å¾æ³¨æçæ¯ä¸¤ä¸ªServerç¨çæ¯åä¸ä¸ªæå¡å¨ï¼çå¬ç端å£ä¸åã
3ãvueé¨ç½²éè¦æ³¨æçæ¯åå代çå°åï¼
以ååé¢ç端å£é®é¢
4ãå端çServeréè¦æ³¨ælocationä¸çuwsgi_passåé¢ç端å£å·è¦åuwsgi.iniä¸é çç¸åï¼å¦åçå¬ä¸å°
5ãå端跨åé®é¢ãå¦æéå°è·¨åéè¦èªå·±ç½ä¸æ¾é ç½®ï¼æç没éå°ï¼å¯è½æ¯å 为æå¨djangoçsettingsä¸é ç½®äºè·¨åã
6ãdjango-suitåå°ç®¡çæ ·å¼å´©äºï¼éè¦æ¹ï¼ä½æ¯apiå¯ä»¥æ£å¸¸è®¿é®ï¼è¿ä¸ªæ空å说
7ãæå¼å§åå°çå¬çæ¯ç«¯å£ï¼vueå端çå¬çæ¯ç«¯å£ï¼è¿æ ·å端æ¾ç¤ºå¥½çãç¶èé®é¢åºç°äºï¼è½ç¶åå°apiå¯ä»¥æ£å¸¸è®¿é®ï¼vueçæ¬å°å¼åç¯å¢ä¹è½æ£å¸¸è¿è¡ä¸æåãå¾çèµæºåæ¾ç¤ºæ£å¸¸ï¼ä½æ¯å端vueæå 线ä¸é¨ç½²åï¼æåä¿¡æ¯æ¾ç¤ºæ£å¸¸ï¼å¾çä¿¡æ¯ç¼ºå¤±ç«¯å£ï¼å¯¼è´æ¾ç¤ºä¸åºæ¥ã为å¾æ¹ä¾¿æéæ©äºå端çå¬ç«¯å£ï¼å端çå¬ï¼é¨ç½²åæ¾ç¤ºæ£å¸¸ãåå ä¸å¤ªæ¸ æ¥///////æ空å说å§ã
8ãä¸è¦é®æ为å¥é½åå端å离äºè¿é¨ç½²å°ä¸ä¸ªæå¡å¨ä¸ï¼ç©·ï¼èä¸åªæ¯æµè¯ï¼æ²¡å¿ è¦
9ãæ¤æä» éåå ¥é¨
å ³äºdjangoåå°adminï¼suitï¼ç¼ºå¤±çä¿®æ¹ï¼åèï¼djangoä¸æç½ï¼ï¼
å¨ç¯å¢ä¸è¿å ¥é¡¹ç®ç®å½ï¼éè¦æ¶écssæ ·å¼ï¼å¨ç»ç«¯è¾å ¥å½ä»¤ï¼
æ¥ä¸æ¥ä½ å°±ååç°staticæ件ä¸å å«äºcssæ件ï¼æ¤æ¶åæå¼ç½ç«ï¼æ ·å¼æ¾ç¤ºæ£å¸¸
uWSGIéè¿xxx.iniå¯å¨åä¼å¨ç¸åç®å½ä¸çæä¸ä¸ªxxx.pidçæ件ï¼éé¢åªæä¸è¡å 容æ¯uWSGIç主è¿ç¨çè¿ç¨å·ã
å ³äºuwsgi,è¿å ¥åå±ç®å½ä¸
æè®
è·åä¸å°ç¯å¢ï¼é£å°±æå®ç¯å¢
å¦å¤ï¼è®°å¾éå¯uwsgiï¼éå¯Nginxï¼å®å¨ä¸è¡å°±å æçå¬ç端å£killæåéå¯
æ´åå 端å£ï¼fuser-k/tcp
netstat-aptnå½ä»¤è¡ï¼æ¥çææå¼å¯ç端å£å·
netstat-ntlp|grepæ¥çå ·ä½ç端å£æ¯å¦ä½¿ç¨
ps-ef|grepuwsgiæ¥çæ¯å¦æuwsgi端å£åå¨
Djangoæ¯ä¸æ¯ä¸ç¨ååå°çï¼ç¨èªå¸¦çadmin管çæ°æ®åºå°±è¡äºæéå离æ¯è¾éº»ç¦ï¼é»è®¤ä¸åå¨åªè¯»ç®¡çåå¸å·ãèªå·±å®ç°åªè¯»å¸å·æ¯è¾tricky
æç´¢åè½ä¸å¼ºå¤§ï¼èªå·±å®ç°é«çº§æç´¢å¾tricky
人家ç模æ¿å°±æ²¡èèè¿è®©ä½ éç¨ï¼çæ¬å级åä½ èªå®ä¹è¿ç模æ¿å¯è½éè¦æåæ´mergeå°æ°ç模æ¿é
å端ç¨äºDjangoè¿éè¦åç¬çå端æ¡æ¶åå ³äºå端ç¨åºååå端ç¨ä»¥ä¸æ¡æ¶ï¼
1ãç¨Dreamweaveræè ç½é¡µæ¥çæºä»£ç ã
2ãbootstrap对ååºå¼çæ¯æ以åè¯å¥½çä½éª
3ãmetronic/adminLTEè¿ä¸ªæ¡æ¶ç代ç æ´å¤çæ¯å±äºç²ååï¼å°åç§ä¸åç第ä¸æ¹åºçå端代ç ç²åèµ·æ¥ã
4ãextjsç³»åãè¿ä¸ªæ¯å端é¢åçåºç¶å¤§ç©å°è£ 度å¾é«ï¼å ·æèªç§°ä½ç³»çå ç´ éæ©å¼æåæµè§å¨å ¼å®¹æ¹æ¡ï¼JSåæ³ä¹æèªå·±çæ¹å¼ï¼ç»ä»¶å¾å¤ã
5ãvaadin/GWTæ¯ä½¿ç¨åå°è¯è¨åå端ãä¸è¿ä¸æ¯å¾å»ºè®®ä½¿ç¨è¿ç§æ¹æ¡ã
ç¨djangoå端å¼åè¦å¦ä»ä¹ç¬¬ä¸é¶æ®µï¼Pythonè¯è¨åºç¡
主è¦å¦ä¹ Pythonæåºç¡ç¥è¯ï¼å¦Python3ãæ°æ®ç±»åãå符串ãå½æ°ãç±»ãæ件æä½çãé¶æ®µè¯¾ç¨ç»æåï¼å¦åéè¦å®æPygameå®æé£æºå¤§æãç项ç®ã
第äºé¶æ®µï¼Pythonè¯è¨é«çº§
主è¦å¦ä¹ Pythonåºãæ£å表达å¼ãè¿ç¨çº¿ç¨ãç¬è«ãéå以åMySQLæ°æ®åºã
第ä¸é¶æ®µï¼Pythonwebå¼å
主è¦å¦ä¹ HTMLãCSSãJavaScriptãjQueryçå端ç¥è¯ï¼ææ¡pythonä¸å¤§å端æ¡æ¶(DjangoãFlask以åTornado)ãéè¦å®æç½é¡µçé¢è®¾è®¡å®æ;è½ç¬ç«å¼åç½ç«ã
第åé¶æ®µï¼Linuxåºç¡
主è¦å¦ä¹ Linuxç¸å ³çåç§å½ä»¤ï¼å¦æ件å¤çå½ä»¤ãå缩解åå½ä»¤ãæé管ç以åLinuxShellå¼åçã
第äºé¶æ®µï¼Linuxè¿ç»´èªå¨åå¼å
主è¦å¦ä¹ Pythonå¼åLinuxè¿ç»´ãLinuxè¿ç»´æ¥è¦å·¥å ·å¼åãLinuxè¿ç»´æ¥è¦å®å ¨å®¡è®¡å¼åãLinuxä¸å¡è´¨éæ¥è¡¨å·¥å ·å¼åãKaliå®å ¨æ£æµå·¥å ·æ£æµä»¥åKaliå¯ç ç ´è§£å®æã
第å é¶æ®µï¼Pythonç¬è«
主è¦å¦ä¹ pythonç¬è«ææ¯ï¼ææ¡å¤çº¿ç¨ç¬è«ææ¯ï¼åå¸å¼ç¬è«ææ¯ã
第ä¸é¶æ®µï¼Pythonæ°æ®åæå大æ°æ®
主è¦å¦ä¹ numpyæ°æ®å¤çãpandasæ°æ®åæãmatplotlibæ°æ®å¯è§åãscipyæ°æ®ç»è®¡åæ以åpythonéèæ°æ®åæ;HadoopHDFSãpythonHadoopMapReduceãpythonSparkcoreãpythonSparkSQL以åpythonSparkMLlibã
ç¬¬å «é¶æ®µï¼Pythonæºå¨å¦ä¹
主è¦å¦ä¹ KNNç®æ³ã线æ§åå½ãé»è¾æ¯èåå½ç®æ³ãå³çæ ç®æ³ãæ´ç´ è´å¶æ¯ç®æ³ãæ¯æåéæºä»¥åèç±»k-meansç®æ³ã
ç»è¯ï¼ä»¥ä¸å°±æ¯é¦å¸CTOç¬è®°ä¸ºå¤§å®¶æ´ççå ³äºdjangoå端ç¨ä»ä¹åçå ¨é¨å 容äºï¼æè°¢æ¨è±æ¶é´é 读æ¬ç«å 容ï¼å¸æ对æ¨ææ帮å©ï¼æ´å¤å ³äºdjangoå端ç¨ä»ä¹åçç¸å ³å 容å«å¿äºå¨æ¬ç«è¿è¡æ¥æ¾åã
djangoè·drfåªä¸ªå¥½(djangoådrf)
导读ï¼ä»å¤©é¦å¸CTOç¬è®°æ¥ç»åä½åäº«å ³äºdjangoè·drfåªä¸ªå¥½çç¸å ³å 容ï¼å¦æè½ç¢°å·§è§£å³ä½ ç°å¨é¢ä¸´çé®é¢ï¼å«å¿äºå ³æ³¨æ¬ç«ï¼ç°å¨å¼å§å§ï¼django好æ¾å·¥ä½ä¹?django好æ¾å·¥ä½ã
ådjangoè¡ä¸çä¼ç¹ï¼ä¸æ¯å·¥ä½å²ä½å¤ï¼ç¸å¯¹å¥½æ¾å·¥ä½ï¼äºæ¯å¦æå¨æçï¼åªéè¦æpythonåºç¡ç¥è¯åéï¼Djangoæ¡æ¶åflaskæ¡æ¶åéï¼åè¡¥å ä¸äºhtmlç¥è¯ï¼ç¶ååä¸äºé¡¹ç®ä¾¿å¯ä»¥æç®åäºã
Pythonæåªäºå¥½çWebæ¡æ¶
æµ è°äºå¤§PythonWebæ¡æ¶
说å°WebFrameworkï¼Rubyçä¸çRailsä¸ç»æ±æ¹ï¼èPythonåæ¯ä¸ä¸ªç¾è±é½æ¾çä¸çï¼åç§micro-frameworkãframeworkä¸å¯èæ°ã
è½ç¶å¦ä¸å¤§èæ¬è¯è¨PHPä¹æä¸å°æ¡æ¶ï¼ä½è¿æ²¡æPythonè¿ä¹å¤¸å¼ ï¼ä¹æ£æ¯å 为PythonWebFrameworkï¼PythonWebå¼åæ¡æ¶ï¼ä»¥ä¸ç®ç§°Pythonæ¡æ¶ï¼å¤ªå¤ï¼æ以å¨Python社åºæ»æå ³äºPythonæ¡æ¶å°ä¼å°å£çè¯é¢ï¼è®¨è®ºçæ¶é´è·¨åº¦çè³é¿è¾¾3-5å¹´ã
Pythonè¿ä¹å¤æ¡æ¶ï¼è½æ¨ä¸ªç©ä¸ªéç人ä¸å¤ï¼å¦ç½ç说æä¹åªç¨è¿å ¶ä¸çä¸ä¸ªå¼åè¿é¡¹ç®ï¼å¦å¤ä¸äºç¨å¾®æ¥è§¦è¿ï¼æ以è¿éåªè½æµ è°ä¸ä¸ã
Djangoï¼Pythonæ¡æ¶è½ç¶è¯´æ¯ç¾è±é½æ¾ï¼ä½ä»ç¶æé£ä¹ä¸å®¶æ¯æ大çï¼å®å°±æ¯Djangoãè¦è¯´Djangoæ¯Pythonæ¡æ¶éæ好çï¼æ人åæä¹æ人åå³å对ï¼ä½è¯´Djangoçææ¡£æå®åãå¸åºå æçæé«ãæèèä½æå¤ä¼°è®¡å¤§å®¶é½æ²¡ä»ä¹æè§ãDjango为人æ称éçå°æ¹ä¸»è¦æï¼?å®ç¾çææ¡£ï¼Djangoçæåï¼æè§å¾å¾å¤§ä¸é¨ååå è¦å½åäºDjangoè¿ä¹å®ç¾çå®æ¹ææ¡£ï¼å æ¬Djangobookï¼ã
å ¨å¥ç解å³æ¹æ¡ï¼Django象Railsä¸æ ·ï¼æä¾å ¨å¥ç解å³æ¹æ¡ï¼full-stackframework+batteriesincludedï¼ï¼åºæ¬è¦ä»ä¹æä»ä¹ï¼æ¯å¦ï¼cacheãsessionãfeedãormãgeoãauthï¼ï¼èä¸å ¨é¨Djangoèªå·±é ï¼å¼åç½ç«åºæçå·¥å ·Djangoåºæ¬é½ç»ä½ å好äºï¼å æ¤å¼åæçæ¯ä¸ç¨è¯´çï¼åºäºé®é¢ä¹ç®å¥½æ¾ï¼ä¸å¨ä½ ç代ç éå°±å¨Djangoçæºç éã
强大çURLè·¯ç±é ç½®ï¼Djangoè®©ä½ å¯ä»¥è®¾è®¡åºé常ä¼é çURLï¼å¨Djangoéä½ åºæ¬å¯ä»¥è·ä¸éçGETåæ°è¯´ææã?èªå©ç®¡çåå°ï¼admininterfaceæ¯Djangoéæ¯è¾å¸å¼ç¼ççä¸é¡¹contribï¼è®©ä½ å ä¹ä¸ç¨åä¸è¡ä»£ç å°±æ¥æä¸ä¸ªå®æ´çåå°ç®¡ççé¢ã
èDjangoç缺ç¹ä¸»è¦æºèªDjangoåæèªå·±é ææçè½®åï¼æ´ä¸ªç³»ç»ç¸å¯¹å°éï¼Djangoæ为人è¯ç çå°æ¹æï¼?ç³»ç»ç´§è¦åï¼å¦æä½ è§å¾Djangoå ç½®çæ项åè½ä¸æ¯å¾å¥½ï¼æ³ç¨å欢ç第ä¸æ¹åºæ¥ä»£æ¿æ¯å¾é¾çï¼æ¯å¦ä¸é¢å°è¦è¯´çORMãTemplateã
è¦å¨Djangoéç¨SQLAlchemyæMakoå ä¹æ¯ä¸å¯è½ï¼å³ä½¿æäºä¸äºè¡¥ä¸ç¨ä¸äºä¹ä¼è®©ä½ è§å¾é常é常å«æã?Djangoèªå¸¦çORMè¿ä¸å¦SQLAlchemy强大ï¼é¤äºå¨Djangoè¿ä¸äº©ä¸åå°ï¼SQLAlchemyæ¯Pythonä¸çéäºå®ä¸çORMæ åï¼å ¶å®æ¡æ¶é½æ¯æSQLAlchemyäºï¼å¯ç¬Djangoä»ç¶åæèªå·±çé£ä¸å¥ãDjangoçå¼å人å对SQLAlchemyçæ¯æä¹æ¯æè¿è®¨è®ºåå°è¯çï¼ä¸è¿æç»è¿æ¯æ¾å¼äºï¼ä¼°è®¡æ¯ä»£ä»·å¤ªé«ä¸è·Djangoå ¶å®ç模åå¾é¾åå°ä¸åã?Templateåè½æ¯è¾å¼±ï¼ä¸è½æå ¥Python代ç ï¼è¦åå¤æä¸ç¹çé»è¾éè¦å¦å¤ç¨Pythonå®ç°TagæFilterãURLé ç½®è½ç¶å¼ºå¤§ï¼ä½å ¨é¨è¦æåï¼è¿ä¸ç¹è·RailsçConventionoverconfigurationçç念å®å ¨ç¸å·¦ï¼é«æååè¯Djangoç人é åºæ¥çURLä¼æå¾å¤§å·®å¼ã
è®©äººçº ç»çauth模åï¼Djangoçauthè·å ¶å®æ¨¡åç»åç´§å¯ï¼åè½ä¹æºå¼ºçï¼å°±æ¯åçæç¹è¿äºï¼ç¨æ·çæ°æ®åºschemaé½ç»ä½ å®å¥½äºï¼è¿æ ·é®é¢å°±æ¥äºï¼æ¯å¦å¾å¤ç½ç«è¦æ±emailå°åå¯ä¸ï¼å¯schemaéè¿ä¸ªå段çå¼ä¸æ¯å¯ä¸çï¼çº ç»æ¯å¿ é¡»çäºã
Pythonæ件åé ç½®æ件ï¼èä¸æ¯æ´å¸¸è§çiniãxmlæyamlçå½¢å¼ãè¿æ¬èº«ä¸æ¯ä»ä¹é®é¢ï¼å¯æ¯å 为ç论ä¸æ¥è¯´settingsçå¼æ¯è½å¤å¨æçæ¹åçï¼è½ç¶å¤§å®¶ä¸ä¼è¿ä¹å¹²ï¼ï¼ä½è¿ä¸æ¯æä½³å®è·µçä½ç°ã?æ»çæ¥è¯´ï¼Django大å 大æ½ï¼ç¨å®æ¥å¿«éå¼åä¸äºWebè¿ç¨æ¯å¾ä¸éçãå¦æä½ é¡ºçDjangoç设计å²å¦æ¥ï¼ä½ ä¼è§å¾Djangoå¾å¥½ç¨ï¼è¶ç¨è¶é¡ºæï¼ç¸åï¼ä½ å¦æä¸è½èå ¥ææ¥åDjangoç设计å²å¦ï¼ä½ ç¨Djangoä¸å®ä¼å¾çè¦ï¼è¶æ©æ¾å¼ç好ã
æ以说å¨æäºäººç¼éDjangoæ å¼äºä»ä¸¹ï¼ä½å¯¹æä¸äºäººæ¥è¯´å®åæ¯æ¯è¯ä¸å§æ¯ã?PylonsTurboGearsrepoze.bfg?é¤äºDjangoå¦ä¸ä¸ªå¤§å¤´å°±æ¯Pylonsäºï¼å 为TurboGears2.xæ¯åºäºPylonsæ¥åçï¼èrepoze.bfgä¹å·²ç»å¹¶å ¥Pylonsprojectéè¿ä¸ªå¤§ç项ç®éï¼åé¢ä¸ååç¬è®¨è®ºTurboGearsårepoze.bfgäºã
PylonsåDjangoç设计ç念å®å ¨ä¸åï¼Pylonsæ¬èº«åªæ两åè¡å·¦å³çPython代ç ï¼ä¸è¿å®è¿é带æä¸äºå ä¹å°±æ¯Pylons御ç¨ç第ä¸æ¹æ¨¡åãPylonsåªæä¾ä¸ä¸ªæ¶ååå¯éæ¹æ¡ï¼ä½ å¯ä»¥æ ¹æ®èªå·±çå好èªç±çéæ©TemplateãORMãformãauthçç»ä»¶ï¼ç³»ç»é«åº¦å¯å®å¶ãæ们常说Pythonæ¯ä¸ä¸ªè¶æ°´è¯è¨(gluelanguage)ï¼é£ä¹æ们å®å ¨å¯ä»¥è¯´Pylonså°±æ¯ä¸ä¸ªç¨è¶æ°´è¯è¨è®¾è®¡çè¶æ°´æ¡æ¶ã?éæ©Pylonså¤æ¯éæ©äºå®çèªç±ï¼éæ©äºèªç±çåæ¶ä¹é¢ç¤ºçä½ éæ©äºå©æ¢¦ï¼?å¦ä¹ å©æ¢¦ï¼Pylonsä¾èµäºè®¸å¤ç¬¬ä¸æ¹åºï¼å®ä»¬å¹¶ä¸æ¯Pylonsé ï¼ä½ å¦Pylonsçåæ¶è¿å¾å¦è¿äºåºæä¹ä½¿ç¨ï¼å ³é®æäºæ¶åä½ é½ä¸ç¥éä½ è¦å¦ä»ä¹ã
Pylonsçå¦ä¹ æ²çº¿ç¸å¯¹æ¯Djangoè¦é«çå¤ï¼èä¹åPylonsçå®æ¹ææ¡£ä¹ä¸ç´æ¯äººæ¹è¯ç对象ï¼å¥½å¨åæ¥åºäºTheDefinitiveGuidetoPylonsè¿æ¬ä¹¦ï¼è¿ä¸å±é¢æææ¹è§ãå 为è¿ä¸ªåå ï¼Pylonsä¸åº¦è¢«èªä¸ºåªéåé«æ使ç¨çPythonæ¡æ¶ã?è°è¯å©æ¢¦ï¼å 为çµæ¶å°ç模åå¤ï¼ä¸æ¦æé误åçå°±æ¯è¾é¾å®ä½é®é¢å¤å¨åªéã
å¯è½æ¯ä½ åçç¨åºçéãä¹å¯è½æ¯Pylonsåºéäºãåææ¯SQLAlchemyåºéäºãæä¸å¥½æ¯formencodeæbugï¼åæ£å¾åä¹±äºãè¿ä¸ªåªæç¨çå¾çäºæè½è§£å³è¿ä¸ªé®é¢ã?å级å©æ¢¦ï¼å®è£ Pylons大大å°å°å ±è¦å®è£ è¿ä¸ªPython模åï¼åæåèªççæ¬å·ï¼è¦å级Pylonsççæ¬ï¼åªä¸ªæ¨¡ååºäºä¸å ¼å®¹çé®é¢é½æå¯è½ï¼å级åºæ¬ä¸å¾é¾å¾é¾ãè³ä»redditçPylonsè¿åçå¨å¤è£ç0.9.6ä¸ï¼SQLAlchemyä¹è¿æ¯0.5.3ççæ¬ï¼åºè¯¥è·è¿æ¡æå ³ç³»ã
æåå ³äºæ¡æ¶éæ©ç误åº?å¨æ¡æ¶çéæ©é®é¢ä¸ï¼è®¸å¤äººå¾å®¹æå°±é·å ¥äºä¸é¢ä¸¤ä¸ªè¯¯åºä¸èä¸èªç¥ï¼
1.åªä¸ªæ¡æ¶æ好ââä¸ä¸æ²¡ææ好çæ¡æ¶ï¼åªææéåä½ èªå·±ãæéåä½ çå¢éçæ¡æ¶ãç¼ç¨è¯è¨éæ©ä¹æ¯ä¸ä¸ªéçï¼ä½ çå¢éPythonæçå°±ç¨Python好äºï¼å¦ææçæçæ¯Rubyé£å°±ç¨Ruby好äºï¼ç¼ç¨è¯è¨ãæ¡æ¶é½åªæ¯å·¥å ·ï¼è½å¤ãå¿«ã好ãççå¹²å®æ´»å°±æ¯å¥½ä¸è¥¿ã2.è¿åå ³æ³¨æ§è½ââå ¶å®å¤§é¨å人æ¯æ²¡å¿ è¦å¤ªå ³å¿æ¡æ¶çæ§è½çï¼å ä¸ºä½ å¼åçç½ç«æ ¹æ¬å°±æ¯ä¸ªå°ç«ï¼è½ä¸1ä¸çIPçç½ç«å·²ç»ä¸å¤äºï¼ä¸ä¸çæ´æ¯å¾å°å¾å°ãå¨æ²¡æä¸å®ç访é®éåè°æ§è½å ¶å®æ¯æ²¡æå¤å¤§æä¹çï¼å ä¸ºä½ çCPUåå åä¸ç´å°±é²çå¢ãèä¸è¯è¨åæ¡æ¶ä¸è¬ä¹ä¸ä¼æ¯æ§è½ç¶é¢ï¼æ§è½é®é¢æ常åºç°å¨æ°æ®åºè®¿é®åæ件读åä¸ãPHPçZendFrameworkæ¯åºäºåçæ ¢ï¼ä½æ¯ZendFrameworkä¸æ ·æ大ç«ï¼å¦ï¼digg.comï¼å¸¸è¢«äººè¯´ææ§è½é®é¢çRubyåRailsï¼ä¸æ¯ç §æ ·å¯ä»¥å¼ååºtwitteråï¼åè ç°å¨ç硬件ã带宽ææ¬å ¶å®æ¯å¾ä½çï¼ç¹å«æäºäºè®¡ç®å¹³å°åï¼äººåææ¬ææ¯æè´µçï¼æ²¡æä¸ä¸çIPæ ¹æ¬å°±ä¸ç¨å¤ªå¨ææ§è½é®é¢ï¼æµéä¸å»äºè±ç¹é±ä¹°ç¹æå¡å¨ç©ºé´å¥½äºï¼ç®åå¿«éç解å³æ§è½é®é¢ã?注ï¼åé¢æç½åè´¨çæâQuoraæ¯ç¨Pylonså¼åçâè¿æ ·ç说æ³ä¸å®¢è§ï¼ç¹è¯´æä¸ä¸ï¼è¿éæ说çæ个ç½ç«Aæ¯ç¨Bå¼åçï¼åªæ¯æA主è¦æé¨åæ¯ç±Bå¼åçï¼å¤§å®¶å°±ä¸è¦åå»çº ç»Aè¿ç¨Cäºã
å ³äºpythonwebï¼å»ºè®®å¤å¦ä¹ ä¸ä¸å¤§ç¥çæ¡ä¾ãä»éé¢æåç²¾é«çä¸è¥¿å 以å¸æ¶ï¼Pythonå¦ä¹ æå请çä¸é¢ç代ç
learning?=?input('Do?you?want?to?learn?Python?now(Yes?or?No):')
a?=?str(learning)
if?a?==?'Yes':
print('QQ')
else:
print('Thanks!!')
Pythonä¸å¤§webæ¡æ¶åå«æ¯ä»ä¹åªä¸ªæ´å¥½ã导读ãç®åï¼Pythonæ¯è¾ç«çä¸å¤§webæ¡æ¶æDjangoãFlaskåTornadoï¼è¦è®ºè¿ä¸ä¸ªWebæ¡æ¶åªä¸ªæ´å¥½çè¯ï¼å»ºè®®ä¸ç¹ï¼Django帮æ们äºå æ建äºå¥½å¤ï¼ä¸æä¼å¿«ä¸äºï¼å¦ä¹ çè¯å¯ä»¥å ä»Djangoå¦èµ·ï¼ç¶ååå¦ä¹ FlaskåTornadoï¼ä¸é¢æ们就æ¥å ·ä½äºè§£ä¸ä¸Pythonä¸å¤§webæ¡æ¶ç详æ ã
1ãDjango
Djangoæ¯ä¸ä¸ªå¼æ¾æºä»£ç çWebåºç¨æ¡æ¶ï¼ç±Pythonåæãéç¨äºMTVçæ¡æ¶æ¨¡å¼ï¼å³æ¨¡åMï¼æ¨¡æ¿Tåè§å¾Vãå®æåæ¯è¢«å¼åæ¥ç¨äºç®¡çå³ä¼¦æ¯åºçéå¢æä¸çä¸äºä»¥æ°é»å 容为主çç½ç«çï¼å³æ¯CMS(å 容管çç³»ç»)软件ã
2ãFlask
Flaskæ¯ä¸ä¸ªä½¿ç¨Pythonç¼åçè½»é级Webåºç¨æ¡æ¶ãå ¶WSGIå·¥å ·ç®±éç¨Werkzeugï¼æ¨¡æ¿å¼æå使ç¨Jinja2
ãFlask使ç¨BSDææã
Flaskä¹è¢«ç§°ä¸ºâmicroframeworkâï¼å 为å®ä½¿ç¨ç®åçæ ¸å¿ï¼ç¨extension
å¢å å ¶ä»åè½ãFlask没æé»è®¤ä½¿ç¨çæ°æ®åºãçªä½éªè¯å·¥å ·ã
Flaskå¾è½»ï¼è±å¾å°çææ¬å°±è½å¤å¼åä¸ä¸ªç®åçç½ç«ãé常éååå¦è å¦ä¹ ãFlaskæ¡æ¶å¦ä¼ä»¥åï¼å¯ä»¥èèå¦ä¹ æ件ç使ç¨ãä¾å¦ä½¿ç¨WTForm+
Flask-WTFormæ¥éªè¯è¡¨åæ°æ®ï¼ç¨SQLAlchemy+Flask-SQLAlchemyæ¥å¯¹ä½ çæ°æ®åºè¿è¡æ§å¶ã
3ãTornado
Tornadoæ¯ä¸ç§Webæå¡å¨è½¯ä»¶çå¼æºçæ¬ãTornadoåç°å¨ç主æµWebæå¡å¨æ¡æ¶(å æ¬å¤§å¤æ°Python
çæ¡æ¶)æçææ¾çåºå«ï¼å®æ¯éé»å¡å¼æå¡å¨ï¼èä¸é度ç¸å½å¿«ã
å¾å©äºå ¶éé»å¡çæ¹å¼å对epollçè¿ç¨ï¼Tornadoæ¯ç§å¯ä»¥å¤çæ°ä»¥å计çè¿æ¥ï¼å æ¤Tornadoæ¯å®æ¶Webæå¡çä¸ä¸ª
çæ³æ¡æ¶ã
å ³äºPythonä¸å¤§webæ¡æ¶çç®åä»ç»ï¼å°±ç»å¤§å®¶å享å°è¿éäºï¼å½ç¶å¦ä¹ æ¯æ°¸æ æ¢å¢çï¼å¦ä¹ ä¸é¡¹æè½æ´æ¯åçç»èº«ï¼æ以ï¼åªè¦è¯åªåå¦ï¼ä»ä¹æ¶åå¼å§é½ä¸æï¼å¸æ大家æç´§æ¶é´è¿è¡å¦ä¹ å§ã
DjangoåFlaskæ¯è¾å°åºåªä¸ªæ¯è¾å¥½ç¨Flaskæ¯å°èç²¾çå¾®æ¡æ¶ï¼å®ä¸åDjangoé£æ ·å¤§èå ¨ï¼å¦æ使ç¨Flaskå¼åï¼å¼åè éè¦èªå·±å³å®ä½¿ç¨åªä¸ªæ°æ®åºORMã模åç³»ç»ãç¨æ·è®¤è¯ç³»ç»çï¼éè¦èªå·±ç»æã
ä¸éç¨Djangoå¼å对æ¯ï¼å¼åè å¨é¡¹ç®å¼å§çæ¶åå¯è½éè¦è±è´¹æ´å¤çæ¶é´å»äºè§£ãæéå个ç»ä»¶ï¼å æ¤Flaskå¼åççµæ´»åº¦æ´é«ï¼å¼åè å¯ä»¥æ ¹æ®èªå·±çéè¦å»éæ©åéçæ件ã
å½ç¶Flaskåå²ç¸å¯¹è¾çï¼ç¬¬ä¸æ¹APPèªç¶æ²¡æDjangoé£ä¹å ¨é¢ã
æä½³æ件ä¸ä¼ ç»ä»¶ââfilepondè¿ä¸ªç»ä»¶ä¸ºå端æä¾äºvueéé vue-filepondï¼ä¸ºå端æä¾äºDjangoéé django-drf-filepond.äºè ç¸äºé åï¼å¼ç®±å³ç¨ï¼è½å¤å®ç°æ件ä¸ä¼ ç个æ§åå®å¶ã主è¦å æ¬ä¸ä¸å 个æ¹é¢ï¼
å ¶å¸¸è§æä½æµç¨ä¸º
æ·»å æ件åï¼vue-filepondä¼èªå¨ä¼ ç»server.url.è¿éå端éè¦é åå®ç°è¿ä¸ªä¸´æ¶æ件çåå¨ï¼å¹¶ä¸è¿å临æ¶æ件çIDã
å¦æå端ç¨äºdjango-drf-filepondåºçè¯ï¼ä¸é¢è¿ä¸ªè¿ç¨å°±ä¸ç¨èªå·±å¨æåäºï¼åªéè¦é ç½®ä¸æ¡è·¯ç±path('fp/',include('django_drf_filepond.urls'))å³å¯ãåæ¶ï¼è¿æ¡è·¯ç±è½å¤è·å端é åï¼å®æ临æ¶æ件çä¸ä¼ ãéä¼ ãå é¤çåè½ã
常è§çåºæ¯æ¯ï¼ç¨æ·å°æ件è·è¡¨åçå ¶å®å段ä¸åæ交è³æå¡å¨ãå¨ç¹å»ç¡®è®¤åï¼filepondå·²ç»å®æäºä¸´æ¶æ件çä¸ä¼ ãæ以ï¼ç¹å»ç¡®è®¤åï¼æå¡å¨åªç¨å°ç¡¬çéç临æ¶æ件æä¹ åå³å¯ï¼ç¼©çäºçå¾ æ¶é´ï¼ç¨æ·ä½éªä¼æ´å¥½ã
pythonæ¾å·¥ä½æ¯å¦Django好è¿æ¯Flask好ï¼è¿ä¿©é½æºç®åçï¼Djangoåflaské½å¦ä¸ä¸æ¯è¾å¥½ï¼Pythonåºç¡ä¹å¾éè¦ãè¿ä¿©å¦å¥½äºï¼å·¥ä½ä¸æï¼èªèµè¿æ¯çå ·ä½æ åµã
ç»è¯ï¼ä»¥ä¸å°±æ¯é¦å¸CTOç¬è®°ä¸ºå¤§å®¶æ´ççå ³äºdjangoè·drfåªä¸ªå¥½çå ¨é¨å 容äºï¼æè°¢æ¨è±æ¶é´é 读æ¬ç«å 容ï¼å¸æ对æ¨ææ帮å©ï¼æ´å¤å ³äºdjangoè·drfåªä¸ªå¥½çç¸å ³å 容å«å¿äºå¨æ¬ç«è¿è¡æ¥æ¾åã
django是前端还是后端
django是前端还是后端
前端。
Django是一个开放源代码的Web应用框架,由Python写成。采用了MTV的框架模式,即模型M,视图V和模版T。它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的,即是CMS(内容管理系统)软件。并于年7月在BSD许可证下发布。这套框架是以比利时的吉普赛爵士吉他手Django Reinhardt来命名的。
django是前后端分离吗
不管使用什么编程语言进行web开发,都有两种开发模式,一种是前后端不分离,一种是前后端分离。前后端不分离开发模式耦合度高,适合纯网页开发,前后端分离的开发模式耦合度低,前端可以通过访问接口来对数据进行增删改查。因此,论开发方便程度来说,前后端不分离要更被开发者们广泛使用的一种。django框架中有一个Django Rest Framework,简称DRF,是一款功能强大、基于Django框架开发的、用于构建符合RESTful风格Web API的、前后端分离的商业化开发工具包,是目前非常流行的商业级技术框架之一。
1.用manage .py runserver 启动Django服务器时就载入了在同一目录下的settings .py。该文件包含了项目中的配置信息,如前面讲的URLConf等,其中最重要的配置就是ROOT_URLCONF,它告诉Django哪个Python模块应该用作本站的URLConf,默认的是urls .py。
2.当访问url的时候,Django会根据ROOT_URLCONF的设置来装载URLConf。
3.然后按顺序逐个匹配URLConf里的URLpatterns。如果找到则会调用相关联的视图函数,并把HttpRequest对象作为第一个参数(通常是request)