在Django模板中使用css、javascript 等静态文件

2010年7月27日

在使用Django开发的Web项目中是避免不了使用css、javascript、js等静态文件的,而对于这些静态文件的处理,django官网这样写:Django itself doesn’t serve static (media) files, such as images, style sheets, or video. It leaves that job to whichever Web server you choose.就是说django本身不处理类似于图片、样式表、视频等静态文件,它将此项工作交给了你选择的Web服务器。

在网上搜索到的django项目处理静态文件的示例中,大家似乎都在使用如下的方法让django处理静态文件:

?View Code PYTHON
urlpatterns += patterns('',
      (r'^static/(?P.*)$', 'django.views.static.serve',
      {'document_root':  settings.MEDIA_ROOT}),
    )

而对于django.views.static.serve方法,django官网说得很清楚:Using this method is inefficient and insecure. Do not use this in a production setting. Use this only for development.就是说这种方法是低效且不安全的,不要在生产环境使用此方法,只在开发环境使用。

这时对于静态文件的处理,我们只能使用我们选择的Web服务器来处理了。比如使用nginx服务器的话,可以如下设置:

先设置settings.py,如下,

设置settings.py

设置settings.py

然后设置nginx的相应网站配置部分,如下,

配置nginx

配置nginx

如此配置以后,就可以让web服务器来高效的处理静态文件,而让django来处理动态内容。

分享家:Addthis中国

admin Web , ,

关于域名续费

2010年7月26日

我的两个域名zhangwenjie.net、tao690.com明天就到期了,再不续费就说不过去了。我的域名是在godaddy.com注册的,考虑到相对较长的域名注册、续费时间多少会有助于SEO,所以决定续费两年。

在godaddy.com上操作后,我这两个域名续费两年总共需要$49多美金,折算成RMB将近350多元,不行,一定要找个优惠码,尽量多优惠点。在网上找来找去,总算找到一个QUEEN3,优惠后将近$42,就这样吧,优惠算差不多了。

然后选择支付宝付款,在付款过程中又遇到网上支付单笔超出最大限额的问题,又到网银上设置一番,然后继续支付,总之,折腾了许久后,总算续费成功。

希望在这一个中,努力经营好我的两个域名,扩大影响力。加油。

分享家:Addthis中国

admin 生活点滴 , ,

尝试一下WordPress的导出功能

2010年6月30日

  在GAE上开了个新博客http://zhangwenjienet.appspot.com,尝试将此博客的数据导出并导入到新博客。

  结果在使用导出功能时出错,看了一下,原来是这个功能和codbox插件有冲突,只能暂停wp-codebox插件后再导出。

  

分享家:Addthis中国

admin Web ,

安装RHEL 64位系统遇到的问题

2010年6月3日

周末尝试在自己的Windows Server 2008 R2系统上用vmware player安装RHEL  5.5 X86_x64虚拟机,结果遇到了一些问题,现记录如下。

安装时比较顺利,一切和安装i386系统没有什么区别。问题出在安装完成重启时。开始时系统在“Starting udev”处过不去,过了有十分钟,然后显示启动udev服务超时,但仍卡在此处,此时系统起不来,重试几次仍无法启动。此种情况在安装i386版本的虚拟机上没有出现过。

后来在Google了一下,发现其他人也有类似问题,并发现主要有两种解决方法(只可惜在我的机器都没有成功)。

  • 第一种解决方案。 将/etc/udev/rules.d/下的所有以.rules结尾的文件改名,让系统自己去识别硬件启动。
    udev

    udev下的*.rules文件

    按照此方法改名后,“Starting udev”是可以过去了,但系统启动其他服务非常之慢,几乎无法忍受,最后系统在”Starting auditd”服务处又卡住,无法启动。重试几次也不行。在我的这个环境下,此方法似乎行不通。

  • 第二种解决方法。修改虚拟机CPU数量为1,并在虚拟机/etc/grub.conf配置文件kernel一行最后添加clocksource=acpi_pm参数,vware的KB文章有解释。

尝试使用此方法,在添加了此参数后,发现没有起作用,和没有添加此参数时系统启动没有两样,“Starting udev”仍过不去。而且我的虚拟机CPU设置数量是一个。

最终Google了很长时间,反复尝试各种方案,最终无法正常启动RHEL 5.5 x86_x64系统,然后无奈删除之。

如果的有哪位网友知道解决方法,望不吝赐教。谢谢。

分享家:Addthis中国

admin Linux , , ,

Python环境的easy_install配置

2010年5月8日

  对于Python环境下库的安装,无疑使用easy_install最方便。这里我们详细说一下如何配置easy_install,这个方法对Linux和windows平台均适用。

  安装easy_install

  存在一个叫ez_setup.py的脚本,使easy_install的安装相当方便。你可以从网上找此脚本,或从这里下载ez_setup。然后运行以下的命令安装easy_install:

?View Code PYTHON
      /usr/local/python265/bin/python  ez_setup.py

  稍候你就会看到安装成功的提示。
  将easy_install放置到系统路径中

  安装easy_install完成后,要成功运行easy_install来安装库文件一般需要在/usr/local/python265/bin/目录下运行easy_install,或者要输入长长的路径名。为了可以在任何目录下运行此工具来安装python库,我们需要将此路径放置到PATH环境中去。方法如下是,修改.bashrc文件(这是一个隐藏文件),在文件最后添加如下代码:

?View Code PYTHON
      export PATH=$PATH:/usr/local/python265/bin 

  然后再执行 source .bashrc就可以了。

  实例演示

  安装并配置好easy_install后,让我们试验一下easy_install安装库文件的方便之处。比如我们想安装MySQL-python库文件,在任意路径下这样输入:

?View Code PYTHON
      easy_install  MySQL-python
?View Code PYTHON
  然后会看到如下显示:
easy_install安装MySQL-python

easy_install安装MySQL-python

  可以看到easy_install成功安装了MySQL-python库。

  

  原创文章如转载,请注明:转载自张文杰的博客http://zhangwenjie.net ]

  本文链接地址:http://zhangwenjie.net/archives/388.html

分享家:Addthis中国

admin Web ,

Linux下Python 2.6.5安装MySQL-python的问题

2010年5月8日

  由于RHEL 5.3系统自身带有Python2.4.3,且系统中的一些服务依赖此版本的Python,所以又在/usr/local/python265目录下安装了一个Python 2.6.5版本的Python。

  由于想在Python环境下连接MySQL读数据,且我的RHEL 5.3机器源代码安装的MySQL 5.1.36。这下问题来了,且似乎没有解决办法。

  当我使用Python的easy_install安装MySQL-python包时,一切似乎正常,没有出错。但我在交互环境下import MySQLdb时,出错如下:

MySQL-python导入错误

MySQL-python导入错误

  错误告诉我libmysqlclient_r.so.15没有找到。我在我安装MySQL的目录下搜索后,发现有libmysqlclient_r.so.16文件,但没有错误提示的那个文件。我将这个16的文件罗链接到/usr/lib目录下也没有效果。在网上找了找,发现也有人遇到此问题,他的解决办法是删除当前安装的高版本MySQL,然后重新安装一个MySQL 5.0的,可以编译出libmysqlclient_r.so.15的MySQL版本。除此之外,没有找到其他的解决办法。

  为了一个MySQL-python包,重新安装一个低版本的MySQL实在划不来。我想说的是MySQL-python包由于严重依赖libmysqlclient_r.so.15文件,是不是导致只能使用MySQL 5.0版本,其它的或高或低的MySQL将无法使用?或许去找一个libmysqlclient_r.so.15放到/usr/lib目录下,以迎合MySQL-python的要求来连接MySQL服务器,不知道是否可行?我没有办法试验。

  另外,除了使用MySQL-python,在Python环境下好像再没有其它方式连接MySQL。或许是我孤陋寡闻,希望有办法的朋友不吝赐教。谢谢!

  

  原创文章如转载,请注明:转载自张文杰的博客http://zhangwenjie.net ]

  本文链接地址:http://zhangwenjie.net/archives/384.html

分享家:Addthis中国

admin Web , ,

Visual Studio 2010初体验

2010年4月17日

  从朋友那里借到Visual Studio 2010旗舰版安装盘,然后在自己的Server 2008 R2系统上安装体验了一下。

  先大初看一下Visual Studio 2010旗舰版安装完成后,会在系统中安装多少个东东:

  

vs2010

vs2010

  这是启动界面:

  

vs2010启动界面

vs2010启动界面

vs2010启动界面

vs2010启动界面

  让我们用随Visual Studio 2010带的F#写个小程序:

F#小程序

F#小程序

  然后运行之:

F#小程序

F#小程序

  我们再来看一下Visual Studio 2010的智能提示的改进:

Visual Studio 2010智能提示

Visual Studio 2010智能提示

 

  大家能看出相比Visual Studio 2008的改进了吗?它不再列出所有的成员然后导航到你要的成员,而是只列出你想要的成员,比以前精简多了。

  今天Visual Studio 2010体验先写到这里,以后会不定期与大家分享更多Visual Studio 2010使用情况。

  

  原创文章如转载,请注明:转载自张文杰的博客http://zhangwenjie.net ]

  本文链接地址:http://zhangwenjie.net/archives/372.html

分享家:Addthis中国

admin Visual Studio , ,

Linux系统下信号总结

2010年4月15日

  在Linux系统中,需要对一事件的发生通知给正在运行的进程。信号就是这种通知的工具,它的显著特点是:不是用于将数据发送给某一进程,而是通知一个进程某一个特定事件的发生。

  信号拥有自己特定的名字,均以SIG开始。它们在头文件中被定义为一个正整数,称为信号编号(signal number)。

  • SIGHUP:当终端发现断线情况发送给与控制终端相连的控制进程的信号,或控制进程运行结束时发出的信号。它通常用来通知守护进程重新读取系统配置文件。
  • SIGINT:进程中断信号,可以用来中断一个正在运行的进程。通常是从终端输入的中断指令,如CTRL+C或Delete。
  • SIGQUIT:用于中断前台进程组中的所有进程的信号。由终端输入的退出指令Ctrl+\产生。这一信号在中断进程的同时,还将产生一个core文件。
  • SIGILL:执行非法硬件指令时产生的错误。
  • SIGTRAP:跟踪陷阱信号。
  • SIGIOT:I/O错误信号。
  • SIGBUS:系统总线错误时产生的信号。
  • SIGFPE:浮点运算中发生溢出错误时产生的信号。
  • SIGKILL:可用于终止任何一个进程的信号,只能由系统管理员发出,是不可捕捉种被忽略的信号之一。
  • SIGUSR1:用于用户自定义的预留信号,可由用户在应用程序中自行定义。
  • SIGSEGV:使用非法内存地址所产生的信号。
  • SIGUSR2:同SIGUSR1。
  • SIGPIPE:当对一个读进程已经运行结束的管道执行写操作时产生的信号。
  • SIGALRM:由alarm函数设定的时间段终止时,会产生此信号。
  • SIGTREM:调用kill(1)命令时缺省产生的信号。
  • SIGCHLD:当一个子进程结束或中断时,用通知其父进程的信号。必要时,父进程可以通过这一信号来了解子进程状态变化及结束状态信息。但在大多数情况下,这一信号将被忽略。
  • SIGCONT:是使已被中断的进程继续执行的信号。当此信号为某一特定进程产生后,如果此时该进程没有被中断,将不会有任何操作发生;但如果该进程是一中断了的进程,即使SIGCONT被阻塞或被忽略,此进程也将会继续进行。
  • SIGSTOP:中断进程的信号。它是一个作业信号,同时也是不可被捕捉和不可被忽略的信号之一。
  • SIGTSTP:交互式的中断信号。通常是在输入中断键Ctrl+Z时,由终端驱动器产生。
  • SIGTTIN:当一个后台进程需要从终端读取数据时,终端驱动器产生的信号。当读取数据的进程忽略或阻塞这个信号,或读取数据的进程所在的进程组是孤立进程组时,信号不会产生,并且读操作将发生错误返回,将errno设置成EIO。
  • SIGTTOU:当一个后台进程需要向终端写入数据时,终端驱动器产生的信号。当写入数据的进程忽略或阻塞这个信号,或写数据的进程所在的进程组是孤立进程组时,信号不会产生,并且写操作将发生错误返回,将errno设置成EIO。与SIGTTIN不同的是,进程可以选择对控制终端进行后台写。如果后台写不被允许则同SIGTTIN信号一样。
  • SIGURG:套接字上出现紧急情况时产生的信号。
  • SIGXCPU:超出CPU时间限制时产生的信号。
  • SIGXFSZ:超出文件大小时产生的信号。
  • SIGVTALRM:虚拟定时器报警信号。
  • SIGPROF:Profiling定时器报警信号。
  • SIGWINCH:终端窗口改变时产生的信号。
  • SIGIO:表示某个特定文件描述符上可以进行I/O操作的信号。
  • SIGPWR:电源失效的信号。
  • SIGABRT:调用abort函数时产生的信号,将会使进程非正常结束。
  • SIGEMT:实现性定义硬件错误发生时产生的错误。

  其中,SIGCHLD、SIGCONT、SIGSTOP、SIGTSTP、SIGTTIN、SIGTTOU这六个信号被称为作业控制信号,它们的共同特点是:都是用于协调和组织各进程运行的,即用于实现所谓作业控制的。

  

  原创文章如转载,请注明:转载自张文杰的博客http://zhangwenjie.net ]

  本文链接地址:http://zhangwenjie.net/archives/367.html

分享家:Addthis中国

admin Linux , ,

Google搜索新界面

2010年4月11日

  一直习惯使用Google在网上搜索内容,即使Google已经”离去”。前一段时间在网上看到新闻说Google要放出新的搜索界面,使用一段js脚本可以访问。不过,本人一直没有实验成功。

  不过,今天访问Google搜索,发现界面确实是更换成大家一直期待的新界面:

Google新界面

Google新界面

   可以看到,Google首页的搜索框及按钮的样式改变了,似乎比以前好看了。只是首页下方的内容显示在IE8下面不正常,发生文字重叠的现象,不知道其它浏览器有没有此现象。

   可能最重要的改变是搜索内容页面的改变:

Google新界面

Google新界面

  搜索内容面面的左出现了所有结果、资讯、更多等内容。还有:时间、更多搜索工具等选项。同时,现在Google搜索显示了客户端的位置,比如北京。点击此信息,还可以更改:

Google位置

Google位置

  Google搜索内容页面左边提供了更多工具:

Google左边工具

Google左边工具

  总之,这次Google搜索页面更改提供了更多选项,可以更多方便进行精准、多方式的搜索。

  

  原创文章如转载,请注明:转载自张文杰的博客http://zhangwenjie.net ]

  本文链接地址:http://zhangwenjie.net/archives/358.html

分享家:Addthis中国

admin 互联网 ,

也谈Zend构架与Smarty的集成配置

2010年4月11日

  Zend架构是一个成熟、强大的PHP Web MVC的开发框架,而smarty是一个灵活、强大的模板引擎。如果将两者结合起来,将会使PHP的Web开发轻松不少,且上手也快。

  对于Zend构架与Smarty的集成配置,网上也有不少文章说到,但我自己觉得都不够完整,且并不是真正、深入集成。我这里所说的方法,是彻底的集成,程序写法是Zend本身的带的view写法是一样的。

  首先说一下总体目录结构:

Zend目录结构

Zend目录结构

  其中,application目录中包括config目录、controllers目录、models目录等;cache目录用于smarty缓存;compile目录用于smarty编译目录;config目录放置smarty的配置;library目录放置Zend框架库及smarty库;public目录放置引导文件及js、css、images等公共文件;template目录放置.tpl模板文件。

  首先修改配置文件来支持smarty模板库(就是application/configs/application.ini文件),添加如下内容:

  

  smarty.class_path = "Smarty/Smarty.class.php"
  smarty.left_delimiter = "<*"
  smarty.right_delimiter = "*>"
  smarty.template_dir = APPLICATION_PATH "/../template"
  smarty.compile_dir = APPLICATION_PATH "/../compile"
  smarty.cache_dir = APPLICATION_PATH "/../cache"
  smarty.cache_lifetime = 600
  smarty.caching = 0
  smarty.config_dir = APPLICATION_PATH "/../config"

  第二,创建一个模板类文件Template,里面旋转初始smarty库的内容。这个文件里的类名我写为Zend_Templater,我把它放到library/Zend/下,这样它就会被自动加载:

<?php
class Zend_Templater extends Zend_View_Abstract
    {
        protected $_path;
        protected $_engine;
 
        public function __construct()
        {
           $config = new Zend_Config_Ini(APPLICATION_PATH.'/configs/application.ini', 'production');
           require_once $config->smarty->class_path;
 
            $this->_engine = new Smarty();
            $this->_engine->template_dir = $config->smarty->template_dir;
            $this->_engine->compile_dir = $config->smarty->compile_dir;
            $this->_engine->cache_dir = $config->smarty->cache_dir;
            $this->_engine->cache_lifetime = $config->smarty->cache_lifetime;
            $this->_engine->caching = $config->smarty->caching;
            $this->_engine->left_delimiter = $config->smarty->left_delimiter;
            $this->_engine->right_delimiter = $config->smarty->right_delimiter;
            $this->_engine->config_dir  = $config->smarty->config_dir;
        }
 
        public function getEngine()
        {
            return $this->_engine;
        }
 
        public function __set($key, $val)
        {
            $this->_engine->assign($key, $val);
        }
 
        public function __get($key)
        {
            return $this->_engine->get_template_vars($key);
        }
 
        public function __isset($key)
        {
            return $this->_engine->get_template_vars($key) !== null;
        }
 
        public function __unset($key)
        {
            $this->_engine->clear_assign($key);
        }
 
        public function assign($spec, $value = null)
        {
            if (is_array($spec)) {
                $this->_engine->assign($spec);
                return;
            }
 
            $this->_engine->assign($spec, $value);
        }
 
        public function clearVars()
        {
            $this->_engine->clear_all_assign();
        }
 
        public function render($name)
        {
            return $this->_engine->fetch(strtolower($name));
        }
 
        public function _run()
        { }
    }
?>

  其实也可以不放置到Zend目录且支持自动加载此文章,请见另一篇文章让Zend框架自己加载自定义的类
  第三,修改引导文件,完成smarty与Zend的集成。修改Zend的引导文件index.php,添加支持smarty的视图类:

  $vr = new Zend_Controller_Action_Helper_ViewRenderer();
  $vr->setView(new Zend_Templater());
  $vr->setViewSuffix('tpl');
  Zend_Controller_Action_HelperBroker::addHelper($vr);

  到这里,已经完成Zend与smarty的集成。这样在controller文件中,可以如下的方式写代码:

  $this->view->name = 'Zend与smarty的集成';

  然后在你的tpl文件中,像如下的方式访问设置的变量:

  <*if $name*>
     <*$name*>
  <*/if*>

  

  原创文章如转载,请注明:转载自张文杰的博客http://zhangwenjie.net ]
  本文链接地址:http://zhangwenjie.net/archives/355.html

分享家:Addthis中国

admin Web , ,