Archive for django

github地址 https://github.com/0x55aa/pytoto 写不下去了,又开始写别的了 我去。 总是做着做着发现东西越来越多。

Continue

在django/conf/__init__.py里,最后一行,settings = LazySettings()。到LazySettings(),继承自LazyObject,django/utils/functional.py里,初始化的时候self._wrapped为object()。LazyObject也设置了__getattr__,不过差不多。回头看LazySettings的__getattr__,开始要执行_setup,然后使用getattr取值。 ---- def _setup(self, name=None): settings_module = os.environ[ENVIRONMENT_VARIABLE],这个在wsgi脚本,或者在manage.py里有设置,就是项目的setting,例如mysite.settings。然后self._wrapped = Settings(settings_module)。Settings应该是设置值的。 ---- Settings集成自BaseSettings,BaseSettings里只有一个__setattr__方法。

Continue

urlconf = settings.ROOT_URLCONF urlresolvers.set_urlconf(urlconf) resolver = urlresolvers.RegexURLResolver(r'^/', urlconf) set_urlconf,如果没有设置urlconf的文件路径,保存;有,删掉。下边生成 resolver对象。 resolver_match = resolver.resolve(request.path_info) callback, callback_args, callback_kwargs = resolver_match request.resolver_match = resolver_match 找到RegexURLResolver里的resolve,match = self.regex.search(path)是匹配上边的 r'^/',也就是path_info必须是’/‘开头,如果不匹配直接404。然后,生成新地址为去掉’/‘剩下的。获得url_pattern

Continue

WSGIHandler继承自BaseHandler,BaseHandler初始化的时候_request_middleware和其他moddleware变量都设置为None。 在WSGIHandler中,先通过判断_request_middleware为None,执行load_middleware。 在load_middleware里根据在settings.MIDDLEWARE_CLASSES里的配置导入所有middleware,并判断class里边包含的方法,分别插入相应的middleware列表里。现在_request_middleware是一个列表。load_middleware结束 回到WSGIHandler, set_script_prefix(base.get_script_name(environ)),get_script_name从environ得到SCRIPT_NAME,如果设置settings.FORCE_SCRIPT_NAME,回直接返回settings.FORCE_SCRIPT_NAME,默认为None。django竟然还提供这种碉堡的功能。。。s

Continue

django在你执行python manage.py runserver的时候,在修改代码后会自动重启,研究一下是怎么实现的。 django/utils/autoreload.py main(),我只看python_reloader,RUN_MAIN通过搜索源代码,发现只有在这个文件有两处,一个是下边else执行时设置为true。也就是说开始可能没有设置值,先执行restart_with_reloader()。精彩到了。。设置新的environ,RUN_MAIN为True。用os.spawnve启动新的reloader()进程,现在RUN_MAIN为True!然后在restart_with_reloader这个父进程里一直在等待判断子进程是否返回exit code,如果不是3就退出循环结束了。 在的reload进程执行new_thread(),也就是启动一个server。下边执行reloader_thread() ---- reloader_thread()里边 先执行ensure_echo_on(),先判断termios是否导入成功,termios是一个py模块,是u

Continue

这次从头看起。 --- 从项目的manage.py看,只有execute_from_command_line(sys.argv)这一个,sys.argv后边看到传不传一样。在django/core/management/__init__.py最后,ManagementUtility对象初始化,保存命令参数和项目路径。execute前边进行参数的解析,设置参数,最后一行 self.fetch_command(subcommand).run_from_argv(self.argv) 这个功能是执行相应的命令。 --- 先看fetch_command(),里边get_commands,取得django自带的命令和用户项目写的命令,返回map{命令:app_name},django自带目录的是django/core/management/commands,app_name为django.core。还要过滤目录下的__init__.py。。。 下一步在fetch_command通过返回的字典获得app_name,下边就是根据app_name导入command。django通过判

Continue

使用django写的微信应用,几个月前了,现在又看了一下。 当时想做一个宠物照片分享,信息查询的应用。现在发现微信应用不适合做这种功能这么全的,要依赖网页那样没意思了。接触微信多了也发现这个手机app也没什么意思,就用来做宣传什么的不错,再一个做个抽奖,定时发文章的那种应用比较适用。 用django写主要是操作数据库什么的也方便,其实就一个url请求,官方还有一套验证,不过如果url足够保密,不验证也无所谓。 然后解析xml,按照不同的动作做不同的事。已经实现的功能中,最大的一个是能够搜索宠物店或者宠物医院的。 数据来自百度地图,让同学帮忙抓的,直接用百度地图的开发api,抓取限制足够轻松的抓取完。 我用的结巴分词,分析的地址,店名数据,制作搜索词。用的whoosh检索。 这两个放在sae上时,不能创建文件,必须制定一个目录,由于店面不会长变,结巴分词的也不更新,所以我直接在项目下建的目录,然后本地生成,直接svn提交到sae上。whoosh是直接用api的很方便很爽,没有选择一些集成到django的插件,感觉配置什么的很麻烦也不爽,不如直接下载下代码放到项目目录下直接

Continue

在settings里加入 <pre lang="python">if 'test' in sys.argv: DATABASES['default'] = { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': 'test_db' }</pre> 回加快数据库的生成操作,用time试了一下,效果非常显著。我写了一个测试,从显示看创建数据库用了18秒,占了百分之九十九以上,当然这个比重没啥用。 每次都要在setUp()里边创建数据,然后再测试,不知道有没有好方法,可以在测试开始就创建一个完整数据库,并保证每一个测试类都能保持数据库数据的不变

Continue

在工作时服务器上环境的搭建,做个笔记记录。用到的东西主要有:django,nginx,supervisor,Gunicorn,virtualenv,mysql。 安装就略过了,每一个的文档上有介绍。virtualenv有一个virtualenvwrapper方便操作。 先安装virtualenv,然后在python虚拟环境里边安装django,gunicorn等相关库。 supervisor用来守护django网站启动的进程,默认配置文件添加/etc/supervisor/conf.d/name.conf <pre>[program:code] command=/home/sys/.virtualenvs/%(program_name)s/bin/gunicorn %(program_name)s.wsgi:application -c /home/www/%(program_name)s/%(program_name)s/gunicorn.conf.py user=hg directory=/home/www/%(program_name)s autost

Continue

0 0,今天用到redirectview,查文档,发现在django1.6版本可以直接指定<tt>pattern_name参数来直接指定跳转的url,方便了好多0 0.以前很讨厌在url里引用一大堆东西,我都尽可能写在views里边,至少看起来清楚。</tt> 下面有介绍<tt>get_redirect_url</tt>()只有在url没有设置的时候才会用到pattern_name。doc:https://docs.djangoproject.com/en/1.6/ref/class-based-views/base/#redirectview

Continue