ãã®ã¬ã€ãã§ã¯ãDjangoéçºè ã®äž»ãªééããèŠãŠãããããåé¿ããæ¹æ³ãåŠã³ãŸãã ãã®èšäºã¯çµéšè±å¯ãªéçºè ã«ãšã£ãŠã圹ç«ã€å ŽåããããŸãããªããªããéåžžã«å€§ããªèšå®ã®ãµããŒããéçãªãœãŒã¹ã®ååã®ç«¶åãªã©ã®ééããç¯ãããã§ãã
Djangoã¯ãäžè¬çãªéçºã®åé¡ã®è§£æ±ºã«åœ¹ç«ã€ç¡æã®ãªãŒãã³ãœãŒã¹ããªãŒãã³ãœãŒã¹ã®Pythonãã¬ãŒã ã¯ãŒã¯ã§ãã ããã«ãããæè»ã§æ§é åãããã¢ããªã±ãŒã·ã§ã³ãäœæã§ããŸãã Djangoã«ã¯ãããã«äœ¿çšã§ããå€ãã®ææ°æ©èœãæ¢ã«ãããŸãã ããšãã°ãç§ã«ãšã£ãŠã管çããŒã«ããªããžã§ã¯ããªã¬ãŒã·ã§ãã«ãããã³ã°ïŒORMïŒããŒã«ãã«ãŒãã£ã³ã°ããã³ãã¬ãŒããªã©ã®æ©èœã¯ãéçºããŒã«ãéžæããéã®æåã®åè£ã«ãªããŸãã ã¢ããªã±ãŒã·ã§ã³ã®äœæã«ã¯å€ãã®åŽåãå¿ èŠã§ãããä»ã®éçºè ãšåæ§ã«ç§ã®ä»äºã楜ããã§ãæ¥åžžæ¥åã«ã§ããã ãæéããããããªãã Djangoã¯ãã¢ããªã±ãŒã·ã§ã³ã®æè»æ§ãç ç²ã«ããããšãªãããã®ç¹ã§éåžžã«åœ¹ç«ã¡ãŸãã
Djangoã®ãã©ãŒæ©èœã¯ãã¢ãã«ããã³ç®¡çè ã¢ãã«ã®ã¹ããŒãã«åºã¥ããŠèªåçã«ïŒèªåçã«çæãããïŒåŒ·åãªæ§æå¯èœãªç®¡çã€ã³ã¿ãŒãã§ã€ã¹ã§ãã ããªãã¯éè¡åž«ã®ããã«æããŸãã ãŠãŒã¶ãŒã¯ã管çã€ã³ã¿ãŒãã§ã€ã¹ã䜿çšããŠãã¢ã¯ã»ã¹å¶åŸ¡ãªã¹ãïŒACLïŒãè¡ã¬ãã«ã®ã¢ã¯ã»ã¹èš±å¯ãšã¢ã¯ã·ã§ã³ããã£ã«ã¿ãŒã䞊ã¹æ¿ãé åºïŒé åºïŒããŠã£ãžã§ããããã©ãŒã ãè¿œå ãªã©ãå€ãã®ãã®ãæ§æã§ããŸãã URLãã«ããŒãªã©ã ãã¹ãŠã®ã¢ããªã±ãŒã·ã§ã³ã«ã¯ç®¡çããã«ãå¿ èŠã ãšæããŸãã ã¡ã€ã³ã¢ããªã±ãŒã·ã§ã³ããã®ãããªããã«ãå¿ èŠãšããã®ã¯æéã®åé¡ã§ãã Djangoã§ã¯ãè¿ éãã€äŸ¿å©ã«äœæãããŸãã
Djangoã«ã¯ããã¹ãŠã®äž»èŠãªããŒã¿ããŒã¹ã§ããã«äœ¿çšã§ãã匷åãªORMããããŸãã ä»ã®ORMãšã¯ç°ãªããå¿
èŠãªå Žåã«ã®ã¿ããŒã¿ããŒã¹ã«ã¢ã¯ã»ã¹ããŸãã Pythonã®ãœãŒã¹ã³ãŒããããèšèªã®ä»ã®ãã¹ãŠã®æ©èœãšãšãã«äœ¿çšã§ããåºæ¬çãªSQLã¹ããŒãã¡ã³ãïŒããã³é¢æ°ïŒããµããŒãããŠããŸãã
Djangoã«ã¯ãéåžžã«æè»ã§åŒ·åãªãã³ãã¬ãŒããšã³ãžã³ããããŸãã å€ãã®æšæºãã£ã«ã¿ãŒãšã¿ã°ãå©çšã§ããŸãããç¬èªã®ãã£ã«ã¿ãŒãšã¿ã°ãäœæããããšãã§ããŸãã Djangoã¯ä»ã®ãšã³ãžã³ããã€ãã£ããã³ãã¬ãŒããšããŠãµããŒããããã³ãã¬ãŒããåŠçããããã®æšæºã®ã·ã§ãŒãã«ããæ©èœãä»ããŠä»ã®ãšã³ãžã³ãšç°¡åã«çµ±åããããã®APIãæäŸããŸãã
ãã¬ãŒã ã¯ãŒã¯ã«ã¯ãçä¿¡ãªã¯ãšã¹ãã解æããã«ãŒãã£ã³ã°ã¹ããŒã ã«åºã¥ããŠæ°ããURLãçæããURLã«ãŒã¿ãŒãªã©ãä»ã®å€ãã®éèŠãªæ©èœããããŸãã äžè¬ã«ãDjangoã¯äžç·ã«äœæ¥ããã®ã楜ãããå©ããå¿ èŠãªãšãã¯ã ããã¥ã¡ã³ããèªãã§ãã ãã
ééãïŒ1.ãããžã§ã¯ãã®äŸåé¢ä¿ã«Pythonã°ããŒãã«ç°å¢ã䜿çšãã
ãããžã§ã¯ãã®äŸåé¢ä¿ã«Pythonã°ããŒãã«ç°å¢ã䜿çšããªãã§ãã ãããäŸåé¢ä¿ã®ç«¶åãçºçããå¯èœæ§ããããŸãã Pythonã¯ãè€æ°ã®ããŒãžã§ã³ã®ããã±ãŒãžãåæã«äœ¿çšããæ¹æ³ãç¥ããŸããã ç°ãªããããžã§ã¯ããåãããã±ãŒãžã®ç°ãªãäºææ§ã®ãªãããŒãžã§ã³ãå¿ èŠãšããå Žåãããã¯åé¡ã«ãªããŸãã
éåžžããã®ãããªééãã¯ãPythonç°å¢ã®åé¢æ©èœãèªèããŠããªãPythonããã³Djangoéçºã®åå¿è ã«ãã£ãŠè¡ãããŸãã
ç°å¢ãéé¢ããã«ã¯å€ãã®æ¹æ³ããããŸãããæãäžè¬çãªæ¹æ³ã¯æ¬¡ã®ãšããã§ãã
- virtualenv ïŒç°å¢ãã©ã«ããŒãçæããPythonããã±ãŒãžã ç°å¢ãã¢ã¯ãã£ãåïŒããã³éã¢ã¯ãã£ãåïŒããããã«ã€ã³ã¹ããŒã«ãããŠããããã±ãŒãžã管çããããã®ã¹ã¯ãªãããå«ãŸããŠããŸãã ãããç§ã®ãæ°ã«å ¥ãã§æãç°¡åãªæ¹æ³ã§ãã éåžžããããžã§ã¯ããã©ã«ããŒã«è¿ãç°å¢ãäœæããŸãã
- virtualenvwrapper ïŒä»®æ³ç°å¢ã®äœæ/åé€/ã¢ã¯ãã£ãåãªã©ã®ããŒã«ã»ãããã°ããŒãã«ã«ã€ã³ã¹ããŒã«ãããã®ã»ãããžã®ã¢ã¯ã»ã¹ãæäŸããPythonããã±ãŒãžã ãã¹ãŠã®ç°å¢ã¯1ã€ã®ãã©ã«ããŒã«æ ŒçŽãããŸãïŒWORKON_HOMEå€æ°ã䜿çšããŠæžãæããããšãã§ããŸãïŒã
virtualenvwrapper
代ããã«virtualenv
ã䜿çšããå©ç¹ã¯virtualenvwrapper
ãŸããã - ä»®æ³ãã·ã³ ïŒã¢ããªã±ãŒã·ã§ã³å°çšã®ä»®æ³ãã·ã³å šäœãããåªããåé¢ã¯ãããŸããã VirtualBox ïŒç¡æïŒã VMware ã Parallels ã Proxmox ïŒç§ã®ãæ°ã«å ¥ããç¡æçããããŸãïŒãªã©ãå€ãã®ããŒã«ãå©çšå¯èœã§ãã Vagrantãªã©ã®ä»®æ³ãã·ã³èªååããŒã«ãšçµã¿åããããšãããã¯éåžžã«åŒ·åãªãœãªã¥ãŒã·ã§ã³ã«ãªããŸãã
- ã³ã³ãã ïŒè¿å¹Žãç§ã¯ã»ãšãã©ãã¹ãŠã®ãããžã§ã¯ããç¹ã«ãŒãããå§ããæ°ãããããžã§ã¯ãã§Dockerã䜿çšããŠããŸãã Dockerã¯å€ãã®æ©èœãåããçŽ æŽãããããŒã«ã§ãã ãããèªååããããã®ãµãŒãããŒãã£è£œããŒã«ã®æãå©çšå¯èœã§ãã Dockerã«ã¯ã¬ã€ã€ãŒãã£ãã·ã³ã°ããããã³ã³ãããŒãéåžžã«è¿ éã«åäœæã§ããŸãã åã³ã³ããã«ã¯ç¬èªã®ãã¡ã€ã«ã·ã¹ãã ãããããããžã§ã¯ãã¯é«ã¬ãã«ã§åé¢ãããŠãããããã°ããŒãã«Pythonç°å¢ã䜿çšããŸãã Dockerã䜿çšãããšãæ°ããããŒã ã¡ã³ããŒã¯ãç¹ã«ãã®ãã¯ãããžãŒã®çµéšãããå Žåã«ããããžã§ã¯ãã®äœæ¥ãããæ©ãéå§ã§ããŸãã
ééã2ãrequirements.txtãã¡ã€ã«ã«äŸåé¢ä¿ã®ãã€ã³ãã£ã³ã°ããªã
æ°ããPythonãããžã§ã¯ãã¯ãã¹ãŠã requirements.txtãã¡ã€ã«ãšæ°ãããµã³ãããã¯ã¹ã§éå§ããå¿
èŠããããŸãã éåžžã pip/easy_install
䜿çšããŠã requirements.txt
ãå¿ããã«ãã¹ãŠã®ããã±ãŒãžpip/easy_install
ã€ã³ã¹ããŒã«ãrequirements.txt
ã éåžžããããžã§ã¯ãããµãŒããŒãŸãã¯ããŒã ã¡ã³ããŒã®ãã·ã³ã«å±éããæ¹ãç°¡åã§ãïŒ ããããããæ£ç¢ºã§ãïŒã
requirements.txtãã¡ã€ã«ã§ã¯ãäŸåé¢ä¿ã®ç¹å®ã®ããŒãžã§ã³ãåºå®ããããšãéèŠã§ãã éåžžãããã±ãŒãžã®ç°ãªãããŒãžã§ã³ã¯ãç°ãªãã¢ãžã¥ãŒã«ãé¢æ°ãããã³é¢æ°ãã©ã¡ãŒã¿ãŒãæäŸããŸãã äžäœããŒãžã§ã³ã§ããäŸåé¢ä¿ã®å€æŽã«ããããã±ãŒãžãç Žæããå ŽåããããŸãã ããã¯ãã©ã€ããããžã§ã¯ããããããããå®æçã«å±éããå Žåãéåžžã«æ·±å»ãªåé¡ã§ããããŒãžã§ã³ç®¡çã·ã¹ãã ããªããšããã«ãã·ã¹ãã ã¯åžžã«ããã±ãŒãžã®ææ°ããŒãžã§ã³ãã€ã³ã¹ããŒã«ããããã§ãã
æ¬çªç°å¢ã§ã¯ãåžžã«ããã±ãŒãžããã€ã³ãããŠãã ããïŒ ããã«ã¯éåžžã«åªããpip-toolsã䜿çšããŸãã äŸåé¢ä¿ã®ç®¡çã«åœ¹ç«ã€äžé£ã®ã³ãã³ããæäŸããŸãã ãã®ããŒã«ã¯ã requirements.txt
èªåçã«çæãrequirements.txt
ããã®ãã¡ã€ã«ã«ã¯ãäŸåé¢ä¿ã ãã§ãªããããªãŒå
šäœãã€ãŸãäŸåé¢ä¿ã®äŸåé¢ä¿ãé¢é£ä»ããããŠããŸãã
äŸåé¢ä¿ãªã¹ãã®äžéšã®ããã±ãŒãžãæŽæ°ããå¿
èŠãããå ŽåããããŸãïŒããšãã°ããã¬ãŒã ã¯ãŒã¯ãŸãã¯ãŠãŒãã£ãªãã£ã®ã¿ïŒã pip freezeã«é Œããšãã©ã®ããã±ãŒãžã§ã©ã®äŸåé¢ä¿ã䜿çšãããŠããããããããªããããæŽæ°ã§ããŸããã pip-toolsããŒã«ã¯ããã€ã³ãããäŸåé¢ä¿ã«åŸã£ãŠããã±ãŒãžãèªåçã«ãã€ã³ããããããã©ã®ããã±ãŒãžãæŽæ°ããå¿
èŠãããããèªåçã«æ±ºå®ããŸãã ãŸãã requirements.txt
䜿çšãããŠããã³ã¡ã³ãã®ãããã§ãã©ã®ããã±ãŒãžãã©ã®äŸåé¢ä¿ããæ¥ãããåžžã«ææ¡ã§ããŸãã
ããã«æ³šæããããã«ãäŸåé¢ä¿ã®ãœãŒã¹ãã¡ã€ã«ãããã¯ã¢ããã§ããŸãã ãã¡ã€ã«ã·ã¹ãã ãGitãã©ã«ããŒãS3ãã©ã«ããŒãFTPãSFTPã«ã³ããŒãä¿ç®¡ããŸã-ã©ãã§ããæå
ã«ã æ¯èŒçå°ããªããã±ãŒãžã®ãªã¹ãããé€å€ãããšnpmã®å€æ°ã®ããã±ãŒãžãç Žæããå ŽåããããŸã ã Pipã§ã¯ãå¿
èŠãªãã¹ãŠã®äŸåé¢ä¿ããœãŒã¹ãã¡ã€ã«ã®åœ¢åŒã§ããŠã³ããŒãã§ããŸãã 詳现ã«ã€ããŠã¯ã pip help download
ã³ãã³ããå®è¡ããŠãã ããã
ééãïŒ3.ã¯ã©ã¹ããŒã¹ãã¥ãŒã®ä»£ããã«æãªããã®Pythoné¢æ°ã䜿çšãã
ç¹ã«ãã¹ããã¥ãŒããŠãŒãã£ãªãã£ãã¥ãŒã®å Žåã¯ã views.py
ã¢ããªã±ãŒã·ã§ã³ãã¡ã€ã«ã§å°ããªPythoné¢æ°ã䜿çšããããšããå§ãããŸãã ãã ããéåžžãã¢ããªã±ãŒã·ã§ã³ã§ã¯ãã¯ã©ã¹ããŒã¹ãã¥ãŒïŒCBVïŒã䜿çšããå¿
èŠããããŸãã
CBVã¯ãäžè¬çãªWebéçºã¿ã¹ã¯ãå®è£ ããæœè±¡ã¯ã©ã¹ãæäŸããæ±çšè¡šçŸã§ãã å°é家ã«ãã£ãŠäœæãããCBVã¯ãäžè¬çãªè¡åãã¿ãŒã³ã®ã»ãšãã©ãã«ããŒããŠããŸãã ããæ§æãããAPIããããCBVã¯OOPã®ãã¹ãŠã®å©ç¹ã享åããæ©äŒãæäŸããŸãã ã³ãŒãã¯ããã¯ãªãŒã³ã§èªã¿ããããªããŸãã ãªã¹ãã®äœæãCRUDæäœããã©ãŒã ã®åŠçãªã©ã«Djangoã®æšæºãã¥ãŒé¢æ°ã䜿çšããããšã®é£ãããå¿ããŠãã ãããé©åãªCBVããã¥ãŒã«æ¡åŒµãããã¬ãŒã³ããŒã·ã§ã³åäœãæ§æããé¢æ°ãŸãã¯ã¯ã©ã¹ããããã£ããªãŒããŒã©ã€ãã§ããŸãïŒéåžžé¢æ°ã¯ããããã£ãè¿ããŸããCBVã®ä»£ããã«ãã¬ãŒã³ããŒã·ã§ã³é¢æ°ã䜿çšãããšãã³ãŒããã¹ãã²ããã£ã«å€ããããšãã§ããããžãã¯ãè¿œå ã§ããŸãã
ããšãã°ããããžã§ã¯ãã§ããŸããŸãªããã¯ã¹ã€ã³ã䜿çšããŠãåºæ¬çãªCBVåäœããªãŒããŒã©ã€ãã§ããŸãïŒãã¥ãŒã³ã³ããã¹ãã®äœæãè¡ã¬ãã«ã§ã®æ¿èªã®ç¢ºèªãã¢ããªã±ãŒã·ã§ã³æ§é ã«åºã¥ãããã³ãã¬ãŒããã¹ã®èªåäœæãã¹ããŒããã£ãã·ã¥ã®çµ±åãªã©ã
ã¢ããªã±ãŒã·ã§ã³åãšãã¥ãŒã¯ã©ã¹åã«åºã¥ããŠãã¥ãŒã®ãã³ãã¬ãŒãåãæšæºåããDjango Template Namesããã±ãŒãžãäœæããŸããã ç§ã¯æ¯æ¥ããã䜿çšããååãéžæãããšãã«å€ãã®æéãç¯çŽããŸãã CBVã«mixinãæ¿å
¥ããã ãã§ã- class Detail(TemplateNames, DetailView):
-ããã§åäœãå§ããŸãïŒ ãã¡ãããç§ã®æ©èœãåå®çŸ©ããŠãã¢ãã€ã«ã¬ã¹ãã³ã·ããã³ãã¬ãŒãããŠãŒã¶ãŒãšãŒãžã§ã³ãçšã®ä»ã®ãã³ãã¬ãŒãããŸãã¯ä»ã®äœããè¿œå ã§ããŸãã
ééã4.ãèèªãè¡šçŸãšãèããïŒã¹ãããŒïŒã¢ãã«ã®èšè¿°
ã¢ããªã±ãŒã·ã§ã³ããžãã¯ãã¢ãã«ãããã¥ãŒã«è»¢éãããå Žåãããã¯ãã¥ãŒã«ã¢ãã«ã«å±ããã³ãŒããå«ãŸããŠããããšãæå³ããŸãã ã€ãŸããã¢ã€ãã¢ã¯ãåãããªããã¢ãã«ã¯ãèãããªããŸãã
ãããŠããåããã¢ãã«ãšãèãããã¥ãŒãæžãå¿ èŠããããŸãã
ã¢ãã«å ã®ããžãã¯ãå°ããªã¡ãœããã«åå²ããŸãã ããã«ãããããããç¹°ãè¿ã䜿çšããããå€æ°ã®ãœãŒã¹ïŒç®¡çãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ãããã³ããšã³ããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ãAPIãšã³ããã€ã³ããå€æ°ã®ãã¥ãŒïŒãã䜿çšãããã§ããŸãã ããã«ã¯æ°è¡ã®ã³ãŒãã®ã¿ãå¿ èŠã§ã倧éã®è¡ãã³ããŒããå¿ èŠã¯ãããŸããã 次åãŠãŒã¶ãŒã«ã¬ã¿ãŒãéä¿¡ããæ©èœãäœæãããšãã¯ãé»åã¡ãŒã«æ©èœã䜿çšããŠã¢ãã«ãå±éããã³ã³ãããŒã©ãŒã«ããžãã¯ãäœæããªãã§ãã ããã
ããã«ãããã³ãŒãããŠããããã¹ãã«äŸ¿å©ã«äœ¿çšã§ããããã«ãªããŸããããã¯ãé»åã¡ãŒã«ããžãã¯ã1ãæã§ãã¹ãã§ããåã³ã³ãããŒã©ãŒã§ãã¹ãã§ããªãããã§ãã ãã®åé¡ã®è©³çŽ°ã«ã€ããŠã¯ã Django Best Practicesãã芧ãã ããã 解決çã¯ç°¡åã§ãããåããã¢ãã«ãšãèãããã¥ãŒãäœæããŸãã 次ã®ãããžã§ã¯ãã§ãããéå§ããããçŸåšã®ãããžã§ã¯ãããªãã¡ã¯ã¿ãªã³ã°ããŸãã
ééã5ã巚倧ã§é ããã¡ã€ã«èšå®
æ°ããDjangoãããžã§ã¯ãèšå®ãã¡ã€ã«ã«ãããããã®èšå®ã®å€ããå«ãŸããŠããŸãã ãŸããå®éã®ãããžã§ã¯ãã§ã¯ãç¹ã«éçºãæ¬çªãããã³ã¹ããŒãžã³ã°ç°å¢ã§ç°ãªãæ§æãå¿ èŠãªå Žåããã¡ã€ã«ã¯700è¡ãè¶ ããŠç¶æãé£ãããªããŸãã
æ§æãã¡ã€ã«ãæåã§åå²ããŠåå¥ã®ããŒããŒãäœæã§ããŸãããç§ã¯å ±èè ã§ããåªãããååã«ãã¹ããããPythonããã±ãŒãžDjango Split Settingsããå§ãããŸãã
ãã®ããã±ãŒãžã«ã¯ããã¹ã®ã¯ã€ã«ãã«ãŒãããµããŒãããæ§æãã¡ã€ã«ãåãã³ã³ããã¹ãã«ã€ã³ããŒãããoptional
ãšinclude
2ã€ã®æ©èœããããŸãã ãã®ããã以åã«ã¢ããããŒããããã¡ã€ã«ã§æ§æãšã³ããªã宣èšããããšã«ãããæ§æãç°¡åã«äœæã§ããŸãã ãã®ããã±ãŒãžã¯ãDjangoã®ããã©ãŒãã³ã¹ã«ãŸã£ãã圱é¿ãäžãããã©ã®ãããžã§ã¯ãã§ã䜿çšã§ããŸãã
æå°æ§æã®äŸã次ã«ç€ºããŸãã
from split_settings.tools import optional, include include( 'components/base.py', 'components/database.py', 'components/*.py', # the project different envs settings optional('envs/devel/*.py'), optional('envs/production/*.py'), optional('envs/staging/*.py'), # for any local settings optional('local_settings.py'), )
ééã6ããªãŒã«ã€ã³ã¯ã³ã¢ããªã±ãŒã·ã§ã³ãäžé©åãªã¢ããªã±ãŒã·ã§ã³æ§é ããªãœãŒã¹ã®äžé©åãªå²ãåœãŠ
Djangoãããžã§ã¯ãã¯ãããã€ãã®ã¢ããªã±ãŒã·ã§ã³ã§æ§æãããŠããŸãã Djangoã®çšèªã§ã¯ã ã¢ããªã±ãŒã·ã§ã³ã¯å°ãªããšã__init__.py
ããã³models.py
ãå«ãPythonãããžã§ã¯ãmodels.py
ã Djangoã®ææ°ããŒãžã§ã³ã§ã¯ã models.py
äžèŠã«ãªãã models.py
ã ã__init__.py
ååã§ãã
Djangoã¢ããªã±ãŒã·ã§ã³ã«ã¯ãPythonã¢ãžã¥ãŒã«ãDjango åºæã®ã¢ãžã¥ãŒã« ïŒãã¥ãŒãURLãã¢ãã«ã管çããã«ããã©ãŒã ããã³ãã¬ãŒãã©ãã«ãªã©ïŒãéçãã¡ã€ã«ããã³ãã¬ãŒããããŒã¿ããŒã¹ç§»è¡ã管çã³ãã³ãããŠããããã¹ããå«ããããšãã§ããŸãã¢ããªã·ãã¯ã¢ããªã±ãŒã·ã§ã³ããåçŽãªããžãã¯ãåããå°ããªåå©çšå¯èœãªã¢ããªã±ãŒã·ã§ã³ã«åå²ããå¿ èŠããããŸãã
ã¢ããªã±ãŒã·ã§ã³ã®ç®çã1ã€ãŸãã¯2ã€ã®çãæã§å®å šã«èª¬æã§ããå¿ èŠããããŸãã äŸïŒããŠãŒã¶ãŒãã¢ã«ãŠã³ããã¡ãŒã«ã§ç»é²ããã³ã¢ã¯ãã£ãåã§ããããã«ããŸããã
ãããžã§ã¯ããã©ã«ããŒã«projectãšããååãä»ããã¢ããªã±ãŒã·ã§ã³ãproject/apps/
é
眮ããããšããå§ãããŸãã 次ã«ããã¹ãŠã®ã¢ããªã±ãŒã·ã§ã³ã®äŸåé¢ä¿ãç¬èªã®ãµããã©ã«ããŒã«å
¥ããŸãã
äŸïŒ
- éçãã¡ã€ã«ïŒ
project/apps/appname/static/appname/
- ãã³ãã¬ãŒãã¿ã°ïŒ
project/apps/appname/templatetags/appname.py
ãã³ãã¬ãŒãã¿ã°project/apps/appname/templatetags/appname.py
- ãã³ãã¬ãŒããã¡ã€ã«ïŒ
project/apps/appname/templates/appname/
ãã¹ãŠã®éçãã©ã«ããŒã¯1ã€ã«ããŒãžããããããã¢ããªã±ãŒã·ã§ã³åã¯åžžã«ãµããã©ã«ããŒã®ååã®ãã¬ãã£ãã¯ã¹ãšããŠè¿œå ããŸãã ãŸãã2ã€ä»¥äžã®ã¢ããªã±ãŒã·ã§ã³ã«js/core.js
ãããå Žåã settings.INSTALLED_APPLICATIONS
ã®æåŸã®ã¢ããªã±ãŒã·ã§ã³ã以åã®ãã¹ãŠã®ã¢ããªã±ãŒã·ã§ã³settings.INSTALLED_APPLICATIONS
ãªãŒããŒã©ã€ãããŸãã ãããžã§ã¯ãã§ãã®ãããªãã°ã«ééããããŒã ã¡ã³ããŒãã«ã¹ã¿ã 管çSPAããã«ãå®è£
ãããã®ãããªãã¡ã€ã«ãæäŸããããã«ãå¥ã®éçºstatic/admin/js/core.js
åå®çŸ©ããããšã«æ°ä»ããŸã§ãçŽ6æéãããã°ããŸããåãååã
å€ãã®ãªãœãŒã¹ãšPythonã¢ãžã¥ãŒã«ãå«ãããŒã¿ã«ã¢ããªã±ãŒã·ã§ã³ã®æ§é ã®äŸã次ã«ç€ºããŸãã
root@c5b96c395cfb:/test# tree project/apps/portal/ project/apps/portal/ âââ __init__.py âââ admin.py âââ apps.py âââ management â âââ __init__.py â âââ commands â âââ __init__.py â âââ update_portal_feeds.py âââ migrations â âââ __init__.py âââ models.py âââ static â âââ portal â âââ css â âââ img â âââ js âââ templates â âââ portal â âââ index.html âââ templatetags â âââ __init__.py â âââ portal.py âââ tests.py âââ urls.py âââ views.py 11 directories, 14 files
ãã®æ§é ã®ãããã§ãã¢ããªã±ãŒã·ã§ã³ããã€ã§ãå¥ã®Pythonããã±ãŒãžã«ãšã¯ã¹ããŒãããŠãåã³äœ¿çšã§ããŸãã PyPiã§ãªãŒãã³ãœãŒã¹ããã±ãŒãžãšããŠå ¬éããããå¥ã®ãã©ã«ããŒã«ç§»åãããããããšãã§ããŸãã ãã®ãããžã§ã¯ãæ§é ã®ãããªãã®ãåŸãããŸãïŒ
root@c5b96c395cfb:/test# tree -L 3 . âââ deploy â âââ chef â âââ docker â âââ devel â âââ production âââ docs âââ logs âââ manage.py âââ media âââ project â âââ __init__.py â âââ apps â â âââ auth â â âââ blog â â âââ faq â â âââ pages â â âââ portal â â âââ users â âââ conf â âââ settings.py â âââ static â âââ templates â âââ urls.py â âââ wsgi.py âââ static âââ admin âââ css âââ fonts âââ img âââ js 25 directories, 5 files
ãã¡ãããå®éã®ãããžã§ã¯ãã¯ããè€éã«ãªããŸããããã®ãããªæ§é ã¯åçŽåãããå€ãã®åŽé¢ãããéæã«ããŸãã
ééãïŒ7. STATICFILES_DIRSãšSTATIC_ROOTã¯Djangoéçºã®åå¿è ãæ··ä¹±ãããŸã
éçãã¡ã€ã«ã¯ãã¢ããªã±ãŒã·ã§ã³ã䜿çšããŠãå€åããªãè³ç£ã§ãã ããšãã°ãJavaScriptãCSSãç»åããã©ã³ããªã©ã§ããDjangoã§ã¯ãå±éäžã«ãããªãã¯ãã£ã¬ã¯ããªã«ãèç©ãããŸãã
éçºã¢ãŒã-python python manage.py runserver
-Djangoã¯ã STATICFILES_FINDERSãèšå®ããŠéçãã¡ã€ã«ãæ€çŽ¢ããŸãã ããã©ã«ãã§ã¯ã STATICFILES_DIRSã«ãªã¹ããããŠãããã©ã«ããŒå
ã§èŠæ±ããããã¡ã€ã«ãèŠã€ããããšããŸãã èŠã€ãããªãå Žåã¯ã django.contrib.staticfiles.finders.AppDirectoriesFinder
ã§æ€çŽ¢ãããããžã§ã¯ãã«ã€ã³ã¹ããŒã«ãããŠããåã¢ããªã±ãŒã·ã§ã³ã®static
ãã©ã«ããŒããã§ãã¯ããŸãã ãã®ã¹ããŒã ã«ãããç¬èªã®éçãã¡ã€ã«ãä»å±ããåå©çšå¯èœãªã¢ããªã±ãŒã·ã§ã³ãäœæã§ããŸãã
æ¬çªç°å¢ã§ã¯ãnginxãªã©ã®åå¥ã®WebãµãŒããŒãä»ããŠéçããŒã¿ãé
åžããŸãã 圌ã¯ãDjangoãããžã§ã¯ãã®ã¢ããªã±ãŒã·ã§ã³ã®æ§é ããéçãã¡ã€ã«ãé
åžãããŠãããã©ã«ããŒã«ã€ããŠã¯äœãç¥ããŸããã 幞ããªããšã«ãDjangoã¯collect static managementã³ãã³ãSTATICFILES_FINDERS
python manage.py collectstatic
STATICFILES_FINDERS
ãæäŸããŸãããã®ã³ãã³ãã¯STATICFILES_FINDERS
ãééãã static
ã¢ããªã±ãŒã·ã§ã³ãã©ã«ããŒãšSTATICFILES_DIRS
ã«ãªã¹ãããããã©ã«ããŒãããã¹ãŠã®éçãã¡ã€ã«ãæå®ããSTATICFILES_DIRS
ããŸãã STATIC_ROOTãã£ã¬ã¯ããªã«ã ããã«ãããéçºã¢ãŒãã®DjangoãµãŒããŒãšåãããžãã¯ã䜿çšããŠãªãœãŒã¹ãéçããŒã¿ã®åœ¢åŒã§è§£æ±ºããWebãµãŒããŒã®ãã¹ãŠã®éçãã¡ã€ã«ã1ãæã§åéã§ããŸãã
å®çšŒåç°å¢ã§collectstaticãå®è¡ããããšcollectstatic
å¿ããªãã§ãã ããïŒ
ééã8ãå®çšŒåç°å¢ã®ããã©ã«ãSTATICFILES_STORAGEããã³Djangoãã³ãã¬ãŒãããŒããŒã䜿çšãã
å®çšŒåç°å¢ã®è³ç£ç®¡çã«ã€ããŠè©±ããŸãããã ãè³ç£ãæéåãã«ãªãããšã¯ãããŸããããšããããªã·ãŒã䜿çšãããšãæé«ã®UXãæäŸã§ããŸãïŒãªãœãŒã¹ã¯æéåãã«ãªããŸããïŒïŒè©³çŽ°ã«ã€ããŠã¯ã ãã¡ããåç §ããŠãã ããïŒã ã€ãŸãããã¹ãŠã®éçãã¡ã€ã«ã¯ããã©ãŠã¶ã§æ°é±éãæ°ã¶æããŸãã¯æ°å¹Žããã£ãã·ã¥ãããå¿ èŠããããŸãã ã€ãŸãããŠãŒã¶ãŒã¯ãªãœãŒã¹ã1åã ãããŠã³ããŒãããå¿ èŠããããŸãã
ã¯ãŒã«ãªã¢ã€ãã¢ã§ãããéçãã¡ã€ã«ãå«ããã©ã«ããŒã®nginxèšå®ã®ã»ãã®æ°è¡ã§å®è£ ã§ããŸãã ãããããã£ãã·ã¥ã®é¢é£æ§ããã§ãã¯ããã®ã¯ã©ãã§ããïŒ ãŠãŒã¶ãŒããªãœãŒã¹ã1åã ãããŠã³ããŒãããå Žåãã¡ãã¥ãŒã®ããŽããã©ã³ããJavaScriptããŸãã¯ããã¹ãã®è²ãæŽæ°ãããã©ãããŸããïŒ ãã®åé¡ã解決ããã«ã¯ãå±éããšã«éçãã¡ã€ã«ããšã«äžæã®URLãšååãçæããå¿ èŠããããŸãïŒ
ãããè¡ãã«ã¯ã ManifestStaticFilesStorageãSTATICFILES_STORAGE
ãšããŠäœ¿çšãïŒæ³šæãããã·ã¥ã¯DEBUG=false
ã¢ãŒãã§ã®ã¿æå¹ã«ãªã£ãŠããïŒã STATICFILES_STORAGE
ã³ãã³ããå®è¡ã§ããŸãã ããã«ãããå®çšŒåãµã€ãããã®ãªãœãŒã¹èŠæ±ã®æ°ãæžå°ããã¯ããã«é«éã«ãªããŸãã
Djangoã®ã¯ãŒã«ãªæ©èœã¯ããã£ãã·ã¥ããããã³ãã¬ãŒãããŒããŒã§ãã åèµ·åãããã¬ã³ããªã³ã°ã®ãã³ã«ãã³ãã¬ãŒããã¡ã€ã«ã解æããŸãã ãã³ãã¬ãŒãã®è§£æã¯éåžžã«é«äŸ¡ãªæäœã§ãããå€ãã®ã³ã³ãã¥ãŒãã£ã³ã°ãªãœãŒã¹ãå¿ èŠã§ãã ããã©ã«ãã§ã¯ãDjangoãã³ãã¬ãŒãã¯ãã¹ãŠã®ãªã¯ãšã¹ãã§è§£æãããŸããããã¯ãç¹ã«æ°åã®ãªã¯ãšã¹ããçæéã§åŠçã§ããæ¬çªç°å¢ã§ã¯äžé©åã§ãã
cached.Loaderæ§æã»ã¯ã·ã§ã³ã§ãåé¡ã®è§£æ±ºçã®è¯ãäŸãšè©³çŽ°ãèŠã€ããããšãã§ããŸãã ããŒãããŒããŒã¯ããã¡ã€ã«ã·ã¹ãã ãã解ææžã¿ãã³ãã¬ãŒãããªããŒãããªããããéçºã¢ãŒãã§ã¯äœ¿çšããªãã§ãã ããã ãã³ãã¬ãŒããå€æŽãããã³ã«ã python manage.py startapp
ã䜿çšããŠãããžã§ã¯ããåèµ·åããå¿
èŠããããŸãã éçºäžãããã¯ç
©ããããããããŸããããå®çšŒåç°å¢ã«ã¯çæ³çã§ãã
ééãïŒ9.ãŠãŒãã£ãªãã£ãŸãã¯ã¹ã¯ãªããçšã®çŽç²ãªPython
Djangoã«ã¯åªããæ©èœç®¡çããŒã ãããŸãã ãããžã§ã¯ãã®ãŠãŒãã£ãªãã£çšã«ãçŽç²ãªPythonã§ã®ã¹ã¯ãªãã圢åŒã§èªè»¢è»ãçºæãã代ããã«ããããã䜿çšããŠãã ããã
ãŸãã Djangoã®ã«ã¹ã¿ã æ¡åŒµæ©èœã®ã³ã¬ã¯ã·ã§ã³ã§ããDjango Extensionsããã±ãŒãžã確èªããŠãã ããã ãããã誰ããããªãã®ããŒã ãæ¢ã«å®è£ ããŠããã®ã§ãããïŒ å€ãã®äžè¬çãªã¿ãŒã²ããããŒã ããããŸãã
ééãçªå·10ããµã€ã¯ãªã³ã°
DjangoãšPythonã«ã¯ãäœåãã®æ¢è£œã®ãœãªã¥ãŒã·ã§ã³ããããŸãã ãŸã£ãããŠããŒã¯ã§ã¯ãªãäœããæžãåã«ãæ€çŽ¢ãšã³ãžã³ã«é Œã£ãŠãã ããã ãããããã§ã«é©åãªãœãªã¥ãŒã·ã§ã³ããããŸãã
è€éã«ããå¿ èŠã¯ãããŸããã æåã®ã°ãŒã°ã«ïŒ èŠã€ãã£ãå質ã®ããã±ãŒãžãã€ã³ã¹ããŒã«ããæ§æããå±éãããããžã§ã¯ãã«çµ±åããŸãã ãããŠå¯èœã§ããã°ããªãŒãã³ãœãŒã¹ã«è²¢ç®ããŠãã ããã
Djangoãèªåã§å§ããããã®ããã±ãŒãžã®ãªã¹ãã¯æ¬¡ã®ãšããã§ãã
- Django Macros URL ïŒãã¯ãã䜿çšãããšãDjangoã¢ããªã±ãŒã·ã§ã³ã§URLãã¿ãŒã³ãç°¡åã«èšè¿°ïŒããã³èªã¿åãïŒã§ããŸãã
- Django Templates Names ïŒCBVãã³ãã¬ãŒãã®ååãç°¡åã«æšæºåããã®ã«åœ¹ç«ã€å°ããªããã¯ã¹ã€ã³ã
- Djangoã®åå²èšå® ïŒè€æ°ã®ãã¡ã€ã«ãšãã£ã¬ã¯ããªã«Djangoèšå®ãé åžã§ããŸãã èšå®ãç°¡åã«ãªãŒããŒã©ã€ãããã³å€æŽããŸãã ãã¡ã€ã«ãã¹ã§ã¯ã€ã«ãã«ãŒãã䜿çšããæ§æãã¡ã€ã«ããªãã·ã§ã³ãšããŠããŒã¯ããŸãã
ç¹°ãè¿ããŠã¯ãããŸããïŒDRYïŒïŒ
ç§ã¯DRYã³ã³ã»ããã®ãµããŒã¿ãŒãªã®ã§ã Djangoã¹ã±ã«ãã³ãäœæããŸãããããã¯ãããã«äœ¿çšã§ãã䟿å©ãªæ©èœãåãã䟿å©ãªããŒã«ã§ãã
- docker-composeã«ãã£ãŠç®¡çãããéçº/çç£çšã®Dockerã€ã¡ãŒãžãã³ã³ãããŒã®ãªã¹ããç°¡åã«èª¿æŽã§ããŸãã
- å®çšŒåç°å¢ã«ãããã€ããåçŽãªFabricã¹ã¯ãªããã
- ããŒã¹ããã³ããŒã«ã«ãœãŒã¹ã®èšå®ãå«ãããã±ãŒãžDjango Split Settingsã®æ§æã
- Webpackãããžã§ã¯ãã«çµ±å-collectstaticã³ãã³ããå®è¡ãããšãDjangoã¯distãã©ã«ããŒã®ã¿ãåéããŸãã
- ãããã¯ã·ã§ã³ã®ãã£ãã·ã¥ãããDjangoãã³ãã¬ãŒããããã·ã¥ãããéçãã¡ã€ã«ããããã°çšã®çµ±åããŒã«ããŒããã®ã³ã°ãªã©ããã¹ãŠã®åºæ¬çãªDjangoèšå®ãšæ©èœãæ§æãããŸãã
ããã¯ã次ã®ãããžã§ã¯ãã§ããã«äœ¿çšã§ãããããã«äœ¿çšã§ããDjangoã¹ã±ã«ãã³ã§ãã æéãå€§å¹ ã«ç¯çŽã§ããããšãé¡ã£ãŠããŸãã Webpackã®åºæ¬æ§æã¯æå°éã§ãããSASSã䜿çšããŠãäºåæ§æããã.scssãã¡ã€ã«ãã€ã³ã¹ããŒã«ããŠåŠçããŸãã