webpy源码阅读之HelloWorld

使用过Django和web.py,只是一直没有好好深入学习过,Django使用时间比较长,不过Django庞大了点,不适合我这种没耐心的人去学习,所以选择了web.py。 Hello World! 先看下web.py官方cookbook的“Hello World!”例子 import web urls = ("/.*"), "hello") app = web.application(urls, globals()) class hello: def GET(self): return 'Hello, world!' if __name__ == "__main__": app.run() 在例子中可以看到app.run()是启动了服务,而app的是application的一个实例,初始化工作是web.application(urls, globals()),就拿这个做入口,来看下application类的源码吧。 初始化 初始化的流程: 初始化mapping 把_load和_unload变成钩子加入到processors 把Reloader和reload_mapping变成钩子加入到processors 载入main所在模块 init的参数有三个,第一个mapping,上面例子中的urls;第二个fvars,例子中的globals(),globals()是python自带的一个函数,其返回值是全局名字空间,包括了函数、类、导入模块等等,是一个字典类型;第三个autoreload,是否允许自动重新载入。 mapping初始化 self.init_mapping(mapping) def init_mapping(self, mapping): self.mapping = list(utils.group(mapping, 2)) 最后mapping的形式会是[[‘1’,‘2’],[‘1’,‘2’]]这样,这边就可以理解urls列表的样式了。 _load和_unload变成钩子加入到processors 关于钩子和处理器详见官网。 self.add_processor(loadhook(self._load)) self.add_processor(unloadhook(self._unload)) loadhook函数的作用就是在执行其参数传入的函数前执行一些操作,unloadhook则是在其后执行一些操作。这两个都类似于python的decorator。而_load和_unload则是将application实例本身加入web.ctx.app_stack或从其中移除。 如果autoreload不为True则初始化就到此为止了。在初始化的时候,如果autoreload为None,则回去参数读取web.config内的debug的值,默认为False,所以如果autoreload参数没有传入,一般都是不会自动加载,后面操作不会再去进行了。 Reloader和reload_mapping变成钩子加入到processors 和第二步相似,reload_mapping就是用来从新载入主的app,并初始化mapping。而Reloader则是在检查磁盘上任何模块是否有变化,如果有则重新加载。 重新import 通过main获取主app所在的模块名称和所在文件名,然后通过文件名重新import。这步还是简单的,不过代码值得一看,可以学好如sys.modules、getattr()及__import__()的用法。 启动服务 def run(self, *middleware): return wsgi.runwsgi(self.wsgifunc(*middleware)) run函数调用wsgi模块的runwsgi函数,在hello world中就是启动一个http simple服务。具体内容等看到wsgi模块和httpserver模块再说了。

April 3, 2014

Django+apache+mod_wsgi部署

一、安装: 安装Apache、Python、Django、mod_wsgi、项目所需的依赖(数据库驱动、第三方库等) 二、项目设置: 1、把整个项目放到服务器上 2、改变DEBUG配置,修改settings.py文件的DEBUG属性 DEBUG=False 3、数据库连接配置,修改settings.py的数据库连接配置 4、修改允许访问的HOST,修改settings.py的ALLOWED_HOSTS=['*'] 5、添加404和500页面,把页面文件放到template目录下 6、静态文件配置,修改settings.py的STATIC_ROOT的值,此属性的值是部署后静态文件保存的目录。 7、收集静态文件,运行命令:python manage.py collectstatic。django会把STATICFILES_DIRS中配置的目录下的所有文件和文件夹拷贝到STATIC_ROOT配置的目录下。 8、修改与settings.py同目录下的wsgi.py,添加如下代码: import sys sys.path.append("/home/myproject") "/home/myproject"替换成项目的根目录,这段代码的作用是把项目的路径添加到python的环境变量下,使得os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myproject.settings")这句断码可以正确查找到项目的settings.py文件。 三、Apache配置: 修改配置文件httpd.conf 1)、配置Apache加载mod_wsgi LoadModule wsgi_module modules/mod_wsgi.so 2)、配置静态文件映射 Alias URL-path file-path|directory-path 如Alias /static "/home/myproject/static" 3)、apache虚拟主机(VirtualHost)配置 <VirtualHost *:80> DocumentRoot /ytxt/surveyproject ServerName www.feiyuejihua.com WSGIScriptAlias / /ytxt/surveyproject/surveyproject/django.wsgi ErrorLog /ytxt/log/feiyuejihua.log <Directory /> Order deny,allow Allow from all </Directory> <Directory /apache> Allow from all </Directory> </VirtualHost> DocumentRoot:为项目的根路径 ServerName:项目的域名 ErrorLog:为异常日志路径 WSGIScriptAlias:映射一个URL到一个文件系统地址并委派目标文件为WSGI Script 四、启动服务器: 启动:httpd -k start 重启:httpd -k restart 关闭:httpd -k stop 或 httpd -k shutdown

September 2, 2013

Django基础入门

安装: 下载后运行python setup.py install或pip安装 创建项目: 进入准备创建项目的目录下,运行命令: django-admin.py startproject xxx django-admin.py在windows(其他系统也可能因为安装不同而不在环境变量里)下不能直接调用,可以将其放入环境变量中或是去python的安装目录下的Lib\site-packages\django\bin下运行。windows下没有关联文件类型的话,上面的命令前需要加上ptyhon,即 python django-admin.py startproject xxx 创建的项目结构如下: projectname/ |- manage.py |- projectname/ |- __init__.py |- settings.py |- urls.py |- wsgi.py 运行项目: python manage.py runserver 默认端口号是8000,可以指定端口号运行 python manage.py runserver 8080 访问http://127.0.0.1:8000/可以显示django的默认页面 这种运行方式并非部署,只是运行Development Server,只能可靠的处理一次单个请求。在此模式下代码或配置的变动都会立即生效。 创建APP: python manage.py startapp xxx APP结构如下: APPname/ |- __init__.py |- models.py |- tests.py |- views.py 进入项目的settings.py下,把新建的APP加入到INSTALLED\_APPS 中,例如: INSTALLED_APPS = ( 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.sites', 'django.contrib.messages', 'django.contrib.staticfiles', # Uncomment the next line to enable the admin: # 'django....

August 29, 2013