Psycopg2教程

1. 链接PostgreSQL并设定Cursor

import psycopg2

import psycopg2.extras

conn = psycopg2.connect(host=’localhost’, port=5432, user=’postgres’, password=’postgres’, database=’test’)

# connect()也可以使用一个大的字符串参数, 比如”host=localhost port=5432 user=postgres password=postgres dbname=test”

cursor = conn.cursor(cursor_factory=psycopg2.extras.DictCursor)

#这里创建的是一个字典Cursor, 这样返回的数据, 都是字典的形式, 方便使用

2. 执行SQL脚本

cursor.execute(‘SELECT * FROM test WHERE id > %s;’, (5,))

这里的使用有一些奇怪, 有几个地方需要说明. 首先, sql脚本必须以;结尾, 不可以省略. 其次, 不管sql中有几个参数, 都需要用%s代替, 只有%s, 不管值是字符还是数字, 一律%s. 最后, 第二个参数中, 一定要传如元祖, 哪怕只有一个元素, 像我刚才的例子一样, (5)这样是不行的.

3. 得到查询结果

psycopg2提供了3种得到结果的方式, fetchone(), fetchall()和fetchmany(). fetchone()返回一条结果, 如果找不到, 返回None. fetchall()返回所有结果, 如果找不到, 返回空list. fetchmany接收1个参数, 即返回的结果数, 每次调用, 游标向后移, 找不到了, 就返回空list.

4. 查看生成的sql脚本

cursor.mogrify(‘SELECT * FROM test WHERE a = %s AND b = %s;’, (‘a’, ‘b’))

mogrify()函数会返回生成的sql脚本, 用以查看生成的sql是否正确.

5. 查看上一条执行的脚本

cursor.query

这是一个只读的属性, 用以查看上次执行的sql脚本.

6. 插入数据

执行完INSERT, UPDATE, DELETE这样的sql脚本后, 需要conn.commit()提交一下, 才会把数据提交到数据库当中. 切记.

这里有几个小技巧, 大家肯定会用的上的.

1. 取得最后插入的记录的ID

在INSERT的语句最后面加上RETURNING id即可, 比如:

cursor.execute(‘INSERT INTO test (a, b) VALUES (%s, %s) RETURNING id;’, (‘a’, ‘b’))

item = cursor.fetchone()

print item[0] #这里就是刚才插入的记录的ID了

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

在使用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处理静态文件:
Python代码
<span style=”font-size: small;”>urlpatterns += patterns(”,

(r’^static/(?P.*)

, ‘django.views.static.serve’,

{‘document_root’:  settings.MEDIA_ROOT}),
)</span>
而对于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,如下,
Python代码
<span style=”font-size: small;”>MEDIA_ROOT = ‘/home/denghaiping/workspace/djcode/mysite/static/’
# URL that handles the media served from MEDIA_ROOT. Make sure to use a
# trailing slash.
# Examples: “http://media.lawrence.com/media/”, “http://example.com/media/”
MEDIA_URL = ‘/static/’
# Absolute path to the directory static files should be collected to.
# Don’t put anything in this directory yourself; store your static files
# in apps’ “static/” subdirectories and in STATICFILES_DIRS.
# Example: “/home/media/media.lawrence.com/static/”
STATIC_ROOT = ”
# URL prefix for static files.
# Example: “http://media.lawrence.com/static/”
STATIC_URL = ‘/static/’
# URL prefix for admin static files — CSS, JavaScript and images.
# Make sure to use a trailing slash.
# Examples: “http://foo.com/static/admin/”, “/static/admin/”.
ADMIN_MEDIA_PREFIX = ‘/static/admin/’
</span>
apache2 配置如下:
Python代码
<span style=”font-size: small;”><Location “/static/”>
SetHandler None
Order allow,deny
Allow from all
</Location>
Alias /static /home/denghaiping/workspace/djcode/mysite/static
Alias /static/admin /usr/local/lib/python2.6/dist-packages/django/contrib/admin/media
<Location “/static/admin”>
SetHandler None
Order allow,deny
Allow from all
</Location>
</span>
如此配置以后,就可以让web服务器来高效的处理静态文件,而让django来处理动态内容。

在使用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处理静态文件:Python代码  <span style=”font-size: small;”>urlpatterns += patterns(”,        (r’^static/(?P.*)

, ‘django.views.static.serve’,        {‘document_root’:  settings.MEDIA_ROOT}),      )</span>   而对于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,如下,Python代码  <span style=”font-size: small;”>MEDIA_ROOT = ‘/home/denghaiping/workspace/djcode/mysite/static/’    # URL that handles the media served from MEDIA_ROOT. Make sure to use a  # trailing slash.  # Examples: “http://media.lawrence.com/media/”, “http://example.com/media/”  MEDIA_URL = ‘/static/’    # Absolute path to the directory static files should be collected to.  # Don’t put anything in this directory yourself; store your static files  # in apps’ “static/” subdirectories and in STATICFILES_DIRS.  # Example: “/home/media/media.lawrence.com/static/”  STATIC_ROOT = ”    # URL prefix for static files.  # Example: “http://media.lawrence.com/static/”  STATIC_URL = ‘/static/’    # URL prefix for admin static files — CSS, JavaScript and images.  # Make sure to use a trailing slash.  # Examples: “http://foo.com/static/admin/”, “/static/admin/”.  ADMIN_MEDIA_PREFIX = ‘/static/admin/’  </span>   apache2 配置如下:Python代码  <span style=”font-size: small;”><Location “/static/”>  SetHandler None  Order allow,deny  Allow from all   </Location>  Alias /static /home/denghaiping/workspace/djcode/mysite/static  Alias /static/admin /usr/local/lib/python2.6/dist-packages/django/contrib/admin/media    <Location “/static/admin”>  SetHandler None                                                               Order allow,deny  Allow from all   </Location>  </span>   如此配置以后,就可以让web服务器来高效的处理静态文件,而让django来处理动态内容。

win下最简单安装django

http://www.activestate.com/ 下载 python 2.7

安装 python 2.7完成后打开Python Package Manager (PyPM)

运行命令: pypm install django   (下载安装Django 1.3  )

运行命令:pypm install mysql-python  (下载安装mysql for python)

测试:

>>> import django
>>> print django.get_version()
1.3
>>> import MySQLdb
>>> print MySQLdb.version_info
(1, 2, 3, ‘final’, 0)
>>>

推荐的一些AsWing教程

AsWingHarry介绍给我的(鼎力推荐:”)),它是一个开源的flash框架也是OSFlash上的一个子项目,它的结构是模仿Java Swing,如果你对Java Swing很熟的话那用起AsWing一定很容易上手的:)。最重要的一点是,这个框架大部分是我们国人iiley写的,非常佩服他,敢想敢干!AsWing一个特点是可以让我们用纯代码来构造一系列的界面,而且它的体积非常小。最近听Harry说他们正在开发一种客户端缓存组件的技术(只限AS3)叫Flash DLL,据介绍可以把swf大小剪掉90%以上,因为是开源的你也能定制自己的共享库缓存端。相比之下AS3版本的AsWing要比AS2的在效率方面要快许多(因为我只用过AS3版本没有亲身经历过到底有多大的不同,但是依靠FlashPlayer和AVM2性能的提升相信也是无需置疑的,呵呵)。

下面来介绍一些AsWing的教程:

AsWing主页:http://www.aswing.org 不过上面都是英文(面向世界),可能英文不好的朋友看起来有点吃力。

胡矿AsWing教程的blog:http://thiswind.flashseer.org 这个blog从头到尾都是胡矿写的AsWing教程而且是全中文的弥补了缺乏中文教程的不足:),非常的不错,你可能在学习Aswing的同时对AS3也有很大的提高。

Harry的blog:http://harryxu.cn/blog Harry会在他的blog上时不时的发一些他写的AsWing教程,有浅有深,如基本的组件使用,但也有像在使用AsWing时碰到的问题和解决的总结、AsWing一些bug之类的有深度的文章!

Java Swing教程:http://java.sun.com/docs/books/tutorial/uiswing/TOC.html 如我前面介绍的AsWing是模仿Swing的框架,所以一些组件的使用也可以借鉴现有的Java Swing教程:)

随着AsWing的使用越来越普及,一些有质量的教程会相继出现,我也会不断更新这个列表,当然可能其中也包括我的,我会把平时使用过程中遇到的问题和解决的方法都发表在未来的日志中,希望大家始终关注我的blog:)

cheers!

Python资源

Python基本安装:

* http://www.python.org/ 官方标准Python开发包和支持环境,同时也是Python的官方网站;
* http://www.activestate.com/ 集成多个有用插件的强大非官方版本,特别是针对Windows环境有不少改进;

Python文档:

* http://www.python.org/doc/current/lib/lib.html Python库参考手册。
* http://www.byteofpython.info/ 可以代替Tutorial使用,有中文译版的入门书籍。
* http://diveintopython.org/ 一本比较全面易懂的入门书,中文版翻译最近进步为很及时的5.4了。
* http://www.python.org/peps/pep-0008.html 建议采用的Python编码风格。
* http://doc.zoomquiet.org/ 包括Python内容的一个挺全面的文档集。

常用插件:

* http://www.pfdubois.com/numpy/ Python的数学运算库,有时候一些别的库也会调用里面的一些功能,比如数组什么的;
* http://www.pythonware.com/products/pil/ Python下著名的图像处理库Pil;
* http://simpy.sourceforge.net/ 利用Python进行仿真、模拟的解决方案;
* Matplotlib 据说是一个用来绘制二维图形的Python模块,它克隆了许多Matlab中的函数, 用以帮助Python用户轻松获得高质量(达到出版水平)的二维图形;
* http://www.amk.ca/python/code/crypto python的加解密扩展模块;
* http://cjkpython.i18n.org/ 提供与python有关的CJK语言支持功能:转码、显示之类。
* Psyco、Pyrex:两个用于提高Python代码运行效率的解决方案;
* Pyflakes、PyChecker、PyLint:都是用来做Python代码语法检查的工具。
* http://wxpython.sourceforge.net/ 基于wxWindows的易用且强大的图形界面开发包wxPython;
* http://www.pygame.org/ 用Python帮助开发游戏的库,也可以用这个来播放视频或者音频什么的,大概依靠的是SDL;
* http://starship.python.net/crew/theller/py2exe/ win下将Python程序编译为可执行程序的工具,是一个让程序脱离Python运行环境的办法,也可以生成Windows服务或者COM组件。其他能 完成Python脚本到可执行文件这个工作的还有Gordon McMillan’s Installer、Linux专用的freeze以及py2app、setuptools等。不过此类工具难免与一些模块有一些兼容性的问题,需要现用 现测一下。
* 嵌入式数据库:BerkeleyDB的Python版,当然还有其他的好多。
* PEAK提供一些关于超轻量线程框架等基础性重要类库实现。

部分常用工具:

* http://www.scons.org/ Java有Ant这个巨火的构建工具,Python的特性允许我们构建更新类型的构建工具,就是scons了。
* Python Sidebar for Mozilla FireFox的一个插件,提供一个用来查看Python文档、函数库的侧边栏。
* IPython 很好用的Python Shell。wxPython发行版还自带了PyCrust、PyShell、PyAlaCarte和PyAlaMode等几个工具,分别是图形界面Shell和代码编辑器等,分别具有不同特点可以根据自己的需要选用。
* Easy Install 快速安装Python模块的易用性解决方案。

推荐资源:

* Parnassus山的拱顶 巨大的Python代码库,包罗万象。既可以从上面下载代码参考学习,同时也是与Python有关程序的大列表。
* Python号星际旅行船 著名Python社区,代码、文档、高人这里都有。
* faqts.com的Python程序设计知识数据库 Python程序设计知识库,都是与Python有关的程序设计问题及解决方法。
* 啄木鸟 Pythonic 开源社区 著名的(也可以说是最好的)国内Python开源社区。

代码示例:

* http://newedit.tigris.org/technical.htm Limodou的NewEdit编辑器的技术手册,讨论了一些关于插件接口实现、i18实现、wxPython使用有关的问题,值得参考。

其他东西:

* http://www.forum.nokia.com/main/0,,034-821,00.html Nokia居然发布了在Series 60系统上运行Python程序(图形界面用wxPython)的库,还有一个Wiki页是关于这个的:http://www.postneo.com /postwiki/moin.cgi/PythonForSeries60 。Python4Symbian这个页面是记录的我的使用经验。
* pyre:使用Python完成高性能计算需求的包,真的可以做到么?还没研究。
* Parallel Python:纯Python的并行计算解决方案。相关中文参考页面
* Pexpect:用Python作为外壳控制其他命令行程序的工具(比如Linux下标准的ftp、telnet程序什么的),还没有测试可用程度如何。
* pyjamas:Google GWT的Python克隆,还处在早期版本阶段。
* Durus:Python的对象数据库。

有意思的东西:

* Howie:用Python实现的MSN对话机器人。
* Cankiri:用一个Python脚本实现的屏幕录像机。

参考资料

* ZDNET文章:学习Python语言必备的资源
* Pythonic Web 应用平台对比
* 在wxPython下进行图像处理的经验 (其实,仅使用wxPython也可以完成很多比较基础的图像处理工作,具体可以参照《wxPython in Action》一书的第12节)
* 通过win32扩展接口使用Python获得系统进程列表的方法
* 如何获得Python脚本所在的目录位置
* Python的缩进问题
* py2exe使用中遇到的问题
* idle的中文支持问题
* 序列化存储 Python 对象

Python IDE

我的IDE选择经验

* http://www.xored.com Trustudio 一个基于Eclipse的、同时支持Python和PHP的插件,曾经是我最喜欢的Python IDE环境,功能相当全了,不过有些细节不完善以致不大好用。
* http://pydev.sourceforge.net/ 另一个基于Eclipse的,非常棒的Python环境,改进速度非常快,现在是我最喜欢的IDE。
* http://www-900.ibm.com/developerWorks/cn/opensource/os-ecant/index.shtml 用 Eclipse 和 Ant 进行 Python 开发
* http://www.die-offenbachs.de/detlev/eric3.html ERIC3 基于QT实现的不错的PYTHON IDE,支持调试,支持自动补全,甚至也支持重构,曾经在Debian下用它,但图形界面开发主要辅助qt,我倾向wxpython,所以最后还是放弃了 这个。
* http://www.scintilla.org/ 同时支持Win和Linux的源代码编辑器,似乎支持Python文件的编辑。
* http://boa-constructor.sourceforge.net/ 著名的基于WxPython的GUI快速生成用的Python IDE,但是开发进度实在太差了……
* http://pype.sourceforge.net/ 成熟的Python代码编辑器,号称功能介于EMACS和IDLE之间的编辑器。
* http://www.stani.be/python/spe SPE:号称是一个Full Featured编辑器,集成WxGlade支持GUI设计。

Email List

http://groups.google.com/group/python-cn?hl=zh-CN

如何在Django中接收JSON格式的数据

Django做了大量工作简化我们的Web开发工作, 这其中当然也包括接收来自客户端的数据这一普遍需求. 大部分时候,从客户端传入的数据主要是FORM的POST数据,和来自URL的GET数据, 在Django中对应了HttpRequest对象的POST和GET属性, 例如读取FORM表单中的用户名username输入框的内容:

def someView(request):
    username = request.POST.get('username');
    ......

在WEB2.0时代, 如果我们从客户端传入的是JSON格式的数据, 上面的方法就无法正常读出数据了. 可能有人要问,为什么一定要用JSON格式的数据, 不直接编码成FORM形式的数据呢? 因为JSON格式能够更好地体现数据的层次结构, 而FORM形式的数据往往只能是单层.

下面通过一个例子演示如何从HTML中发送json,并在Django中接收json数据.

在HTML中,可以通过JSON对象将数据以Json格式发送到服务器,假设在play.html中有以下内容要发送到服务器:

  • 用户名username
  • 密码password
  • 一个数组,其中每个元素包含: 游戏编号game_id和得分level

那么, 可以使用如下JavaScript(JQuery)代码:

<script type="text/javascript">
$(function() {
	$('#upload').click(function() {
		var json_obj = {
				username: $('#username').val(),
				password: $('#password').val(),
				datas: [
				        {
					        game_id: $('#datas1').val(),
					        level: $('#level1').val()
				        },
				        {
					        game_id: $('#datas2').val(),
					        level: $('#level2').val()
				        }
					   ]
				};    //JSON对象   

		var json_str = JSON.stringify(json_obj);    //将JSON对象转变成JSON格式的字符串
	    $.post("/datasave", json_str, callback, "json");
	})

	function callback(json){
		$('#response').html('code:'+json['status']['code'] + "\tmessage:" + json['status']['message']);
	}
})
</script>

在上面的代码中, 数据将发送到/datasave, 在Django中,视图方法若还使用request.POST来读数据, 得到的全是None, 这时得使用request.raw_post_data, 并借助simplejson来将其转换为字典dict数据类型, 然后的使用就简单了,如下:

def datasave(request):
    dict = {}
    info = 'Data log save success'
    try:
        if request.method == 'POST':
            req = simplejson.loads(request.raw_post_data)
            username = req['username']
            password = req['password']
            datas = req['datas']
            game_id1 = datas[0]['game_id']
   except:
        import sys
        info = "%s || %s" % (sys.exc_info()[0], sys.exc_info()[1])

    dict['message']=info
    dict['create_at']=str(ctime())
    json=simplejson.dumps(dict)
    return HttpResponse(json)

request.raw_post_data表示的是从客户端发送过来的原始数据,为了纯字符串, 通过simplejsonloads方法将其转换为字典数据类型req.
上面的代码也演示了如何以JSON格式作为响应值, 而非HTML, 即通过simplejsondumps方法, 将字典数据dict序列化为字符串形式,将通过HttpResponse返回.

Django Ajax.Request Post Form,retrun“403”解决办法

Django使用ajax POST表单时,为防止CSRF攻击,会验证csrftoken的值是否有效;如果没有在settings中设置csrf中间件及ajax post requestheader中没有指定csrftoken的话,就会return “403”,是无法post请求的,那么就需要我们手动添加。

————————–settings:———————————-

MIDDLEWARE_CLASSES = (
‘django.middleware.csrf.CsrfMiddleware’,
‘django.middleware.csrf.CsrfViewMiddleware’,
‘django.middleware.csrf.CsrfResponseMiddleware’,
———————————————————————-
——————————JS—————————————————-
function getCookie(sName){var aCookie=document.cookie.split(“; “);for(var i=0;i<aCookie.length;i++){var aCrumb=aCookie[i].split(“=”);if(sName==aCrumb[0])return   (aCrumb[1]);}return null;}
var myAjax=
new Ajax.Request(‘http://192.168.1.100/project/update’{method:’POST’,setRequestHeader:{“X-CSRFToken”:getCookie(‘csrftoken’)},
parameters:’csrfmiddlewaretoken=’+getCookie(‘csrftoken’)+”&Fields=”+fileds})

MIDDLEWARE_CLASSES = (    ‘django.middleware.csrf.CsrfMiddleware’,    ‘django.middleware.csrf.CsrfViewMiddleware’,    ‘django.middleware.csrf.CsrfResponseMiddleware’,)———————————————————————-
——————————JS—————————————————-function getCookie(sName){var aCookie=document.cookie.split(“; “);for(var i=0;i<aCookie.length;i++){var aCrumb=aCookie[i].split(“=”);if(sName==aCrumb[0])return   (aCrumb[1]);}return null;}
var myAjax=new Ajax.Request(‘http://192.168.1.100/project/update’{method:’POST’,setRequestHeader:{“X-CSRFToken”:getCookie(‘csrftoken’)},parameters:’csrfmiddlewaretoken=’+getCookie(‘csrftoken’)+”&Fields=”+fileds})

Django框架下如何使用ajax,jquery的post方法

使用GET方法服务器可以正常返回,但是使用POST方法却不行。后来再测试表单方式的POST的方法也不行。只要POST必报HTTP 403错误!

是因为Django的Cross Site Request Forgery protection机制的问题。这个机制是为了保护不受csrf攻击。什么是crsf攻击,桃林博客中有一段较为浅显的讲解。解决方案其实Django的已经给出http://docs.djangoproject.com/en/dev/ref/contrib/csrf/,根据说明修改后,ajax可以顺利Post了。

方法其实很简单,首先解决表单的POST。在settings.py文件中找到 MIDDLEWARE_CLASSES,在其中加入一个中间件:’django.middleware.csrf.CsrfViewMiddleware’ ,修改后的代码如下:

Python代码

MIDDLEWARE_CLASSES = (
‘django.middleware.common.CommonMiddleware’,
‘django.contrib.sessions.middleware.SessionMiddleware’,
‘django.middleware.csrf.CsrfViewMiddleware’,
‘django.contrib.auth.middleware.AuthenticationMiddleware’,
‘django.contrib.messages.middleware.MessageMiddleware’,
‘django.middleware.csrf.CsrfResponseMiddleware’, #加入这个中间件
)

经过这番修改,可以解决表单方式的POST提交HTTP 403问题了。ajax的Post提交仅这样改还不行。还需要钩上一个每次提交时的cookie处理过程。也就是每次提交的时候,都触发这个过程,在提交的http头上加入csrf token。不过还好,如果你是用jQuery来处理ajax的话,Django直接送了一段解决问题的代码。把它放在一个独立的js文件中,在html页面中都引入即可。注意这个js文件必须在jquery的js文件引入之后,再引入。代码我直接复制过来了,如下:

$(‘html’).ajaxSend(function(event, xhr, settings) {

function getCookie(name) {

var cookieValue = null;

if (document.cookie && document.cookie != ”) {

var cookies = document.cookie.split(‘;’);

for (var i = 0; i < cookies.length; i++) {

var cookie = jQuery.trim(cookies[i]);

// Does this cookie string begin with the name we want?

if (cookie.substring(0, name.length + 1) == (name + ‘=’)) {

cookieValue = decodeURIComponent(cookie.substring(name.length + 1));

break;

}

}

}

return cookieValue;

}

if (!(/^http:.*/.test(settings.url) || /^https:.*/.test(settings.url))) {

// Only send the token to relative URLs i.e. locally.

xhr.setRequestHeader(“X-CSRFToken”, getCookie(‘csrftoken’));

}

});

使用python时出现CSRF verification failed. Request aborted错误的解决方法

按照帮助信息不一定能解决问题,按照《python开发技术详解》中所说去配置也同样不成。

其实只需要在web root下settings.py的MIDDLEWARE_CLASSES中添加以下内容:
‘django.middleware.csrf.CsrfViewMiddleware’,            #这个指导书中有
‘django.middleware.csrf.CsrfResponseMiddleware’,    #这个是指导书中没有的,在response页面时就出错

关于django的POST常见方法

关于django的POST常见方法

1.用post方法去取form表单的值

在取值前,先得判断是否存在这个key

if not request.POST.has_key(strName):
return “”
if request.POST[strName]:
return request.POST[strName]
else:
return “”

2.用post方法获取[]类型的数据

常见的,例如,每行数据前面都带个checkbox的操作。这时候可能会选多个checkbox,传入到后台时,如果用request.POST[strname]获取,那么只能获取到一个值。用下面的方法,可以获取到多值

if not request.POST.has_key(strName):
return “”
if request.POST[strName]:
return ‘,’.join(request.POST.getlist(strName))
else:
return “”