2008年12月27日 | 标签:

转眼又一年过去了,一年没写blog了,今天换了wordpress,新的系统新的起点,原来自己的java版的blog系统打算去掉了,目前服务器比较吃紧,java占用内存太大了。

而blog访问量很小,所以换成wordpress,主要是为了方便,原先的内容已经迁移到新的系统中来了。

每周2篇技术相关的blog,提升自己的战斗力,同时希望对大家也有帮助。

2009年1月6日 | 标签:

最近在搞http://www.game13.net的小游戏采集,需要用到下载图片和下载文件。

在python中可以使用urllib方便的实现图片和flash下载,测试:

import urllib 
url = "http://www.udooo.com/cooperate/qq/images/081128/left.swf
path = "c:/spider/left.swf" 
data = urllib.urlopen(url).read() 
f = file(path,"wb") 
f.write(data) 
f.close()
 

python中还有更简洁的方法:

import urllib 
url = r"http://www.udooo.com/cooperate/qq/images/081128/left.swf
path = r"c:/spider/left2.swf" 
data = urllib.urlretrieve(url,path) 

2009年1月5日 | 标签: , ,

sitemap的重要性就不多说,了解SEO的都知道。

下面说说我在使用google sitemap generator的过程:

1、下载google sitemap generator : https://www.google.com/webmasters/tools/docs/en/sitemap-generator.html#download

2、解压安装 python setup.py install,

在解压目录中有example_config.xml、example_urllist.txt、setup.py、sitemap_gen.py、test_sitemap_gen.py等文件。

3、配置config.xml文件

拷贝一份 example_config.xml 到 ntsky_config.xml

配置ntsky_config.xml的信息:

XML/HTML代码
  1. <site  
  2.   base_url="http://www.ntsky.com/"  
  3.   store_into="/usr/local/tomcat/www/ntsky_cms/sitemap.xml"  
  4.   verbose="3"  
  5.   default_encoding="UTF-8"  
  6.   >  

base_url : 站点

store_into: sitemap.xml文件的路径,这里是存放到了ntsky.com的跟目录下了

XML/HTML代码
  1. <accesslog  path="/usr/local/apache/logs/ntsky.com-access_log"       encoding="UTF-8"  />  

 设置ntsky.com的访问日志为access级别,sitemap generator是读取日志文件进行分析的。日志中的访问信息会生成到sitemap.xml中去。

apache中的设置:

<VirtualHost *.*.*.*:80>
        ServerName www.ntsky.com
        DocumentRoot /usr/local/tomcat/www/ntsky_cms
        ServerAdmin yntsky@gmail.com
        ErrorLog logs/error_ntsky.com_log
        CustomLog logs/ntsky.com-access_log combined
</VirtualHost>

生成的sitemap.xml文件中包含了scripts,和images目录信息,现在需要过滤怎么办呢?

<filter  action="drop"  type="wildcard"    pattern="*/images/*"     />
<filter  action="drop"  type="wildcard"    pattern="*/UserFiles/*"     />

4、执行生成

python sitemap_gen.py –config=ntsky_config.xml

将看到如下信息:

….

Writing Sitemap file "/usr/local/tomcat/www/ntsky_cms/sitemap.xml" with 533 URLs
Notifying search engines.
Notifying: www.google.com
Notification URL: http://www.google.com/webmasters/sitemaps/ping?sitemap=http%3A%2F%2Fwww.ntsky.com%2Fsitemap.xml
Count of file extensions on URLs:
      94  .action
       1  .bmp
      12  .css
      38  .gif
       1  .gz
       5  .htm
     331  .html
       1  .ico
      10  .jpg
      16  .js
      13  .png
       1  .swf
       5  .xml
       5  /
Number of errors: 0
Number of warnings: 0

http://www.google.com/webmasters/sitemaps/ping?sitemap=http%3A%2F%2Fwww.ntsky.com%2Fsitemap.xml  这里会调用google的接口更新sitemap.xml文件。
 

配合crontab,可以使用shell让站点在每天早上凌晨给google提交sitemap.xml文件了。

参考:

https://www.google.com/webmasters/tools/docs/en/sitemap-generator.html

http://www.google.cn/support/webmasters/bin/topic.py?topic=8467

2009年1月5日 | 标签: , , ,

使用了一段时间apache+mod_python的组合,发现问题多多,所以尝试了下apache+fastcgi的组合,下面是整合步骤,注意,下面的目录是www.game13.net站点的路径,大家根据自己的实际情况设置这些路径。

1、安装apache和fastcgi

2、apache中整合fastcgi

LoadModule fastcgi_module modules/mod_fastcgi.so

FastCGIExternalServer /usr/local/python2.5/Django-1.0.2-final/game13/mysite.fcgi -host 127.0.0.1:3033

XML/HTML代码
  1. <VirtualHost 117.21.248.7:80>  
  2.         ServerName www.game13.net   
  3.         DocumentRoot /usr/local/python2.5/Django-1.0.2-final/game13   
  4.         Alias /media /usr/local/python2.5/Django-1.0.2-final/django/contrib/admin/media   
  5.         Alias /css /usr/local/python2.5/Django-1.0.2-final/game13/templates/css   
  6.         Alias /scripts /usr/local/python2.5/Django-1.0.2-final/game13/templates/scripts   
  7.         Alias /images /usr/local/python2.5/Django-1.0.2-final/game13/templates/images   
  8.         Alias /upload /usr/local/python2.5/Django-1.0.2-final/game13/upload   
  9.         RewriteEngine On   
  10.         RewriteRule ^/(css.*)$ /$1 [QSA,L,PT]   
  11.         RewriteRule ^/(media.*)$ /$1 [QSA,L,PT]   
  12.         RewriteRule ^/(images.*)$ /$1 [QSA,L,PT]   
  13.         RewriteRule ^/(scripts.*)$ /$1 [QSA,L,PT]   
  14.         RewriteRule ^/(upload.*)$ /$1 [QSA,L,PT]   
  15.         RewriteCond %{REQUEST_FILENAME} !-f   
  16.         RewriteRule ^/(.*)$ /mysite.fcgi/$1 [QSA,L]   
  17. </VirtualHost>  

我的项目目录在/usr/local/python2.5/Django-1.0.2-final/game13/目录,在该目录下有mysite.fcgi文件。

文件内容如下:

SHELL代码
  1. #!/bin/bash   
  2.   
  3. # Replace these three settings.   
  4. PROJDIR="/usr/local/python2.5/Django-1.0.2-final"  
  5. PIDFILE="$PROJDIR/mysite.pid"  
  6. SOCKET="$PROJDIR/mysite.sock"  
  7.   
  8. cd $PROJDIR   
  9. if [ -f $PIDFILE ]; then   
  10.     kill `cat – $PIDFILE`   
  11.     rm -f – $PIDFILE   
  12. fi   
  13.   
  14. exec /usr/bin/env - \   
  15.   PYTHONPATH="../python:.." \   
  16.   ./manage.py runfcgi socket=$SOCKET pidfile=$PIDFILE  

注意 PROJDIR 目录为django的安装目录。

修改game13中的setting,设置MEDIA_ROOT和TEMPLATE_DIRS

MEDIA_ROOT = ‘/usr/local/python2.5/Django-1.0.2-final/game13′

TEMPLATE_DIRS = (
    # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".
    # Always use forward slashes, even on Windows.
    # Don’t forget to use absolute paths, not relative paths.
    #’./templates’,
    ‘/usr/local/python2.5/Django-1.0.2-final/game13/templates’,
)

 3、启动项目

  • 在项目目录下使用 python manage.py runfcgi method=threaded host=127.0.0.1 port=3033 启动app
  • apachectl start,是否成功大家可以看下apache logs目录下error日志,出现下面的信息即正常启动

[Sun Jan 04 08:16:58 2009] [notice] Digest: generating secret for digest authentication …
[Sun Jan 04 08:16:58 2009] [notice] Digest: done
[Sun Jan 04 08:16:58 2009] [notice] FastCGI: process manager initialized (pid 16566)
[Sun Jan 04 08:16:58 2009] [warn] No JkShmFile defined in httpd.conf. Using default /usr/local/apache/logs/jk-runtime-status
[Sun Jan 04 08:16:58 2009] [notice] Apache/2.2.8 (Unix) PHP/5.2.5 mod_fastcgi/2.4.6 mod_jk/1.2.25 configured — resuming normal oper
ations

2009年1月4日 | 标签:

JS/CSS文件大,用户访问站点的时候需要下载JS/CSS的时间长就会感觉慢,有的甚至由于CSS的文件而造成页面初始打开很凌乱。

我们怎么提高用户下载JS/CSS的速度呢?

1、我们无法改变用户的网络状况,只有自己网站使用更快的带宽或者使用更强的服务器,使用户访问我们的时候感觉很快。

2、对JS/CSS文件进行压缩,由于文件较小,用户下载的时间就很短。

解决方案1,需要花费比较多的money,方案2实现比较简单,而且效果也明显。

下面我们介绍使用YUI Compressor进行JS/CSS压缩

1、下载yuicompressor http://www.julienlecomte.net/yuicompressor/

2、使用ant编译得到yuicompressor-x.y.z.jar的包,进入yuicompressor-x.y.z目录运行ant -f build.xml

3、在build目录下得到yuicompressor-x.y.z.jar的包,使用java -jar yuicompressor-2.4.2.jar in.js -o out.js

看下out.js的源文件就会发现去掉了注释空格等信息。

更多yui compressor的帮助请查看 http://www.julienlecomte.net/yuicompressor/README

 

 

2008年12月31日 | 标签: ,

 直接使用jquery的ajax方法是不能跨域访问数据的,执行时候会报"uri denied"的错误, 需要使用$.getJSON来处理。

$.getJSON("http://*****.com/checkEmail?email="+email+"&callback=?",
 function(json){
     if(json.status==1){
     // 执行代码
            }
        });

Java代码处理:
跨域执行的代码:
callback = request.getParameter("callback");
print(out,callback+"({ status: ‘1′, info: ‘填写正确!’ })");

原始ajax请求json的代码
print(out,"{ status: ‘1′, info: ‘填写正确!’ }");

区别:
跨域代码中多了callback参数,同时输出json数据时候{之前的是(

2008年12月30日 | 标签:

python的urlencode说明:

调用方法:

d= {’par1′:’a',’par2′:’b',}
print urllib.urlencode(m)   ===>par2=b&par1=a

urlencode的参数必须是Dictionary

问题:现在模拟请求Google和baidu,由于baidu使用的是gb2312编码,google使用的是utf8编码,两个站点提交到URL中的中文参数的urlencode值是不一样,下面以"帝国"为例:

python文件的# coding: UTF-8,执行urllib.urlencode("帝国")得到的结果是:%E5%B8%9D%E5%9B%BD,此结果说明默认使用urlencode得到的结果是utf8编码的“帝国”,现在想得到gb2312编码的“帝国”怎么办呢?

st = u’帝国’
st = st.encode(’gb2312′)
m = {’par’:st,}
s = urllib.urlencode(m)
print s

结果为par=%B5%DB%B9%FA

django中urlencode类似,方法如下:

from django.utils.http import urlquote
a = urlquote(’帝国’)
print a 

2008年12月30日 | 标签: ,

sequoia是一个开源的数据库集群中间件,它允许任何JAVA程序(独立的JAVA应用程序,EJB容器,servlet等)通过JDBC驱动透明的访问数据库集群。他的前身是cjdbc,由于sun的关系不得不改名。

为什么使用sequoia?

1、网站访问量大了,数据量大了,增加了数据库服务器,这个时候可以将访问比较频繁的表和访问量不频繁的表分开存储,频繁的表使用性能牛B的机器,访问不频繁的表使用稍微差点的机器,这个时候可以使用sequoia的raidb-0模式。

raidb-0的优点:

  • 快速解决了访问瓶颈问题,而且不用花太多money,花主要精力解决主要的事情
  • sequoia配置实现简单

raidb-0的缺点:

  • 治标不治本,访问量再大点还是要分库出去。
  • 单台数据库挂了会影响全部

看看raidb-0的代码:

config/controller中文件配置:

XML/HTML代码
  1. <SEQUOIA-CONTROLLER>  
  2.   <Controller ipAddress="127.0.0.1" port="25322">  
  3.     <Report/>  
  4.     <JmxSettings>  
  5.       <RmiJmxAdaptor/>  
  6.     </JmxSettings>  
  7.     <VirtualDatabase configFile="RAIDb-0.xml" virtualDatabaseName="rubis" autoEnableBackends="true"/>  
  8.   </Controller>  
  9. </SEQUOIA-CONTROLLER>  

config/virtualdatabase

XML/HTML代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE SEQUOIA PUBLIC "-//Continuent//DTD SEQUOIA 2.10.10//EN" "http://sequoia.continuent.org/dtds/sequoia-2.10.10.dtd">  
  3. <SEQUOIA>  
  4.      
  5.   <VirtualDatabase name="rubis">  
  6.   
  7.     <AuthenticationManager>  
  8.       <Admin>  
  9.         <User username="admin" password="c-jdbc"/>  
  10.       </Admin>    
  11.       <VirtualUsers>  
  12.         <VirtualLogin vLogin="user" vPassword="c-jdbc"/>  
  13.       </VirtualUsers>  
  14.     </AuthenticationManager>  
  15.   
  16.     <DatabaseBackend name="node1" driver="org.gjt.mm.mysql.Driver" url="jdbc:mysql://localhost/cjdbc" connectionTestStatement="select 1">  
  17.       <ConnectionManager vLogin="user" rLogin="root" rPassword="******">  
  18.         <VariablePoolConnectionManager initPoolSize="10"/>  
  19.       </ConnectionManager>  
  20.     </DatabaseBackend>  
  21.     <DatabaseBackend name="node2" driver="org.gjt.mm.mysql.Driver" url="jdbc:mysql://localhost/cjdbc2" connectionTestStatement="select 1">  
  22.       <ConnectionManager vLogin="user" rLogin="root" rPassword="******">  
  23.         <VariablePoolConnectionManager initPoolSize="10"/>  
  24.       </ConnectionManager>  
  25.     </DatabaseBackend>  
  26.   
  27.     <RequestManager>  
  28.   
  29.       <RequestScheduler>  
  30.         <RAIDb-0Scheduler level="passThrough"/>  
  31.       </RequestScheduler>  
  32.   
  33.       <RequestCache>  
  34.         <MetadataCache/>  
  35.         <ParsingCache/>  
  36.         <ResultCache granularity="table" />  
  37.       </RequestCache>  
  38.   
  39.       <LoadBalancer>  
  40.         <RAIDb-0/>  
  41.       </LoadBalancer>  
  42.   
  43.     </RequestManager>  
  44.   
  45.   </VirtualDatabase>  
  46. </SEQUOIA>  

Java测试代码:

Java代码
  1. public static void main(String[] args) {   
  2.   
  3.     Connection conn = null;   
  4.     PreparedStatement pstmt = null;   
  5.     try {   
  6.         Class.forName("org.continuent.sequoia.driver.Driver").newInstance();   
  7.         String url = "jdbc:sequoia://127.0.0.1:25322/rubis?user=user&password=c-jdbc";   
  8.         conn = DriverManager.getConnection(url);   
  9.         try {   
  10.             conn.setAutoCommit(false);   
  11.                
  12.             pstmt = conn   
  13.                     .prepareStatement("insert into User(name) values (?);");   
  14.   
  15.             pstmt.setString(1"test");   
  16.             pstmt.execute();   
  17.             conn.commit();   
  18.         } catch (Exception ex) {   
  19.             conn.rollback();   
  20.             ex.printStackTrace();   
  21.         } finally {   
  22.             try {   
  23.                 if (pstmt != null)   
  24.                     pstmt.close();   
  25.                 if (conn != null)   
  26.                     conn.close();   
  27.             } catch (Exception e) {   
  28.                 e.printStackTrace();   
  29.             }   
  30.         }   
  31.     } catch (Exception e) {   
  32.         e.printStackTrace();   
  33.     }   
  34. }  

如果cjdbc有表User,这个时候select查看下就会发现增加了条记录"test"

2、访问量大,单台server已经承受不起了,需要扩展成多台server,当money大大的时候,考虑不如用多台db server来处理吧。这个时候可以考虑使用raidb-1模式

raidb-1的优点:

  • 开发实现简单
  • 可以获得较高稳定性,单台db server down机的时候不会影响到网站整体

raidb-1的缺点:

  • 由于添加修改删除需要广播,估计执行insert,update,delete的时候对性能有影响。

看看raidb-1的代码实现:

config/controller中文件配置:

XML/HTML代码
  1. <SEQUOIA-CONTROLLER>  
  2.   <Controller ipAddress="127.0.0.1" port="25322">  
  3.     <Report/>  
  4.     <JmxSettings>  
  5.       <RmiJmxAdaptor/>  
  6.     </JmxSettings>  
  7.     <VirtualDatabase configFile="mysql-raidb1-distribution.xml" virtualDatabaseName="myDB" autoEnableBackends="force" checkpointName="Initial_empty_recovery_log"/>  
  8.   </Controller>  
  9. </SEQUOIA-CONTROLLER>  

config/virtualdatabase设置

XML/HTML代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE SEQUOIA PUBLIC "-//Continuent//DTD SEQUOIA 2.10.10//EN" "http://sequoia.continuent.org/dtds/sequoia-2.10.10.dtd">  
  3.   
  4. <SEQUOIA>  
  5.      
  6.   <VirtualDatabase name="myDB">  
  7.     
  8.     <Monitoring>  
  9.       <SQLMonitoring defaultMonitoring="off">  
  10.          <SQLMonitoringRule queryPattern="^select" caseSensitive="false" applyToSkeleton ="false" monitoring="on"/>  
  11.       </SQLMonitoring>  
  12.     </Monitoring>  
  13.   
  14.     <Backup>  
  15.       <Backuper backuperName="Octopus"  
  16.         className="org.continuent.sequoia.controller.backup.backupers.OctopusBackuper"  
  17.         options="zip=true"/>  
  18.     </Backup>  
  19.        
  20.     <AuthenticationManager>  
  21.       <Admin>  
  22.         <User username="admin" password="c-jdbc"/>  
  23.       </Admin>    
  24.       <VirtualUsers>  
  25.         <VirtualLogin vLogin="user" vPassword="c-jdbc"/>  
  26.       </VirtualUsers>  
  27.     </AuthenticationManager>  
  28.   
  29.     <DatabaseBackend name="node1" driver="org.gjt.mm.mysql.Driver" url="jdbc:mysql://127.0.0.1/cjdbc2" connectionTestStatement="select 1">  
  30.       <ConnectionManager vLogin="user" rLogin="root" rPassword="******">  
  31.         <VariablePoolConnectionManager initPoolSize="40"/>  
  32.       </ConnectionManager>  
  33.     </DatabaseBackend>  
  34.     <DatabaseBackend name="node2" driver="org.gjt.mm.mysql.Driver" url="jdbc:mysql://127.0.0.1/cjdbc" connectionTestStatement="select 1">  
  35.       <ConnectionManager vLogin="user" rLogin="root" rPassword="******">  
  36.         <VariablePoolConnectionManager initPoolSize="20" minPoolSize="5" maxPoolSize="0" idleTimeout="180" waitTimeout="0"/>  
  37.       </ConnectionManager>  
  38.     </DatabaseBackend>  
  39.   
  40.     <RequestManager>  
  41.       <RequestScheduler>  
  42.          <RAIDb-1Scheduler level="passThrough"/>  
  43.       </RequestScheduler>  
  44.   
  45.       <RequestCache>  
  46.         <MetadataCache/>  
  47.         <ParsingCache/>  
  48.         <ResultCache granularity="table" />  
  49.       </RequestCache>  
  50.   
  51.       <LoadBalancer>  
  52.         <RAIDb-1>  
  53.           <RAIDb-1-RoundRobin/>  
  54.         </RAIDb-1>  
  55.       </LoadBalancer>  
  56.   
  57.        <RecoveryLog driver="com.mysql.jdbc.Driver" url="jdbc:mysql://127.0.0.1/recovery" login="root" password="ntskyqaz">  
  58.          <RecoveryLogTable tableName="RECOVERY"  
  59.           logIdColumnType="BIGINT NOT NULL"            
  60.           vloginColumnType="VARCHAR(20) NOT NULL"  
  61.           sqlColumnName="sqlsrc"  
  62.           sqlColumnType="TEXT"  
  63.           sqlParamColumnType="TEXT"  
  64.           extraStatementDefinition=",PRIMARY KEY (log_id)"/>  
  65.         <CheckpointTable tableName="CHECK_POINT"  
  66.           checkpointNameColumnType="VARCHAR(127) NOT NULL"/>  
  67.         <BackendTable tableName="BACKEND"  
  68.           databaseNameColumnType="VARCHAR(50) NOT NULL"  
  69.           backendNameColumnType="VARCHAR(50) NOT NULL"  
  70.           checkpointNameColumnType="VARCHAR(127) NOT NULL"/>  
  71.         <DumpTable tableName="SEQUOIA_DUMP"  
  72.             dumpNameColumnType="TEXT NOT NULL"  
  73.           dumpDateColumnType="DATETIME"  
  74.           dumpPathColumnType="TEXT NOT NULL"  
  75.           dumpFormatColumnType="TEXT NOT NULL"  
  76.           checkpointNameColumnType="TEXT NOT NULL"  
  77.           backendNameColumnType="TEXT NOT NULL"  
  78.           tablesColumnType="TEXT NOT NULL"/>  
  79.       </RecoveryLog>    
  80.   
  81.     </RequestManager>  
  82.   </VirtualDatabase>  
  83.   
  84. </SEQUOIA>  

Java代码实现:

Java代码
  1. public static void main(String[] args) {   
  2.   
  3.     Connection conn = null;   
  4.     PreparedStatement pstmt = null;   
  5.     try {   
  6.         Class.forName("org.continuent.sequoia.driver.Driver").newInstance();   
  7.         String url = "jdbc:sequoia://127.0.0.1:25322/myDB?user=user&password=c-jdbc";   
  8.         conn = DriverManager.getConnection(url);   
  9.         try {   
  10.             conn.setAutoCommit(false);   
  11.                
  12.             pstmt = conn   
  13.                     .prepareStatement("insert into User(name) values (?);");   
  14.   
  15.             pstmt.setString(1"test");   
  16.             pstmt.execute();   
  17.             conn.commit();   
  18.         } catch (Exception ex) {   
  19.             conn.rollback();   
  20.             ex.printStackTrace();   
  21.         } finally {   
  22.             try {   
  23.                 if (pstmt != null)   
  24.                     pstmt.close();   
  25.                 if (conn != null)   
  26.                     conn.close();   
  27.             } catch (Exception e) {   
  28.                 e.printStackTrace();   
  29.             }   
  30.         }   
  31.     } catch (Exception e) {   
  32.         e.printStackTrace();   
  33.     }   
  34. }  

执行Java代码,查询cjdbc和cjdbc2两个库的User表,发现两个表中均有"test"数据。

3、由于raidb-3的情况我不会用到就没去接触了,有需要的可以查看下sequoia的文档。

2008年12月28日 | 标签:

fckeditor提供了上传图片功能,但代码是python的,而且一般设置fckeditor目录为静态目录没法加载python的文件,在网上找了下代码,google中早就有这样的代码了,我的项目中具体的使用步骤为:

1、打开项目链接,django-fckconnector: http://code.google.com/p/django-fckconnector/  使用svn下载最新的源代码,svn地址:svn checkout http://django-fckconnector.googlecode.com/svn/trunk/

2、使用django-fckconnector 需要lxml和ElementTree这两个项目支持

  • 安装lxml,打开lxml的下载地址:http://codespeak.net/lxml/index.html#download,svn co http://codespeak.net/svn/lxml/trunk lxml,进入lxml目录,执行python setup install,安装lxml
  • 安装ElementTree: windows版本直接下载安装文件运行exe文件就可以了。

3、将svn下载的django添加自己的项目,需要做些简单的修改,主要是文件路径类的,大家可以通过print来调试

4、修改fckconfig.js文件设置上传的文件路径:

JavaScript代码
  1. FCKConfig.ImageBrowserURL = FCKConfig.BasePath + ‘filemanager/browser/default/browser.html?Type=Image&Connector=/fckeditor/browser/’;  

我的django项目中定义了fckeditor/browser的链接,打开看看浏览图片,就可以看到自定义的上传目录的图片。

2008年12月28日 | 标签:

django的admin后台提供了基本的添加、修改、删除,由于基本admin后台的添加计较简陋,所以我就将fckeditor整合到后台中去。

admin.py的定义:

class ContentTextAdmin(admin.ModelAdmin):

    fieldsets = [   
        (None,   {'fields': ['content']}),                   
        (None,   {’fields’: ['title']}), 
        (None,   {’fields’: ['text']}),
    ]  
    list_display = (’id’,'title’)
    search_fields = ['title']
    class Media:
        js = (’/scripts/fckeditor/fckeditor.js’,'/scripts/fckeditor/text.js’,)   

这里定义了个class Media,标示admin后台载入这部分信息的时候会加载这两个js.第一个js是fck需要的js,第二个js的代码如下:

JavaScript代码
  1. window.onload = function(){   
  2.     var oFCKeditor = new FCKeditor( ‘text’ ) ;   
  3.     oFCKeditor.BasePath = ‘/scripts/fckeditor/’;   
  4.     oFCKeditor.Width    = 700 ;   
  5.     oFCKeditor.Height   = 500 ;   
  6.     oFCKeditor.Value    =  ;   
  7.     oFCKeditor.ToolbarSet = "Admin";   
  8.     oFCKeditor.ReplaceTextarea() ;    
  9. }  

刷新下admin后台,查看源代码,就可以看到admin后台的顶部会生成midea中定义的js

XML/HTML代码
  1. <script type="text/javascript" src="/scripts/fckeditor/fckeditor.js"></script>  
  2. <script type="text/javascript" src="/scripts/fckeditor/text.js"></script>  

 

2008年12月27日 | 标签: ,

刚学django,总想知道神奇的django在操作中到底执行了那些SQL语句,我们写了个SQL的middelware,将django的SQL语句给打印到控制台。

sqlmiddleware.py的代码如下:

from time import time
from django.db import connection

from django.db import connection 
class PrintSQL(object):
    
    def process_response(self, request, response): 
        temp = 0 
        for x in connection.queries: 
            print x 
            temp += float(x['time']) 
            print ‘time count:’,temp,’=’ * 40
        return response

修改你app的setting.py,MIDDLEWARE_CLASSES中增加:app.sqlmiddleware.PrintSQL’,

刷新下你有数据库的操作看看控制台,将会看到执行过程中的SQL语句。