°Ù¶ÈµÄ²©¿ÍʹÓõıàÂëÊÇGBK£¬½á¹ûÓÐЩrss readerʶ±ð¾ÍÓÐÎÊÌâ¿´ÉÏÈ¥¾ÍÊÇÂÒÂë¡£´òËãÊÔÊÔתÏòÐÂÀ˵ÄÇᲩ¿ÍÁË¡£
http://qing.weibo.com/u/1689940061
Àà±ð£ºÐÄÇé¹ÊÊ ²é¿´ÆÀÂÛ
ÕâÁ½ÌìÒ»Ö±ÔÚ¿¼ÂÇÈçºÎʵÏÖÒ»¸ö±È½ÏcoolµÄ»¥¶¯Ê½±àд½Ì³ÌµÄ¹¦ÄÜ£¬µ±È»Ò²¿ÉÒÔÓÃÀ´Ð´²©¿Í£¬×÷Ϊ·ÅÔÚ uliweb.clkg.org ÉϵÄÒ»¸ö½Ì³ÌµÄÑùÀý¡£Õâ¸öÑùÀý»á±ß×ö±ßд¡£ÄÇôºÜÖØÒªµÄÒ»¸öÎÊÌâ¾ÍÊÇÈçºÎ¸ù¾Ý¼ÈëµÄÄÚÈÝÉú³ÉÒ×ÓÚʹÓõÄhtmlµÄÒ³Ãæ¡£Ä¿Ç°²»ÏëʹÓÃËù¼û¼´ËùµÃµÄ±à¼Æ÷£¬ÕâÑùÉú³ÉÒ³Ãæ±È½ÏÂé·³¡£´òËãʹÓýṹ»¯Îı¾£¬²»¹ýÉÏ´«Í¼Æ¬¿ÉÄܲ»ÊǺܷ½±ã£¬²»¹ýû̫´ó¹ØÏµ¡£µ«ÊÇÈçºÎ½øÐнâÎö£¬²ÉÓÃÄĸö°ü¾Í³ÉΪһ¸öÎÊÌâ¡£ÎÒÏ£Íû¸ñʽ¾¡¿ÉÄܵļòµ¥¡£ÕýºÃÕâÁ½Ìì¿´ÁËpyconÉϵÄÒ»¸öÊÓÆµ
Parsing Horrible Things with Python. ÉÏÃæ½éÉÜÁËÑݽ²ÕßÓõö½âÎöÆ÷£¬ºÜ¶àÊÇ»ùÓÚPEG(¹ØÓÚPEG http://www.brynosaurus.com/pub/lang/peg.pdf ÎÒÒ²²»¶®£¬µÚÒ»´ÎÌý˵)·½Ê½µÄ½âÎö¡£ÓÚÊÇÎÒÏëÊÔÊÔʹÓÃparsimonious×÷Ò»¸ö½âÎöÆ÷¡£ÓÚÊÇ¿ªÊ¼ÏÂÔØ£¬³¢ÊÔ¡£²»¹ý£¬·¢ÏÖĿǰ»¹ÎÞ·¨Ö»Ð´Îı¾µÄÐÎʽ¾ÍÉú³ÉÒ»¸ö½âÎöÆ÷£¬Îª´ËÎÒдÁËÒ»¸öÎÊÌâÔÚgithubÉÏ¡£×÷Õ߻ظ´ÊÇÈÃÎÒ¹Ø×¢Ëü£¬Ä¿Ç°Õâ¸ö¹¦ÄÜ»¹Ã»ÓÐʵÏÖ£¬Ö»ÊÇʵÏÖÁË¿ÉÒÔ½âÎöPEGÓï·¨¡£¿´µ½ËüµÄµ×²ãʵÏÖÆäʵ»¹ÊÇ»ùÓÚÕýÔò±í´ïʽ£¬Ö»²»¹ýдÆðÀ´¿ÉÒÔÈÝÒ׵㡣ÓÚÊÇÎÒ»¹ÊÇÔÚÕâ¸ö»ù±¾ÉϽøÐÐÁ˳¢ÊÔ¡£·¢ÏÖ³ýÁË»¹ÎÞ·¨¶¨ÒåÎı¾µÄGrammarÖ®Í⣬ËüÌṩµÄVisitorÒ²²»ÊÇÎÒÏëÏóµÄÄÇÑù¹¤×÷¡£²»¹ý£¬ËüÒѾ¿ÉÒÔÉú³ÉASTµÄÊ÷£¬ÕâÒ»µã»¹ÊDz»´í¡£
½ñÌìÔÚ³¢ÊÔʱ·¢ÏÖÔÚ´òÓ¡ÓÐunicodeµÄ½áµãʱ»á±¨´í£¬ÓÚÊÇÎÒ·¢ÁËÒ»¸öÎÊÌâÔÚgithubÉÏ£¬ÎÒĿǰÊÇÊÖ¹¤ÐÞ¸ÄÁËËüµÄ´úÂëÕâÑùÎÒ¿ÉÒÔ¼ÌÐøÊµÏÖÏÂÈ¥¡£ÎÒÏÖÔÚÏë×öµÄ¾ÍÊÇ×öÒ»¸öÏóWikiÒ»ÑùµÄ½âÎöÆ÷£¬¼õÉÙʹÓÃËõ½üµÄ·½Ê½¡£ÕâÑù¾Í¿ÉÒÔδÀ´ÓÃÓڽ̳ÌÍøÕ¾ÄÚÈݵÄת“Q¹¦ÄÜÁË¡£
Àà±ð£ºUliweb ²é¿´ÆÀÂÛ
uliwebµÄÂÛ̳ÆäʵÎÒÒѾ²¿Êð¹ýºÜ¶à´ÎÁË£¬Ïódotcloud, saeµÈ£¬ÏÖÔÚÓÉasmcos´î½¨ÁËÒ»¸öÐµģ¬µØÖ·ÔÚ£º http://uliweb.clkg.org ¡£·Ç³£¸Ðл¡£ÏÖÔÚµÄforum¹¦ÄÜÒѾʹµÃÁËbootstrapÑùʽ£¬±ÈÒÔǰҪ¸üºÃ¿´Ò»Ð©£¬¹¦ÄÜÉÏÒ²×öÁËһЩ‰ˆÇ¿£¬±ÈÈ版¼ÓÁ˶Ôij¸öÈ˵Ļظ´¹¦ÄÜ£¬²»¹ý»¹ÓеãСbug£¬ÓÐʱ¼äÔÙÓÅ»¯¡£
uliwebºÍplugsÒ²Ò»Ö±ÔڸĽø¡£Ä¿Ç°ÎÒ¸ú×Ùbootstrap±È½Ï¶à£¬Ä¿Ç°plugsÖеÄbootstrapÒѾÊÇ2.0.1ÁË¡£¹ý¼¸ÌìÎÒÉýµ½2.0.2¡£jquery×î¸ß°æ±¾ÊÇ1.7.2b1£¬Èç¹û³öÕýʽµÄÒ²Òª¸üÐÂÉÏ¡£plugsµÄlayout¿ªÊ¼°´·ÖÀàÀ´´¦Àí£¬ÒѾ‰ˆ¼ÓÁËbootstrapµÄlayout£¬ÓëÔÀ´µÄlayout¼æÈÝ¡£Í¬Ê±¸ÄдÁËһЩģ°å¡£
uliwebµÄformÒ²×öÁ˸üУ¬Ö÷ÒªÊÇÖ§³ÖÁËBootstrapµÄÑùʽ£¬Ä¿Ç°È±Ê¡µÄÑùʽ¾ÍÊÇBootstrapLayout¡£
½ñÌìÓÖÊÔÑé³É¹¦ÔÚpypyÉÏÅÜuliweb¡£
uliwebµÄORM»¹ÏëÔÙ×öһЩÓÅ»¯£¬È版¼Óexist()·½·¨£¬orm appÖ§³Ö¶ÌÁ¬½Ó¡£
¶Ôuliweb¸ÐÐËȤµÄÈË¿ÉÒÔÔÚuliwebµÄÓʼþÁбí»òÉÏÃæµÄÂÛ̳ÓëÎÒ½»Á÷¡£ÉõÖÁÓÐÐËȤ²ÎÓ뿪·¢¶¼ÊÇ»¶ÓµÄ¡£
Àà±ð£ºÄ¬ÈÏ·ÖÀà ²é¿´ÆÀÂÛ
ÒѾÔÚpypiÉÏ¿ÉÒÔ¿´µ½£¬²¢ÇÒ¿ÉÒÔͨ¹ýcode.googleºÍgithubÀ´ÏÂÔØ¡£Ê¹ÓÃeasy_install Ó¦¸ÃÒ²¿ÉÒÔ°²×°¡£
ÏÖÔÚsaeµÄÄÚ²â°æ±¾ÒѾÄÚÖÃÁËuliwebµÄ°æ±¾£¬²¢ÇÒsqlalchemyÒ²°²×°ÁË£¬°æ±¾ÊÇ0.7.3¡£
Ϊʲô°æ±¾ºÅÕâôµÍ£¬ÒòΪÎҸоõ»¹²»ÊÇÌØ±ðµÄÂúÒ⣬µÈÔÙÌí¼ÓһЩÐµĹ¦ÄÜÕùÈ¡Éý¼¶µ½0.0.1°É¡£×îÐÂÒªÌí¼ÓµÄ¹¦Äܼƻ®:
Êý¾Ýµ¼Èëµ¼³ö‰ˆ¼Ó¶Ôcsv, excelµÄÖ§³Ö
‰ˆ¼ÓÒ»¸öÊý¾Ý¿âά»¤µÄ½çÃæ£¬½«·ÅÔÚplugsÖУ¬ÒÔ±ã¿ÉÒÔÔÚsaeÉÏʹÓÃ
½«form, generic, dbuploadÎĵµÐ´Íê
bug fix
ºóÃæ»¹ÒªÍê³ÉµÄ£º
plugsÏà¹ØµÄÎĵµ
ormµÄ½øÒ»²½ÓÅ»¯
CRUDµÄ´úÂë¿ò¼ÜµÄÉú³É
forum¹¦ÄܵĽøÒ»²½ÓÅ»¯
¿ª·¢Ò»¸öBlog app
rss feedÉú³ÉÖ§³Ö
develop¹¦ÄÜʹÓÃjqueryÖØÐ´
Óëin.jsµÄ¼¯³É
Àà±ð£ºUliweb ²é¿´ÆÀÂÛ
°æ±¾½«ÊÇ0.0.1a7,²»¹ý»¹ÓÐһЩûŪÍêµÄ¡£ÓÐһЩ±ä»¯»áÔì³ÉÓëÏÖÓеijÌÐò²»¼æÈݵĵط½£º
1. MiddlewareµÄÅäÖÃд·¨±ä»¯
ÔÀ´ÊÇÔÚGLOBALÏ£¬ÏÖÔÚ¶ÀÁ¢ÁË£¬ÏÖÔÚµÄд·¨ÊÇ£º
[MIDDLEWARES]
name = 'middleware_class_path'[, order]
ÎĵµËµÃ÷£º http://readthedocs.org/docs/uliweb/en/latest/middleware.html#id4
Ó°Ïì×î´óµÄ¿ÉÄܾÍÊÇapps/settings.iniÁË£¬Èç¹ûÄãÓõ½ÊÂÎñ£¬¿ÉÄÜ»áдtransaction_middleware£¬ÄÇô¿ÉÄÜÒªÐ޸ġ£ÆäËüµÄmiddleÒ»°ã¶¼ÔÚij¸öappϵÄsettings.iniÖж¨ÒåºÃÁË£¬Ò»°ã²»ÓÃÔÙÖØ¸´¶¨Ò壬ËùÒÔÓ°Ïì²»´ó¡£
2. appÒÀÀµ¶¨Òå±ä»¯¡£ÔÀ´ÊÇÔÚappϵÄconfig.iniÖеÄ[DEFAULT]ÖУ¬ÏÖÔÚÐÞ¸ÄΪ[DEPENDS]ÁË¡£
ÒÔÉÏÄÚÈÝ£¬Ö»ÒªÊÇÉæ¼°µ½uliwebºÍplugsµÄapp¶¼ÒѾ½øÐÐÁËÐ޸ġ£Ö»ÓÐ×ÔÒѶ¨ÒåµÄappºÍsettingsÒªÊÖ¹¤ÐÞ¸Äһϡ£
Àà±ð£ºUliweb ²é¿´ÆÀÂÛ
ʹÓÃSpninxÊÇÖ§³Öi18nµÄ£¬ÎĵµÔÚÕâÀï¡£
Ò»¡¢·Òë
¾¹ýÎÒµÄÊÔÑ飬¾ßÌåµÄÃüÁî¾ÍÊÇ£º
sphinx-build -b gettext -d ../locale/doctrees ./ ../locale/en
-b gettext ±íʾҪÉú³Épot¸ñʽ
-d ../locale/doctrees ºÃÏóÊÇ»º´æ
./ Ô´ÎļþĿ¼
../locale/en Êä³öĿ¼
Õâ¸öÃüÁîÊÇ¿¼ÂÇÒÔÏÂĿ¼½á¹¹£º
/project
/docs
#you are here
/locale
/en
ÄãÔÚdocsĿ¼ÏÂÀ´½øÐвÙ×÷¡£Éú³Épotºó¾Í¿ÉÒÔ·ÒëÁË¡£
ÒÔÉÏÃæÎªÀý£¬·ÒëÍêµÄPOÎļþ·Åµ½ locale/en/LC_MESSAGES Ï£¬Í¬Ê±Éú³ÉmoÎļþ¡£
¶þ¡¢Éú³ÉÎĵµ
ÕâÑùmo×¼±¸Íê³É¡£ÏÂÃæÔÙ´Îͨ¹ýÕý³£µÄ·ÒëÀ´Éú³ÉÄ¿±ê½á¹û£¬Èçhtml¸ñʽÎĵµ¡£
Ê×ÏÈÒª¼ì²éconf.pyÖÐÊÇ·ñÓÐlocale_dirsµÄÅäÖã¬Èç¹ûûÓУ¬ÔòÌí¼Ó½øÈ¥:
locale_dirs = ['../locale']
ÕâÀï¿ÉÒÔÌí¼Ó¶à¸ö¡£È»ºó£¬»òÕßÖ±½ÓÐÞ¸Äconf.pyÖеÄlanaguageµÄֵΪĿ±êÓïÑÔ£¬»òÕßÔÚ±àÒëʱÔÚÃüÁîÐÐÀ´Ö¸¶¨£¬È磺
sphinx-build -b html -d ../html/doctrees -D language=zh_CN ./ ../html
ÕâÀï²ÎÊý½âÊÍһϣº
-b html ½«Éú³Éhtml¸ñʽÎĵµ
-d ../html/doctrees »º´æÄ¿Â¼£¬ÕâÀïºÍlocaleÒª²»Í¬£¬²»È»»á±¨´í
-D language=zh_CN ÔÚÃüÁîÐÐÖ¸¶¨ÐÞ¸ÄÅäÖÃÖеÄlanaugeµÄÖµ£¬ÕâÀïΪzh_CN¡£
Àà±ð£ºPython ²é¿´ÆÀÂÛ
Ò²Ã»Ê²Ã´ÌØ±ðµÄ¸üУ¬²»¹ý°ÑÒÔǰ»ýÀ۵Ķ«Î÷Éú³ÉÁËÒ»¸ö°æ±¾¡£
- Upgrade winpdb version to 1.4.8
- Improve Edit->Format->Wrap Text functionality to suit for reStructuredText wrap
- Made memo file configurable thanks to Helio Perroni Filho
- Add Bash support thanks to Helio Perroni Filho
- Add some useful methods to support scripts files. Such as emptytab, newtab, etc. thanks to Helio Perroni Filho
- Add Lua support thanks to zhangchunlin
- Improve python file detect according to #! /usr/bin/env python thanks to zhangchunlin
- Add default color theme support, you can set it in Preference
- Add Create Python Package menu in context menu of Directory Browser Window
- Improve web2py plugin
- Improve regex window, and when you set Unicode flag, it'll automatically convert \uXXXX to unichr
- Fix strip tailing spaces bug
Àà±ð£ºUlipad ²é¿´ÆÀÂÛ
ÔÚдrstÎĵµÊ±Óöµ½Ò»¸öÎÊÌ⣺ÒòΪÐí¶àʱºò£¬Ò»¸ö¶ÎÂäµÄÎı¾±È½Ï³¤£¬Òò´ËÎÒÒ»°ãÊÇ“QÐÐÀ´Ð´¡£µ«ÊÇÓÐÒ»¸öÎÊÌâ¾ÍÊÇ£¬Í¨¹ýreStructuredText´¦Àíºó£¬»Ø³µ±ä³ÉÁ˿ոñ£¬¶øÈç¹ûÔÚºóÃæÌí¼Ó'\'¾ÍûÓÐÎÊÌâ¡£µ«ÊÇÊÖ¹¤Ìí¼ÓÌ«Âé·³ÁË£¬ÓÚÊÇÎÒÔÚulipadÔÀ´µÄÎı¾»ØÈƹ¦ÄÜÉÏ×öÁËÓÅ»¯¡£ÔÀ´µÄÎı¾»ØÈƲ»ÄÜ´¦ÀíÐÐβ·û£¬ÏÖÔÚÎÒÌí¼ÓÁËÁ½Ï¼ûÏÂͼ£º

Remove Tailing CharactersµÄ×÷ÓÃÊÇɾ³ýÐÐβµÄÌØÊâ×Ö·û£¬±ÈÈçÊÇ'\'
Add Tailing CharactersµÄ×÷ÓÃÊÇÎı¾»ØÈÆÊ±£¬Ã¿ÐÐ×îºóÌí¼ÓµÄ×Ö·û£¬±ÈÈçÊÇ'\'
Õâ¸ö¹¦ÄÜʹÓÃʱ£¬Ê×ÏÈҪѡÖÐÎı¾£¬È»ºó¿ÉÒÔͨ¹ý°´¿ì½Ý¼üCtrl+Shift+T»òͨ¹ý[Edit]²Ëµ¥»òÊó±êÓÒ¼ü²Ëµ¥[Format]->[Wrap Text...]À´¼¤»î¡£
width±íʾ×ܵÄÁпí
Indent±íʾÿÐеÄËõ½ü×Ö·û£¬Ê×ÏȳýÍâ
First Line Indent ΪÊ×ÏÈËõ½üµÄ×Ö·û
Skip Begging Characters ΪºöÂÔÿÐпªÊ¼µÄ×Ö·û£¬Èç#»ò¿Õ¸ñ
È»ºóµãOKºó£¬»á×Ô¶¯¶ÔÑ¡ÖÐÎı¾½øÐÐÖØÅÅ¡£
Òò´ËÔÙдrstʱ»á±È½Ï·½±ã½øÐд¦ÀíÁË¡£
Àà±ð£ºUlipad ²é¿´ÆÀÂÛ
ÔÚÎÒµÄÏîÄ¿ÖпªÊ¼Ê¹ÓÃbootstrap£¬²»¹ýÈÃÎҸоõµ½²»ÂúÒâµÄÊÇËü°ÑһЩ»ù±¾µÄ±êÇ©µÄÑùʽҲÐÞ¸ÄÁË£¬Èç:tableµÈ£¬ÕâÑù¾ÍÔì³ÉºÍÎÒÒÔǰʹÓõÄһЩcss»áÓÐһЩ³åÍ»£¬Òò´ËÎÒ´òËãÊÔןÄÔìһϣ¬½«Ä³Ð©Ñùʽµ¥¶ÀÓÃclassÀ´¶¨Ò壬²»Ö±½ÓÔÚÔ±êÇ©É϶¨Òå¡£¶øbootstrapʹÓÃÁËLess(http://www.lesscss.org)À´Éú³Écss£¬Òò´ËÖ±½ÓÐÞ¸Äcss²¢²»Ì«ºÃ¡£ÓÚÊÇ´òËã×°Ò»¸öLessµÄ¹¤¾ßÀ´´¦Àí¡£
ÔÚbootstrapµÄÎĵµÖÐ˵ÊÇʹÓÃnpm install lessÀ´°²×°¡£²»¹ýnpmÊÇnode.jsµÄ°ü¹ÜÀíÆ÷£¬ËùÒÔÒªÏëʹÓÃnpm֮ǰ£¬ÒªÏȰ²×°node.js»·¾³¡£ÏÖÔÚ×îеĿª·¢°æ±¾ÊÇ0.5.9°æ±¾£¬ÒѾÓÐwindowsϵĶþ½øÖưüÁË¡£ÎÒ°²×°ºÃºó£¬°²ÕÕnpmµÄ²Ù×÷²½ÖèÖ´ÐÐʧ°Ü£¬ºÃÏó×ÜÊÇËµÍøÂçÓÐÎÊÌ⣬ÒòΪÔÚ°²×°npmʱͬʱ»¹Òª°²×°Ò»Ð©×Ó°ü£¬¶¼ÊÇÒÀÀµÓÚgitµÄ£¨ÎҵĻ·¾³ÉÏÒѾÓÐgitÁË£©£¬µ«ÊDz»ÖªµÀΪʲô²»ÐС£
ÓÚÊÇÕÒµ½ÁíÒ»¸ö²ÉÓÃcygwin°²×°node.jsµÄÎÄÕ¡£ÕâÆªÎÄÕÂдµÃºÜÏêϸ£¬ËüÊDzÉÓÃÖ±½Ó±àÒëµÄ·½Ê½À´°²×°µÄ¡£¶ÔÓÚwin7µÄ»·¾³£¬ÆäÖÐ̸µ½rebaseallÕâ¸öÃüÁîµÄÖ´Ðзdz£ÖØÒª¡£²»¹ý¶ÔÓÚ±àÒë0.5.9ʧ°Ü£¬ºóÀ´ÎÒ¸ÄΪÎȶ¨°æ0.4.12¾ÍûÎÊÌâÁË¡£²»¹ý°²×°npmÒÀȻʧ°Ü¡£
ÓÚÊÇÓÖÕÒµ½Ò»¸öÍøÕ¾£¬ËüÊǰÑnode.jsÔÚwindowsÏÂÍêÕûµÄ´ò°üÁË£¬ÆäÖÐ×îеİ汾ÒѾÓÐnpmÁË¡£²»¹ý˵Ã÷¿´²»Ì«Çå³þ£¬ËµÊÇdocÏÂÓÐÎĵµ£¬µ«ÊÇûÕÒµ½¡£Ëü˵ÊÇÒѾ×Ô´øÁËcygwinµÄ»·¾³£¬Ó¦¸Ã¿ÉÒÔÍÑÀëcygwinÀ´ÔËÐС£ÎÒÏÈÔËÐÐbin/shell.cmd£¬È»ºóÖ´ÐУº
node npm install less
ÕâÀïҪעÒâ¼ÓÉÏnode¡£²»´í£¬ÖÕÓڳɹ¦ÁË¡£less°²×°µ½ÁËlib/node_modules/lessĿ¼Ï¡£µ½ÕâÀïÎÒÓָ㲻¶®ÁË£¬ÔõôÔËÐÐlessc°¡¡£
ÓÚÊÇÎҾͽ«node/binÏµļ¸¸öÖ÷ÒªµÄÎļþ£º
node.exe
node_modules
npm
npm-g
npm_g
ºÍlibĿ¼Õû¸ö¿½±´µ½ÁËcygwinµÄ°²×°Ä¿Â¼Ï¡£Ê¹ÓÃcygwinÀ´ÔËÐС£
ÓÖÔÚÍøÉÏËÑË÷Ò»µ½ÁËÕâÆªÎÄÕ£¬¼ÓÁËÒ»¸ö·ûºÅÁ´½Ó:
ln -s /lib/node_modules/less/bin/lessc /bin/lessc
ÕâÑùlessc¾Í¿ÉÒÔÓÃÁË¡£
ÕâÑùÔÚcygwinÏÂÇГQµ½bootstrapµÄĿ¼Ï£¬Ö´ÐУº
make
¾Í¿ÉÒÔ¶ÔlibϵÄbootstrap.less½øÐбàÒëÁË£¬Í¬Ê±¿ÉÒÔÉú³Émin.cssÎļþ¡£
³¢ÊÔ¹ý³ÌºÜÂÒ£¬²»¹ýºÃ´õless¿ÉÒÔÓÃÁË¡£
Àà±ð£ºUliweb ²é¿´ÆÀÂÛ
Îĵµ¿ÉÒԲμû:http://uliweb.readthedocs.org/en/latest/auth.html
ÓÅ»¯ºóµÄ¹¦ÄÜÓëÔÀ´µÄʹÓÃÓе㲻ͬ£º
1. User±í‰ˆ¼ÓÁËnickname×Ö¶Î
2. ÔÀ´auth/__init__.pyÖеÄif_login¸ÄΪÁËhas_login£¬²¢ÇÒÔrequire_loginÖ»ÊÇdecorator£¬ÏÖÔÚΪ¼È¿É×÷Ϊdecorator£¬ÓÖ¿É×÷Ϊһ°ãº¯ÊýʹÓá£
3. ½«require_loginдµ½settings.iniÖÐFUNCTIONSºÍDECORATORS£¬Óû§¿ÉÒÔͨ¹ý£º
from uliweb import functions, decorators
functions.require_login()
@decorators.require_login
À´·Ö±ðʹÓÃÁ½ÖÖÐÎʽ¡£
4. functionsÊÇЉˆµÄÈ«¾Ö¶ÔÏó£¬ÓÃÓÚ´Ósettings.iniÖУ¬Í¨¹ý¡°.function"µÄÐÎʽÀ´»ñÈ¡FUNCTIONSÖеĺ¯Êý£¬ºÍdecoratorsµÄʹÓ÷½Ê½ÀàËÆ¡£
5. ÔÚsettings.iniÖÐ×¢²áÁË/login, /logout URL£¬Ìí¼ÓauthÖ®ºó¾ÍÊÇȱʡʹÓÃÁË¡£
Àà±ð£ºUliweb ²é¿´ÆÀÂÛ
Îĵµ£º http://uliweb.readthedocs.org/en/latest/soap.html
²»¹ý»¹Ã»Óо¹ýÕýʽÏîÄ¿µÄÑéÖ¤£¬¹À¼Æ»¹ÓкܶàÒªÐ޸ĵġ£
ͬʱ»¹¶Ôuliweb×öÁËÒ»µãÓÅ»¯£¬È磺
ʹÓÃÊÂÎñÖмä¼þʱ£¬ÏÖÔÚÖ§³Öµ±response.error=Trueʱ×Ô¶¯»Ø¹ö¡£ÒÔǰֻÄÜÔÚÅ×Ò쳣ʱ²Å»á×Ô¶¯´¦Àí£¬Òò´ËÈç¹ûÄã×ÔÐд¦ÀíÒì³£¾ÍÐèÒª×ÔÐд¦ÀíÊÂÎñ¡£ÏÖÔÚͨ¹ýÕâ¸ö·½·¨¾Í¼òµ¥¶àÁË¡£
½«libĿ¼´¦ÀíÕâpackageÁË¡£
EXPOSESµÄ¶¨Ò巽ʽ½øÐÐÁËÐ޸ġ£ÎĵµÒѾ¸üС£
Àà±ð£ºUliweb ²é¿´ÆÀÂÛ
ÒѾÍê³É£¬·Åµ½uliweb-docÖÐÁË¡£¿ÉÒÔ·ÃÎÊ: http://uliweb.readthedocs.org/en/latest/log.html
Àà±ð£ºUliweb ²é¿´ÆÀÂÛ
×òÌ죬Lord LeatherfaceÎÊÎÒΪʲôʹÓÃÁËsudsºó£¬Êä³öÈÕÖ¾±ä³ÉÁËÁ½Ìõ¡£ÓÚÊÇÎÒ×ÐϸµØÑо¿ÁËloggingµÄÈÕÖ¾´¦Àí»úÖÆ£¬²¢ÇÒÔٴο¼ÂÇÁËuliwebµÄÈÕÖ¾´¦Àí£¬×îÖÕ¶ÔuliwebµÄÈÕÖ¾½øÐÐÁËÖØ¹¹£¬²¢ÇÒŪÇå³þÁËΪʲô»áÓÐÁ½ÌõÈÕÖ¾µÄÏÖÏó£¬Òò´ËÒÔ±¾ÎÄ×÷Ò»¸ö¼Ç¼¡£
¶ÔÓÚloggingÎÒÏë´ó¼ÒÓõÃÓ¦¸Ã²»ÉÙ£¬ÄÇôÎÒÏÈÌἸ¸öÎÊÌ⣺
1. loggingÖ±½ÓÊä³öÈÕÖ¾£¬Èçlogging.info()Óëlog = logging.getLogger('name') log.info()ÓÐʲô²»Í¬£¿
2. ¡°No handlers could be found for logger¡±ÊÇÔõô»ØÊ£¿
3. root loggerÓÐʲôÓã¬ÈçºÎ»ñµÃ£¿
4. ÐÎÈç"a.b.c"µÄloggerÃûÓÐʲôÓã¿
5. Èç¹ûÒ»¸öloggerÖ´Ðжà´ÎaddHandler£¬ÄÇôÿ¸öhandler¶¼»á±»Ö´ÐÐÂð£¿
6. loggerµÄ´«²¥(propagate)ÊÇÔõô»ØÊ£¿ÈçºÎ×èÖ¹Ëü£¿
ÓÐʱºò´ø×ÅÎÊÌâѧϰ¿ÉÄÜ»á¸ü¿ì¡£ÄÇôÏÂÃæ¸ù¾ÝÎÒµÄÀí½âÒ»µãµã½øÐнâÊÍ¡£
loggingÖÐlogÊÇ¿ÉÒÔ·Ö¼¶µÄ£¬ËüµÄ¼¶±ðÓëÄãʹÓÃgetLogger()ÖеÄÃû×ÖÓйØÏµ¡£±ÈÈ磬Äã¿ÉÒÔʹÓÃ"uliweb"»ò"uliweb.app"£¬ËüÃǵÄÇø±ð¾ÍÊÇ"uliweb.app"ÖÐÓÐÒ»¸ö'.'¡£ÄÇôlogging»á×Ô¶¯Éú³É"uliweb"ºÍ"uliweb.app"µÄlogger£¬²¢ÇÒ"uliweb"½«ÊÇ"uliweb.app"µÄloggerµÄ¸¸¶ÔÏó¡£ÕâÒ»µã¿ÉÒÔÕâÑùÑéÖ¤£º
>>> import logging
>>> log = logging.getLogger('uliweb.app')
>>> log.manager.loggerDict.items()
[('uliweb.app', <logging.Logger instance at 0x017CE238>), ('uliweb', <logging.PlaceHolder instance at 0x017CE2D8>)]
ÕâÀïÓÐÒ»¸öͦÓÐÒâ˼µÄ£¬¾ÍÊÇ'uliweb'Õâ¸öloggerËüµÄ¶ÔÏóÊÇPlaceHolder£¬Ï൱ÓÚÊÇÒ»¸ö¡°Ðé"ÈÕÖ¾¶ÔÏó¡£logging¿ÉÒÔÔÊÐíͨ¹ýgetLogger()À´×Ô¶¯Éú³É¶ÔÓ¦µÄlogger¶ÔÏó¡£¶ÔÓÚ·Ö¼¶µÄÈÕÖ¾Ãû×Ö£¬Ëü»áÒ»¼¶¼¶µØ´´½¨£¬Èç¹û¸¸¶ÔÏó»¹²»´æÔÚ£¬Ôò»á×Ô¶¯´´½¨Ò»¸öռλ¶ÔÏó¡£Èç¹û£¬ºóÃæÓû§ÓÖͨ¹ýgetLogger()À´´´½¨Ò»¸ö¸¸¶ÔÏó£¬Ôòlogging»á×Ô¶¯¶Ô¸¸×Ó¹ØÏµ½øÐÐÖØÐÂÐÞ¶©£¬±£Ö¤¶ÔÏó¹ØÏµµÄÕýÈ·ÐÔ¡£
ÔÙ¿´Ò»¿´¸¸×Ó¹ØÏµ£º
>>> log.parent
<logging.RootLogger instance at 0x017E3AD0>
>>> log1 = logging.getLogger('uliweb')
>>> log.parent
<logging.Logger instance at 0x01820DA0>
>>> log.parent.name
'uliweb'
ͦÓÐÒâ˼¡£µ±ÎÒÃÇÖ±½Óͨ¹ýgetLogger('uliweb.app')»ñµÃÈÕÖ¾¶ÔÏóʱ£¬ËüµÄparent²¢²»ÊÇռλ¶ÔÏó'uliweb'£¬¶øÊÇRootLogger¡£Õâ¸öRootLoggerÊÇÔÚµ¼Èëloggingʱ×Ô¶¯ÓÉÄ£¿é´´½¨µÄ£¬ËüµÄ´´½¨´úÂëÊÇ£º
root = RootLogger(WARNING)
Logger.root = root
Logger.manager = Manager(Logger.root)
root¶ÔÏóÓÐʲôÓÃÄØ£¿Ëü¾ÍÊÇȱʡµÄÈÕÖ¾¶ÔÏó¡£Ê¹ÓÃloggingµÄ×î¼òµ¥µÄ·½·¨ÊÇ£º
import logging
logging.info()
¿ÉÒÔÖ±½ÓÊä³ö¡£ÕâÀïÓÐÊ²Ã´ÃØÃÜ£¿¿´Ò»¿´´úÂëÒ»ÇоͶ¼Çå³þÁË¡£
def info(msg, *args, **kwargs):
"""
Log a message with severity 'INFO' on the root logger.
"""
if len(root.handlers) == 0:
basicConfig()
root.info(*((msg,)+args), **kwargs)
def callHandlers(self, record):
c = self
found = 0
while c:
for hdlr in c.handlers:
found = found + 1
if record.levelno >= hdlr.level:
hdlr.handle(record)
if not c.propagate:
c = None #break out
else:
c = c.parent
if (found == 0) and raiseExceptions and not self.manager.emittedNoHandlerWarning:
sys.stderr.write("No handlers could be found for logger"
" \"%s\"\n" % self.name)
self.manager.emittedNoHandlerWarning = 1
Àà±ð£ºUliweb ²é¿´ÆÀÂÛ
ÔÚºÜÔçÒÔǰµÄ°æ±¾ÖУ¬uliwebÖоÍÒѾÓÐÁËtimezoneµÄ´¦Àí£¬ÔÚuliweb/utils/data.pyÖУ¬ÒѾ¶¨ÒåÁËÈô¸ÉÓëÈÕÆÚ¡¢Ê±¼äÏà¹ØµÄapi¡£ÄÇʱÎÒ²ÉÓõÄÊÇpytzÀ´½øÐÐÊ±ÇøµÄ´¦Àí¡£ÔÚdefault_settings.iniÖÐGLOBAL/TIME_ZONEÖÐÉèÖÃÁËȱʡµÄÊ±Çø£¬È±Ê¡ÊÇNone¡£Í¬Ê±uliormÖеÄÈÕÆÚ¡¢Ê±¼äÔÚ×Ô¶¯Éú³Éʱ£¬Ò²ÊÇʹÓÃdate.pyÖеĺ¯ÊýÀ´Éú³ÉµÄ¡£Æô¶¯uliwebʱ£¬»á×Ô¶¯µ¼Èëpytz£¬È»ºó¸ù¾ÝTIME_ZONEÀ´ÉèÖÃÊ±Çø¡£µ«ÊǺóÀ´·¢ÏÖ£¬pytzµÄtzinfoÐÅϢ̫´óÁË£¬µ¼Èë·Ç³£Âý¡£ÓÚÊǾͰÑÕâ¸ö×Ô¶¯³õʼ»¯È¥µôÁË¡£ÒòΪpytzµÄÊ±ÇøÊý¾ÝÌ«¶à£¬¶øÇÒÌ«¸´ÔÓ£¬±ÈÈçÏÄÁîʱµÄ´¦Àí£¬µÄȷʹÓÃÆðÀ´±È½ÏÂé·³¡£ÓÚÊÇÎÒ¾ÍÏëÖ»Òª¼òµ¥µÄÊ±Çø¾Í¹»ÁË£¬±ÈÈ磺UTCºÍGMT-12µ½GMT+12µÄÊ±Çø£¬ÎÒÏëʹÓÃÊ±ÇøµÄÈËÓ¦¸Ã×ã¹»Á˽⣬ËûÏëÒªÊ²Ã´Ê±Çø¡£
²»¹ý´ËÊÂÒ»Ö±ÍÏ×Å£¬Ö±µ½Ç°Á½Ì컨ÁËЩʱ¼ä°ÑÕâ¸öÊ»ù±¾¸ã¶¨ÁË¡£Ê×ÏȲο¼ÁËpythonÊÖ²áÖйØÓÚdatetimeģʽÖеÄtzinfoµÄʾÀý£¨ºÃÏóÓв¿·ÖÊÇ´ÓpytzÖÐÀ´µÄ£©£¬±àдÁËUTCºÍGMT-12µ½GMT+12Ê±ÇøµÄÀ࣬²¢½øÐÐÁ˳õʼ»¯¡£È»ºóÓÖÐÞ¸ÄÁËdate.pyÖеÄһЩº¯Êý£¬Ê¹Æä¸üºÃÓÃһЩ¡£È»ºóÓÖÐÞ¸ÄÁËuliormÖеÄDatetimeProperty, DateProperty, TimePropertyµÈÊôÐÔÀ࣬ͬʱµ÷ÕûÁËuliormµÄvalidateµÄ´¦Àí¡£
ÕâÑù£¬ÔÚuliwebÖÐʹÓÃÊ±Çø¿ÉÒÔÓÐÁ½ÖÖ״̬£º1. ÎÞÊ±Çø×´Ì¬¡£2.ÓÐÊ±Çø×´Ì¬¡£
ÔÚuliwebÖеÄcontribÖУ¬ÐÂÌṩÁËÒ»¸ötimezoneµÄapp¡£Ò»µ©°üº¬Ëü£¬Ôò×Ô¶¯¸ù¾Ýsettings.iniÖеÄGLOBAL/TIME_ZONEÖеÄÉèÖóõʼ»¯date.pyÖÐʹÓõÄÈ±Ê¡Ê±Çø¡£ÕâÑù£¬Ö»ÒªÄãµÄÈÕÆÚºÍʱ¼äº¯Êý¶¼Ê¹ÓÃdate.pyÖÐÌṩµÄ·½·¨£¬¾Í¿ÉÒÔ×Ô¶¯´¦ÀíÊ±Çø¡£ËùνÎÞÊ±Çø×´Ì¬£¬¾ÍÊÇTIME_ZONEΪNone¡£ÕâÑù£¬Æäʵ¶¼ÊÇ·þÎñÆ÷µÄʱ¼ä£¬Ã»ÓÐÊ²Ã´Ê±ÇøµÄ¸ÅÄ¿ÉÄܾÍÊÇÎÒÃÇÆ½³£ËùʹÓõķ½Ê½¡£¶øÓÐÊ±Çø×´Ì¬£¬ÔòTIME_ZONE²»Îª¿Õ£¬±ÈÈçÉèÖóÉ'UTC'£¬ÔòËùÓÐdate.pyÖеĺ¯Êýȱʡ¶¼Ê¹ÓÃ'UTC'Ê±ÇøÀ´Éú³Éʱ¼ä¡£ÔÚuliormÖУ¬ÈÕÆÚºÍʱ¼äÊôÐÔÊÇ¿ÉÒÔͨ¹ýÌí¼Óauto_nowºÍauto_now_addÀ´×Ô¶¯ÔÚÐ޸ĺÍÌí¼Óʱ×Ô¶¯Éú³ÉÈÕÆÚÖµ£¬Ëü¾ÍÊÇʹÓÃÁËdate.pyÖеÄnow()º¯Êý¡£ËùÒÔ£¬Ò»µ©ÄãÉèÖÃÁËTIME_ZONE£¬Ôòuliweb»á×Ô¶¯°´Ê±ÇøµÄ·½Ê½½øÐд¦Àí¡£
¶ÔÓÚÊ±ÇøµÄ´¦ÀíÎÒÃÇÒª¿¼ÂÇ·þÎñÆ÷ºÍ¿Í»§¶ËÓпÉÄܲ»Ò»ÖµÄÎÊÌ⣺
Èç¹ûÎÒÃǵķþÎñÆ÷ºÍÓû§µÄ»úÆ÷ÊÇÔÚÒ»¸öµØÇø£¬Õâ¸öÎÊÌâ×îºÃ°ì£¬¿ÉÒÔ²»Ê¹ÓÃÊ±Çø£¬Ö±½ÓʹÓñ¾µØÊ±¼ä¡£ÕâÑùÖ»Òª²»ÉèÖÃTIME_ZONE»ò±£³ÖΪNone¾ÍºÃÁË¡£
µ«Èç¹û·þÎñÆ÷ºÍ¿Í»§¶Ë¿ÉÄܲ»ÔÚÒ»¸öµØÇø£¬±ÈÈçdotcloudµÄÓ¦Óã¬ÄÇô¾ÍÒª¿¼ÂÇÈçºÎ´¦Àí¿Í»§¶ËµÄÊ±Çø¡£ÕâÀïÎÒÃÇ¿ÉÒÔͳһ·þÎñÆ÷·½µÄÊ±Çø£¬Í¨¹ýÉèÖÃTIME_ZONE¡£µ«Êǿͻ§¶ËµÄÊ±Çø²»ºÃ´¦Àí¡£±ÈÈ磺ÓÐÓû§µÄÇé¿öºÍÎÞÓû§µÄÇé¿ö¡£ÓÐÓû§µÄÇé¿öÏ£¬¿ÉÒÔ¿¼ÂÇÈÃÓû§×ÔÐÐÉèÖÃËùÔÚµÄÊ±Çø¡£¶øÎÞÓû§µÄÇé¿öÏ£¬ÈçºÎ»ñµÃÊ±ÇøÓв»Í¬µÄ×ö·¨¡£×î¼òµ¥µÄ£¬¾ÍÊÇĬÈϿͻ§Ê±Çø¡£±ÈÈ磬uliwebÖпÉÒÔÉèÖÃGLOBAL/LOCAL_TIME_ZONE£¬È»ºóʹÓÃdate.to_local()À´½«Ò»¸öʱ¼äתΪLOCAL_TIME_ZONEËùÖ¸¶¨µÄÊ±Çø¡£ÁíÍâÔÚstackoverflowÕÒµ½ÓÐÀàËÆµÄÎÊÌ⣬±ÈÈçÕâ¸ö£¬ËüµÄ°ì·¨¾ÍÊÇͨ¹ýä¯ÀÀÆ÷¶ËÖ´ÐÐÒ»¶ÎjavascriptÀ´±ÈÈçÓëUTCµÄ²îÒìÀ´»ñµÃÊ±Çø²îÒ죬ÕýºÃÒ²ÊÇʹÓÃGMT +|-nµÄÐÎʽ¡£Æä¹Ø¼üµÄjs´úÂëÊÇ£º
<scripttype="text/javascript">
$(document).ready(function(){
if("<?php echo $timezone; ?>".length==0){
var visitortime =new Date();
var visitortimezone ="GMT "+-visitortime.getTimezoneOffset()/60;
$.ajax({
type:"GET",
url:"http://domain.com/timezone.php",
data:'time='+ visitortimezone,
success:function(){
location.reload();
}
});
}
});
</script>
ÕâÊÇphpµÄÀý×Ó£¬ºÜÈݸÄΪÆäËüµÄ³ÌÐòÐÎʽ¡£¹Ø¼üµÄµØ·½¾ÍÊÇ£ºvisitortime.getTimezoneOffset()/60 £¬²¢ÇÒÔڵõ½Ê±ÇøºóÔÙ×Ô¶¯Ë¢Ð£¬È»ºó½«Öµ±£´æµ½sessionÖС£
¼òµ¥×ܽáһϣ¬Í¨¹ýÉèÖÃGLOBAL/TIME_ZONE¿ÉÒÔÉèÖ÷þÎñÆ÷¶ËÈÕÆÚ¡¢Ê±¼äµÄÉú³É£¬±ÈÈçuliormµÄ×Ô¶¯ÈÕÆÚ¡¢Ê±¼äµÄÉú³É¡£ÆäËüµØ·½µÄÈÕÆÚ£¬Í¨¹ýʹÓÃdate.pyÖеÄAPI¡£½¨Òéºǫ́ͳһʹÓÃUTCÈÕÆÚ£¬¼òµ¥ÔÚuliwebÖÐÅäÖÃÈçÏ£º
[GLOBAL]
TIME_ZONE = 'UTC'
ͬʱҪ°²×° 'uliweb.contrib.timezone', ·ñÔò²»Æð×÷Óá£
¶ÔÓÚ¿Í»§¶ËµÄÊ±Çø´¦Àí£¬Óм¸ÖÖ·½·¨£º
1. ÏÈÉèÖÃGLOBAL/LOCAL_TIME_ZONEµÄÊ±Çø£¬È»ºóʹÓÃdate.to_local(datetime)À´×Ô¶¯×ªÎªLOCAL_TIME_ZONEµÄÊ±Çø£¬µ«ÕâÖÖÒ²ÊÇÏ൱Óڹ̶¨µÄÊ±Çø£¬²»ÄܺÜÁé»îµÄ×ÔÊÊÓ¦¡£
2. ÔÚÉè¼ÆÉÏ£¬ÎªÃ¿¸öÓû§Ìí¼ÓÒ»¸öÊ±ÇøÑ¡ÔñµÄ×ֶΣ¬ÈÃÓû§×ÔÐÐÉèÖá£ÕâÑùÔÚÕ¹Ê¾Ò³ÃæÖУ¬¸ù¾ÝÓû§µÄÊ±ÇøÖµÀ´×ª“QÊ±ÇøÏÔʾ¡£
3. ²ÉÓÃjsÔÚǰ¶Ë̽²âµÄ°ì·¨£¬½«Ç°¶ËµÄÊ±ÇøÌ½²â³öÀ´£¬²¢±£´æÔÚsessionÖУ¬ºóÐø´¦ÀíÒÔ´ËΪ¿Í»§¶ËÊ±ÇøµÄ´¦Àí¡£
ͬʱ»¹ÓÐÒ»¸öҪעÒâµÄ£¬ÄǾÍÊÇÓû§ÉÏË͵ÄÈÕÆÚÐÅÏ¢µÄ´¦Àí¡£ÒòΪËüÒ²ÊDz»´øÊ±ÇøµÄ£¬ËùÒÔÒª¸ù¾ÝÇ°ÃæµÄ·½Ê½Ä¬ÈÏΪij¸ö¿Í»§¶ËÊ±ÇøÔÙ½øÐд¦Àí¡£
Àà±ð£ºUliweb ²é¿´ÆÀÂÛ
½ñÌì°ÑplugsÖеÄÂÛ̳½øÐÐÁËһЩÓÅ»¯£¬ÆäÖÐÏëʹÓÃuliwebÖÐÔç¾ÍÄÚÖõÄtimesince.pyÄ£¿é¡£Õâ¿éÐèÒªi18nµÄÖ§³Ö¡£ÓÚÊÇʹÓãº
uliweb i18n -l zh_CN --uliweb
À´ÔËÐС£½á¹û±¨´í¡£ÆäÖ÷ÒªÔÒòÊÇtimesinceÖÐʹÓÃÁ˸´ÊýÐÎʽµÄi18nº¯Êýungettext¡£¶øuliwebʹÓõÄpygettext.py²»Ö§³Ö¡£
pygettext.pyÊÇpythonÔÚtoolsĿ¼ÏÂ×Ô´øµÄÒ»¸öÄ£¿é£¬¿ÉÒÔÓÃËüÀ´´ÓpythonÔ´ÂëÖгéÈ¡·Òë×Ö·û´®£¬ËüÖ§³ÖÃüÁîÐУ¬´úÂëÒ²²»ËãºÜ¸´ÔÓ¡£ËùÒÔÔÚuliwebÖÐÌṩÁË´¿pythonµÄÃüÁîÐй¤¾ß¡£²»¹ýuliwebΪÁËÈÃÆä¿ÉÒÔÖ§³ÖÄ£°åºÍiniÎļþ£¬ÐÞ¸ÄÁËpygettextÔ´Â룬ËùÒÔºÍpython×Ô´øµÄ»¹²»ÍêȫһÑù¡£Ðí¶àÆäËüµÄpythonÏîÄ¿ÊÇʹÓÃxgettext¹¤¾ßÀ´´¦Àí¡£ÒòΪpygettext.py²»Ö§³Ö¸´ÊýµÄ·Òë´®£¬ÎÒ²éÁËһϣ¬Ö÷񻂿±ð¾ÍÊǶÔÓÚ¸´Êý£¬ÔÚpoÎļþÖÐÊÇÕâÑùµÄ£º
msgid "month"
msgid_plural "months"
msgstr[0] "ÔÂ"
msgid "month"
msgstr "ÔÂ"
Àà±ð£ºUliweb ²é¿´ÆÀÂÛ







