Django community: RSS
This page, updated regularly, aggregates Django links from the Django community.
-
新手学Django
刚接触这个东西,不会用,不知道从什么地方下手 -
注册,登录
#coding=utf-8from django import formsfrom django.core .urlresolvers import reversefrom django.http import HttpResponse, HttpResponseRedirectfrom django.shortcuts import render_to_responsefrom django.template import RequestContextfrom django.contrib.auth.models import Userfrom django.utils.translation import ugettext_lazy as _from django.contrib.auth import authenticate, login as auth_login ,logout as auth_logoutdef index(request): '''首页视图''' pa = '' template_var = {} forme=(request.POST) if 'name' in request.POST and request.POST['name']: username = request.POST['name'] password = request.POST['pwd'] request.session['username'] = username ret = User.objects.get(username=username) ret2 = ret.check_password(password) # print ret2 if ret2: return HttpResponseRedirect(reverse("welcome")) else: pa = "用户名或密码错误" #return render_to_response("accounts/index.html",{'index':index, 'pa':pa}) if request.session['username']: username = request.session['username'] template_var["username"] = _(u"欢迎您 %s!")%username return render_to_response("accounts/index.html",template_var) #print forme'username' return render_to_response("accounts/index.html",{'index':index, 'pa':pa})def welcome(request): '''欢迎页面''' username = request.session['username'] template_var = {} template_var["username"] = username return render_to_response("accounts/welcome.html",template_var) # return render_to_response("accounts/welcome.html",{'welcome':welcome})def register(request): '''注册页面''' msg = '' error = '' if request.method=="POST": form=(request.POST) if 'name' in request.POST and request.POST['name']: username = request.POST['name'] password1 = request.POST['pwd1'] password2 = request.POST['pwd2'] if User.objects.filter(username=username): error = "用户名已经存在" #return HttpResponseRedirect(reverse("error")) return render_to_response("accounts/register.html",{'register':register, 'error':error}) if password1 == password2: useradd = User.objects.create_user(username,password1) useradd.set_password(password1) useradd.save() request.session['username'] = username return HttpResponseRedirect(reverse("welcome")) else: msg = "两次密码不一样" return render_to_response("accounts/register.html",{'register':register, 'msg':msg})def logout(request):# '''注销视图''' #auth_logout(request) #request.session.flush() #try: # username = request.session['username'] # del request.session['username'] #except KeyError: # pass # return HttpResponseRedirect(reverse('index')) return HttpResponseRedirect(reverse('index')) 我想做一个能把用户注销掉,不知道怎么做,请高手给我添加代码并,解释一下大概引用哪些函数,模块。 -
Django和Ajax的那些事儿-开篇
把Django和Ajax放在一起,那是很久远的事了,有人说在Ajax大紫大红的时候,Django错失了机会,没有把Ajax集成到自身,借助Ajax的这股东风传播自己。而如今有些人还觉得遗憾,但也有些人感到庆幸;说遗憾,那些人会指着Rails,说:看,Rails当年就是因为借助Ajax来让更多人认识到自己的...而觉得庆幸的人,心里想:Django掌陀人当年的决定,现在得到印证了,Ajax其实就是一门新新的技术,它应该由其他组织大力发展它,让它更加独立,更加强大,更加灵活,放之四海皆准。 个人觉得,Django还是继承了Python大道至简的理念,经纬分明。Ajax原本就不是Django所独有的,让它在技术领域上细分,竞争,变得更强大;这样其他程序框架会得益于Ajax,Django也会得益于Ajax;如果集成Ajax于一身,Django的Ajax会变得局限,Django的使用者看似有更好的发挥但仅仅限于Django的Ajax上。这和Django的Templates应不应该放些程序逻辑的事情有几分相似,程序员和页面设计师遇到这个问题,相信会有不同的意见,所以最后都采取了折中的解决办法。 这个问题暂且不谈论,让它智者见智,仁者见仁吧。 Django不会阻止我们去用Ajax,我们把所熟知某框架的Ajax用在Django也不见得是件难事,相反我们有自己的选择权,选择哪个js框架,Jquery也好,Dojo 、Scriptaculous 、Prototype 、yui-ext 、Mochikit、mootools也罢,只要我们有自己的选择标准足矣. 我不是个脚本师,偶尔看看Jquery的东西,Jquery里的内部机制原理一知半解,但我相信能在Django里用用Ajax的东西,想来Django也算厚道,照顾到我这样的人群了...^_^ -
Django上使用gravatar
gravatar是什么?从它的全拼字母A Globally Recognized Avatar来识别,大概可以理解为:全球公认的头像;全球认证的头像...你可以到gravatar官方网站上传自己的头像,然后到第三方网站上发帖留言写博客...这时网站上就显示你的头像了,前提条件是这个第三方网站必须支持gravatar应用才行,以下就是今天说的重点了:让自己的网站支持gravatar应用。说做法之前,我们顺便提些东西。gravatar应用的使用范围越来越广,你除了在gravatar官网上传自己的公认头像之外,你还可以在其他组织的Email上设置,比如在Google的Gmail里上传了头像,gravatar会找到Google上的头像标示你本人...因为gravatar关联的信息是你的Email。所以你的Email是关键所在。一 让自己的网站支持gravatar,有什么用?好吧,看来得说说gravatar的用途了。你也知道,不仅中国的网民,全球的其他网民(可能会好点)都喜欢免费的午餐,感兴趣的东西喜欢看看,喜欢说点什么,但非要注册后才能看才能发言的话,他们宁愿溜之大吉...站长已经司空见惯,应该接受事实,所以干脆给这些可爱的人更大的空间,让他们和自己的会员一样,能看他们喜欢的东西,能说说自己的见解,而无需注册成为自己的会员...随之的匿名访问,匿名评论应用红遍大江南北...那时,站长怎么给匿名用户保留个身份呢?嗯,留网站地址,昵称,Email,足够了;自从gravatar诞生后,匿名用户又拥有了自己的头像...^_^除了让匿名用户显示真实头像之外,其实还有很多用途,gravatar官网上说的很清楚,E文可以的,去看看吧:http://cn.gravatar.com/通俗来说,就是Email和真实头像直接挂钩。如果站长足够灵活,可以不用做用户的头像上传应用,直接用gravatar实现相似的功能了。二 怎么让自己的网站支持gravatar?好吧,说说gravatar官方的做法,gravatar支持的开发语言很多种,同样Djanog也得到了支持,官方推荐使用tag的方法。代码如下:### gravatar.py ################## place inside a 'templatetags' directory inside the top level of a Django app ###(not project, must be inside an app)### at the top of your page template include this:### {% load gravatar %}### and to use the url do this:### <img src="{% gravatar_url 'someone@somewhere.com' %}">### or### <img src="{% gravatar_url sometemplatevariable %}">### just make sure to update the "default" image path belowfrom django import templateimport urllib, hashlibregister = template.Library()class GravatarUrlNode(template.Node): def __init__(self, email): self.email = template.Variable(email) def render(self, context): try: email = self.email.resolve(context) except template.VariableDoesNotExist: return '' default = "http://example.com/static/images/defaultavatar.jpg" size = 40 gravatar_url = "http://www.gravatar.com/avatar/" + hashlib.md5(email.lower()).hexdigest() + "?" gravatar_url += urllib.urlencode({'d':default, 's':str(size)}) return gravatar_url@register.tagdef gravatar_url(parser, token): try: tag_name, email = token.split_contents() except ValueError: raise template.TemplateSyntaxError, "%r tag requires a single argument" % token.contents.split()[0] return GravatarUrlNode(email)tag的使用方法,就简单说说吧:Django的app上建立一个文件夹templatetags,里面放一个__init__.py文件(可以是空的),让templatetags成为python的一个包,然后建立gravatar.py文件,把以上的代码复制过去,准备工作就算完成了。在templates里使用,比如blog.html中,加入{% load gravatar %},装载gravatar的tag.这时blog.html能使用注册的gravatar_url方法了。如:<img src="{% gravatar_url c.email %}" alt=""/>给gravatar_url函数传入用户的email即可解析到该email相对应的头像地址。使用官方的代码,值得注意的是,需要修改些代码,请把default = "http://example.com/static/images/defaultavatar.jpg"修改成 真实的地址,如果你网站上有默认的头像,请附上真实的地址,不然gravatar发现该email没有上传头像时,就解析不出gravatar的头像地址了。如果你网站没有所谓默认的头像,建议拿掉default参数;把gravatar_url += urllib.urlencode({'d':default, 's':str(size)})改成gravatar_url += urllib.urlencode({'s':str(size)})。还有就是size = 40,是显示头像的大小,单位是像素。官网建议tag的用法,只要我们摸索了gravatar做法,也可以使用filter的方法,我们自己在gravatar.py底下写几行代码就可以搞定了:@register.filter def get_gravatar(email): return "http://www.gravatar.com/avatar/" + hashlib.md5(email.lower()).hexdigest()+'.jpg?s=40'templates上的用法:<img src="{{c.email|get_gravatar }}" alt=""/>好像没有什么东西说的了,必要加上gravatar应用的同学,可以试试... -
架设在GAE上的博客程序
架设在GAE上的博客,大概有近十种,micolog、pyweblog、n23、xian-min、tublog、pblog等。我通通下载安装试用了一遍,最后排除了所有,只剩下micolog。其它博客的优缺点如下,好坏不分先后: Pyweblog 演示:http://plog.appspot.com/ 代码:http://code.google.com/p/pyweblog/ 优点:界面清爽,写文章、管理、评论功能完备,支持上传,无任何广告 缺点:不支持导出导入 Cpedia 演示:http://blog.cpedia.com/ 代码:http://code.google.com/p/cpedialog 优点:页面设计非常强大,界面清新,功能完善,后台可以拖动设置主页各模块位置。 缺点:过于臃肿,近7M;嵌入难以去除的广告,需手动去除;不支持导出导入。 n23 演示:http://n23.appspot.com/blog 代码:http://code.google.com/p/n23/ 优点:测试未成功,页面混乱; 缺点:过于臃肿,达7.8M; xian-min 演示:http://xian-min.appspot.com/ 代码:http://code.google.com/p/xian-min/ 优点:程序简约,仅几百K;最基本发文章、修改删除文章功能,评论功能。 缺点:过于简单,甚至没有文本编辑器,不支持导入导出 tublog 演示:暂无 代码:http://code.google.com/p/tublog/ 优点:绝对精简,发文章管理评论均有,不错的编辑器;注意后台是/admin,主页无链接;无任何广告 缺点:精简不会成为它的缺点,它就是这样;不支持导入导出 potlatchblog 演示:http://aaronspotlatch.appspot.com/ 代码:http://github.com/araddon/potlatchblog/tree/master 优点:发文章、管理评论等基本功能均有,注意后台是/admin,主页无链接;无任何广告 缺点:未排版,无特殊之处;不支持导入导出 niub 演示:http://niubi.appspot.com/ 代码:http://code.google.com/p/niubi/ 优点:暂无,运行出错 缺点:程序非常大,17M; onlypy 演示:http://onlypython.appspot.com 代码:http://code.google.com/p/onlypy/ 优点:界面非常整洁,功能完备。 缺点:程序非常大,18M;过多作者信息 i-here 演示:http://ihere.appspot.com/blog/ 代码:http://code.google.com/p/ihere-blog/ 优点:作者热情,很有前途;界面简约、功能完善;支持兼容wordpress导入导出;支持多人协作;可以修改文章发布时间;支持Live Writer发布;支持上传;支持Development Console可视化查看后台数据库、流量;支持URL重定向;无任何广告 缺点:程序过大,11M,但支持这么多功能,大些是可以理解的 看了这么多优秀的博客程序,如果不是因为micoblog的简约和兼容,我肯定选择了i-here。不过我最早接触micoblog,给我留下了很好的印象。此外本博客使用vvonder修改完善的micoblog版本,功能多了不少,界面也更好看。 micolog 演示:http://xuming.net 代码:http://code.google.com/p/micolog/ 优点:界面清新,程序精简(仅800K),发文章、管理、评论、Tags、分类等都和上面大部分博客一样非常完备;后台管理界面友好,支持RSS,支持Wordpress格式导入导出;容易修改移植Wordpress主题;支持上传文件;支持Live Writer发布;无任何广告;作者热情,用户量较大 缺点:比较一下i-here,我个人非常需要它的修改文章发布时间的功能,虽然我可以通过导出–修改–导入的方式达到目的;不支持多人协作 就是从这些博客的应用里,我看到了Google App Engine和Python的好玩之处。上个月我开始学习Python,我还需要学习一下Google APP和Django等这些开发文档。我想在一两个月内,完善micoblog,实现我需要的功能。对于micolog,我还希望得到一下一些功能: 导出时支持将图片备份至本地,同样支持将备份图片还原 加入验证码 可拖动设置主页模块 插件支持,如Twitter等 在线换肤 在线升级 我收藏的几个使用micolog的网站 http://vvonderblog.appspot.com/ http://www.houkai.com/ http://www.kgblog.net/ 来源:http://www.pugwoo.com/2009/11/12/choose-micolog-new-begin.html -
粗略记录祖宗往事
这次回去,很多事情忙,一个大家庭的成员都回来差不多了,小孩和老人相差将近80年!和自己年龄相近的人都认识,唯些许小孩和老人都不识面了,因为我出来的时候,有些小孩没有出生,而自己小的时候也很少见到远门的老人们。几十年的历史,不是我所能认识的了,离家的时候,爷爷还健在,奶奶也还硬朗,如今爷爷去了,年长的只剩下奶奶!眼前的情景,不知道拿什么来形容。吃完晚饭仔细端详了一下奶奶,古铜色的脸爬满了皱纹,脸上的黑斑记录着逝去的岁月!那逝去的年月,我想该是要粗略记下来了,为了尽量保持历史的真实性,开始克制自己急迫的情绪,保持平静的心情,也让奶奶静下来,把那段近百年的往事娓娓道来。可惜没有完成预期的任务,说到过去的事情,奶奶始终没有办法平静下来,因为没有太多的事情在她人生经历和知识看来是理解不了的,还有段时期她还不在场,后面也是老人们讲述的。致使记录带些个人情感和不真实的元素,但我实在找不到真实的线索了!不如把她说的都记录下来。 我们村(欧村)最初是在桂平往下的一个村庄(假名 牛麻)迁徙过来的,原因不详。祖先可能后来有了两个儿子,结果分东西两边,一个住在东边一个住在西边。我家族分支在东边;后来村子发展道了一百多人,又有一两家人搬进来了,原先是姓 马,后面未知原因也改姓 潘了,可能是为了更好的相处的缘故吧! 我家的太爷爷的爸爸,28-30岁中途夭折(在桂平去世),当时太爷爷还小。成年后,娶了石龙白糖的太奶奶。太爷爷和太奶奶那时大概在鸦片战争时代,当时鸦片在村里毒害了很多祖先,包括太爷爷也有烟瘾,太爷爷应该有三个兄弟,形成了三个分支,也就是村里东边最大的三个分支,育期是太三奶奶分支的,业幸估计是太大爷爷分支的,我便是二分支的了。我的太爷爷中年时开始吸鸦片,酗酒。太奶奶喜欢干净,很少去料理农活。两人有四子三女,由于晚期的衰落,爷爷的两个兄弟被贩卖到厚陆..只剩下爷爷和小爷爷他们,至于三个姑婆出嫁不详。太爷爷享年53,太奶奶享年93左右,是村里最长寿的一个老人之一。爷爷20岁左右,娶了一门妻,由于长年在外,妻子改嫁(奶奶说被太奶奶贩卖了),后来爷爷34岁左右,娶了奶奶,两人年龄间隔11岁,奶奶是普平的陆村人。两人一共有三儿两女,两女现在广东,大姑姑生于1959年,先嫁如玉林地区,后来一家迁徙到广东。小姑生于1966年,嫁如广东地区,有两儿;我爸是长子,生于1953年,妈妈是石龙良山人(原先是庆丰黄村人,家里有两个哥哥,三个姐姐,二姐嫁个石龙白洞,大姐姐嫁个石龙良山,也是妈妈的养家,大姐姐既是妈妈的大姐也是养母,也就是我现在的外婆,外婆无嗣,领养了外公小弟的四儿子为子,我妈妈是养长女,还有一个养女,也出于外公小弟的女儿。外公三兄弟)。爸爸妈妈有两儿两女,大姐嫁到广东化州地区,二姐加入石龙白糖,大哥20岁娶妻,现有两子,无女。我和业幸是村里的早年出去的大学生,高中均在桂平浔高就读,三年后,业幸考进广西大学,而我就读于内蒙古的一所学校,我于2011年结婚,妻子是庆丰林桥大竹园村人,尚未有子。大姐两女一儿,儿子排名第二。二姐一子一女。 爷爷享年88岁,于1999年家里去世,父亲1953年生,早年马车做运输,中途卖过猪肉,后来改回运输,开过手扶拖拉机,和小货车,中年1993年不幸染疾去世,终年40.二叔生于1955年,从事渔业,承包村里的池塘养鱼,家有两儿三女,大女儿是长女,嫁入广东地区,二女儿加入北流地区,小女儿未嫁。大儿子已婚,一女一子,小儿子未娶。二婶石龙龙山人。于1999年,二叔壮年染疾去世。小叔生于1967年,早年发酵豆芽,后期改行做烧鸭至今。小婶石龙白糖人,有一儿两女,儿子2010年结婚,在家族中排行老四,妻子石龙人。小叔大女儿现就读于桂林一所大学,小女儿初三。 小爷爷家族,有五儿一女!大儿子在柳州市,上门女婿;二儿子从医,中年娶妻,东北大同人,无嗣,有养女一个,现在南宁就读大学。三儿早期教师,先在广东惠州安家,从事建筑业,有一儿一女,女儿是长女,加入石龙普平。四儿子有两儿三女,五儿子有一儿两女,均未成年。 -
中国省市数据库表-MYSQL版
最近需求中国的省市表,找了半天,终于找到了一个mysql sql文件,先记下来,有空再转成postgresql版本的。 DROP TABLE IF EXISTS `province`; CREATE TABLE `province` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(50) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=36 DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of province -- ---------------------------- INSERT INTO `province` VALUES ('1', '北京市'); INSERT INTO `province` VALUES ('2', '天津市'); INSERT INTO `province` VALUES ('3', '上海市'); INSERT INTO `province` VALUES ('4', '重庆市'); INSERT INTO `province` VALUES ('5', '河北省'); INSERT INTO `province` VALUES ('6', '山西省'); INSERT INTO `province` VALUES ('7', '台湾省'); INSERT INTO `province` VALUES ('8', '辽宁省'); INSERT INTO `province` VALUES ('9', '吉林省'); INSERT INTO `province` VALUES ('10', '黑龙江省'); INSERT INTO `province` VALUES ('11', '江苏省'); INSERT INTO `province` VALUES ('12', '浙江省'); INSERT INTO `province` VALUES ('13', '安徽省'); INSERT INTO `province` VALUES ('14', '福建省'); INSERT INTO `province` VALUES ('15', '江西省'); INSERT INTO `province` VALUES ('16', '山东省'); INSERT INTO `province` VALUES ('17', '河南省'); INSERT INTO `province` VALUES ('18', '湖北省'); INSERT INTO `province` VALUES ('19', '湖南省'); INSERT INTO `province` VALUES ('20', '广东省'); INSERT INTO `province` VALUES ('21', '甘肃省'); INSERT INTO `province` VALUES ('22', '四川省'); INSERT INTO `province` VALUES ('23', '贵州省'); INSERT INTO `province` VALUES ('24', '海南省'); INSERT INTO `province` VALUES ('25', '云南省'); INSERT INTO `province` VALUES ('26', '青海省'); INSERT INTO `province` VALUES ('27', '陕西省'); … -
中国省市数据库表-PostgreSQL版
昨晚发现了中国省市数据库表-MYSQL版,那时已经凌晨3点左右了,实在太困了,没有来得及转换成PostgreSql版本的!现在趁着刚起来,改了些sql,让它能在PostgreSql上执行,创建那两个省份和城市表。用法:首先需要在PostgreSql上创建一个数据库(可以随意命名),然后把以下的sql语句执行一遍,即可完成. -- Table: province DROP TABLE province; CREATE TABLE province ( id integer NOT NULL, "name" character varying(50), CONSTRAINT province_id PRIMARY KEY (id) ) WITH ( OIDS=FALSE ); ALTER TABLE province OWNER TO postgres; -- ---------------------------- -- Records of province -- ---------------------------- INSERT INTO province VALUES ('1', '北京市'); INSERT INTO province VALUES ('2', '天津市'); INSERT INTO province VALUES ('3', '上海市'); INSERT INTO province VALUES ('4', '重庆市'); INSERT INTO province VALUES ('5', '河北省'); INSERT INTO province VALUES ('6', '山西省'); INSERT INTO province VALUES ('7', '台湾省'); INSERT INTO province VALUES ('8', '辽宁省'); INSERT INTO province VALUES ('9', '吉林省'); INSERT INTO province VALUES ('10', '黑龙江省'); INSERT INTO province VALUES ('11', '江苏省'); INSERT INTO province VALUES ('12', '浙江省'); INSERT INTO province VALUES ('13', '安徽省'); INSERT INTO province VALUES ('14', '福建省'); INSERT INTO province VALUES ('15', '江西省'); INSERT INTO province VALUES ('16', '山东省'); INSERT INTO province VALUES ('17', '河南省'); INSERT INTO province VALUES ('18', '湖北省'); INSERT INTO province VALUES ('19', '湖南省'); INSERT INTO province VALUES ('20', '广东省'); INSERT INTO province VALUES ('21', '甘肃省'); INSERT INTO province VALUES ('22', '四川省'); INSERT INTO province VALUES ('23', '贵州省'); INSERT INTO province VALUES ('24', '海南省'); INSERT INTO province VALUES ('25', '云南省'); INSERT INTO province VALUES … -
我为什么热衷于PostgreSQL数据库
说这个问题的时候,我首先申明我并不是想挑起数据库谁优谁劣的无谓争吵;而是想说说,像我这样:平时工作大多使用MySQL MSSQL,而有独立博客的人,MySQL和PostgerSQL哪个是我比较喜欢的类型。MySQL和PostgerSQL两个数据库都是当前比较流行的开源数据库,尽管他们开源的标准不大一样,MySQL已经趋向于收费的状况,这说明它的市场占有率大,产品做的精良,背后有强大的靠山技术支持;而PostgerSQL也一直在平稳发展,在众多的社会开源开发者的努力下,版本已经到了9.0以上。一家强大公司内部研发和众多爱好者贡献代码支持,我更喜欢后者,我喜欢更纯粹的自由和共享。数据库很重要,我也很注重数据的导出导入这些备份功能,这方面MySQL做的很好,因为它的文档相当齐全,第三方的工具也很多,你有多种方式去做那方面的工作;PostgerSQL也有同样的功能,但本人的知识有限,不太会用Google,查到的文档都是几年前的东西,特别是中文方面的文档,很老的文档即使找到了,也并不是自己想要的。幸好有耐心看看官调的E文文档;目前为止只知道一两个备份的方法!但是如果自己有权限管理PostgerSQL服务器,一两个办法就已经足够了。MySQL分为好几种版本,犹如WINDOWS一样,分什么旗舰版,专业版,家庭版 服务器版...到了官网下载页面,天花乱坠的,不知道下载哪个。 PostgerSQL从某种程度来说,就一个版本。所有的功能都包囊在这个版本里,喜欢软件不分贵贱的。性能。额... 几年前,都说MySQL整体上会更快,现在呢?我也不知道,没有测试过。睁着眼睛说瞎话,像我这样在小井里的,感觉MySQL和PostgerSQL性能上没有什么明显的差别,我手头的都是小项目,做个商务网啦,做个博客啦 等等,并不知道他们的速度谁更快些?但有一次,自己的项目放在资源有限的服务器里,让我发现PostgerSQL让我等的时间,减少了,试了几次,结果还是一样。查询大量的记录,表现居然更明显;难道我没有优化MySQL,而产生的错觉?我也没有优化PostgerSQL呀!那过后,开始注意到PostgerSQL了。我喜欢物尽所用,花点钱买个内存才512M的虚拟的VPS,安装上python+nginx+PostgerSQL,让网站跑起来,包括Debian系统在内,所有内存占用不到一半;而改用MySQL,优化技巧有限,我到现在还没有办法做到PostgerSQL占用资源少的程度,即使我牺牲了一些有用的引擎,还是有点失望。PostgerSQL占用的内存少,稳定性会不会下降呢,使用了一年半载,你才能体会得到!PostgerSQL还是几年前他们说的那样,相当稳定啊...以下是本人是实际使用过程中,发现PostgerSQL的可爱之处... -
Django Ajax POST请求失败解决办法
Django到了1.2.5版本以上,Ajax POST请求的使用发生了一些改变,我们还记得前些版本1.2,Django加入了CSRF机制,大大增强了网络请求的安全性,正是因为这点,现在的Django对页面任何POST请求的数据进行跨域攻击保护。当你升级到1.2.5或更高版本后,你会发现以前1.2.4版本的Ajax POST脚本方法都不能用或者出错了,Django官网上提供了一个解决办法,加个JQuery ajaxSend事件,让你以前的Ajax Post脚本能重新正常使用起来。请看代码:$(document).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; } function sameOrigin(url) { // url could be relative or scheme relative or absolute var host = document.location.host; // host + port var protocol = document.location.protocol; var sr_origin = '//' + host; var origin = protocol + sr_origin; // Allow absolute or scheme relative URLs to same origin return (url == origin || url.slice(0, origin.length + 1) == origin + '/') || (url == sr_origin || url.slice(0, sr_origin.length + 1) == sr_origin + '/') || // or any other URL that isn't scheme relative or absolute i.e relative. !(/^(\/\/|http:|https:).*/.test(url)); } function safeMethod(method) { return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method)); } if (!safeMethod(settings.type) && sameOrigin(settings.url)) { xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken')); } }); 把以上的代码 放在你使用Ajax POST 请求的页面上,而JQuery版本要1.5.1以上。 参考文档:http://docs.djangoproject.com/en/dev/ref/contrib/csrf/#csrf-ajaxhttp://docs.djangoproject.com/en/dev/releases/1.3/#csrf-exception-for-ajax-requests -
因此该方法无法转换为存储表达式
项目中用到了C# 的Linq,今天碰到一个问题,提示这样: LINQ to Entities 不识别方法“System.DateTime Parse(System.String)”,因此该方法无法转换为存储表达式。 代码大概是这样的: result = result.Where(a => a.h.CreationDate >= DateTime.Parse(dtStart)); 也就是说我在结果集中过滤 某个时间段的记录,参数dtStart是字符的类型(框架的需要),所以表达式中引用了一个静态方法DateTime.Parse,把时间字符转成时间类型了。 查了下MSDN文档,大量的文摘,耐不住性子了,直接观察了下提示错误,把 DateTime.Parse直接挪出来了,改成: sdt = DateTime.Parse(dtStart); result = result.Where(a => a.h.CreationDate >= sdt); 把时间转换动作挪出来了,Linq终于能正常执行了!我想在linq表达式中,是不是不能使用一些静态方法呢? -
Python图片处理模块
平时用Python做web开发,上传图片是难免的,但直接拿PIL的函数来处理,总感觉有点繁琐,能不能封装些功能函数,让web上传处理图片更简便些。看了壑塥峈的《使用PIL调整图片分辨率》,得到了启发,他写的模块,主要是方便本地图片的批量处理,所以在他原来的基础上修改了一下,让它在开发web中使用。 在Django中,很容易得到file控件的值,比如file = request.FILES.get("photo",None),我就从这里出发,开始修改,把类修改成接受file参数和路径参数path,然后通过传入图片尺寸的方法,处理并保存图片,最后返回上传图片名字列表list,不多说,看看Django的views用法便知:from django.conf import settings frommyproject.common.graphicsimportGraphics defindex(request,template_name='apptest/picprocessor.html'): template_var=dict() ifrequest.method=='POST': file=request.FILES.get("photo",None) iffile: path=os.path.join(settings.MEDIA_ROOT,'apptest') resizer=Graphics(file,path) template_var["filename"]=resizer.run_cut((150,100),(300,200),(50,50),) returnrender_to_response(template_name,template_var,context_instance=RequestContext(request)) 使用该模块,你仅仅需要传入上传地址(绝对地址)和HttpRequest.FILES,初始化一下里面的Graphics类,然后使用类的方法,指定需要的尺寸tuple即可返回上传图片的名字。 Graphics类里有几个方法 是外部调用的,分别是run_cut,run_zoom_w,run_zoom_h和run_thumbnail。 run_cut:是根据你提供的尺寸,对原图片进行剪切,原图片比例和你指定的尺寸比例不相等时,程序会以原图中心为准放大缩小剪切成你需要的尺寸,图片不会拉伸。需要传入一个或多个尺寸tuple,如(150,100),(300,200),(50,50) run_zoom_w:是根据你提供的宽度,等比列缩放。方法需要传入一个或多个宽度tuple,如 150,100,200,300run_zoom_h:是根据你提供的高度,等比列缩放。方法需要传入一个或多个高度tuple,如 150,100,200,300 run_thumbnail:是传统的缩略图方法,需要传入一个或多个尺寸tuple,如(150,100),(300,200),(50,50) 这三个方法,能把原图处理成多种尺寸规格,也就是说能同时处理并上传成 多张不同尺寸的图片。图片处理的时候,全部采用Image.ANTIALIAS抗锯齿的过滤属性,保存的图片质量暂时定在100,这些都是为了保证剪切图片的时候,最大降低失真度,这样出来的图片体积就稍微大些了。图片的名字组合方式:uuid+"_"+w+"_"+h.jpg,如:ae5c011e-5e98-11e0-96e6-001a6bd081a2-600-400.jpg 具体的实现方法:#coding:utf-8 """图片上传后端处理""" __modify__ = '2goo.info' __email__ ='nmgkjdxjsj@gmail.com' VERSION = "Graphics v0.1 build 2011-03-27" import os,Image,ImageFile,uuid class Graphics: def __init__(self,uploadedfile,targetpath): '''初始化参数''' self.uploadedfile=uploadedfile self.targetpath = targetpath def check_folder(self): '''检查目标文件夹是否存在,不存在则创建之''' if not os.path.isdir(self.targetpath): os.mkdir(self.targetpath) return self.targetpath def pic_info(self, img): '''获取照片的尺寸和确定图片横竖版''' w, h = img.size if w>h: return w, h, 0 #横版照片 else: return w, h, 1 #竖版照片 def comp_ratio(self, x, y): '''计算比例.''' x = float(x) y = float(y) return float(x/y) def pic_cut(self, image, p_w, p_h): '''根据设定的尺寸,对指定照片进行像素调整 图形不会变形 如果指定尺寸比例和原图比例不 相等时,最大范围剪切''' #获取指定照片的规格,一般是1024,768 img = image w, h, isVertical = self.pic_info(img) #判断照片横竖,为竖版的话对调w,h if isVertical: p_w, p_h = p_h, p_w #如果照片调整比例合适,直接输出 if self.comp_ratio(p_h, p_w) == self.comp_ratio(h, w): target = img.resize((int(p_w), int(p_h)),Image.ANTIALIAS)#hack:高保真必备! # ANTIALIAS: a high-quality downsampling filter # BILINEAR: linear interpolation in a 2x2 environment # BICUBIC: cubic spline interpolation in a 4x4 environment return target #比例不合适就需要对照片进行计算,保证输出照片的正中位置 #算法灵感来源于ColorStrom if self.comp_ratio(p_h, p_w) > self.comp_ratio(h, w): #偏高照片的处理 #以高为基准先调整照片大小 #根据新高按比例设置新宽 p_w_n = p_h * self.comp_ratio(w,h) temp_img = img.resize((int(p_w_n), int(p_h)),Image.ANTIALIAS) #获取中间选定大小区域 c = (p_w_n - p_w)/2 #边条大小 box = (c, 0, c+p_w, p_h) #选定容器 #换成crop需要的int形参数 box = tuple(map(int, box)) target = temp_img.crop(box) return target else: #偏宽的照片 #以宽为基准先调整照片大小 p_h_n = p_w * self.comp_ratio(h, … -
Rails在Windows下开发并不友好
自己公司的硬件都是限制在windows xp下,这个阶段换成windows 7也是经过一层层的手续申请,安装linux?由于文化和商业原因,就不想提了;所以前提条件就定格在古老的windows xp上了。想在windows xp下用rails3开发,首先配置开发环境就成问题,说说遇到的问题。 ruby 1.9 windows版的已经正式发布了,一路安装下来,很顺利,自带的gem版本也足够支持rails3了;可到了安装rails3,那就有点折腾了: gem install rails 指令下xp是无法完成安装的,过程出现缺少模块,安装了缺少的模块,再继续,又提示缺少另一个模块,而且每个模块顺序还需按规定来,反正Rails包含的所有必须的模块都得一一按照顺序安装下去,rails包含一二十个必选和备选模块,你得一一了解,不然安装到最后,缺了什么你都蒙在鼓里。到了正式的开发的时候,遇到问题,折腾够了,你才发现原来缺了什么! rails3 支持多个数据库,但当你想用posgresql或者oracle mssql...在rails里算不上主流的数据库,安装数据库的引擎驱动是必须的,这又是一个折腾;这些第三方类库,多数支持的不够及时,没有出来windows版之前,你只能研究在windows下编译安装了,这不是windows环境下擅长的。 rails3 图片处理这一块,在windows下也是个问题,imagemagick和rmagick是比较常用的搭配,imagemagick是C类语言开发的,历史悠久,安装算是问题不大,而rmagick和上面提到的数据库引擎驱动一样,安装方法不是新手能一下子领悟的。 这些都是自己在windows下rails开发所遇到的问题,虽然这些都是暂时的,但对于初涉rails领域的人不能不算是脚拌石。如果在Linux osx下这些都是很简单的事情了。 -
C#的另类图片缩放
导读:在指定大小的框框内,对图片等比例缩放,你有没有碰到?有的话以下代码可能有些用。问题场景最近碰到一个客户提出一个需求:图片缩放功能,上传的图片尺寸可以是任何比例,而且有横向也有纵向的,在规定的尺寸范围内缩放,缩放后的图片不能有剪切的,缩放后图片可视比例和原图片比例相等。如果明白的话,很明显这种缩放,横向或纵向可能会留空白的边,于是把这种情况跟客户说了,客户也很明白,说可以接受。问题分析得出思路平时接触的图片缩放或剪切,都不是此类的,先在google上搜索了一下,有需求,但没有看到几个解决方案,这么来真的要自己写一些程序了,缕缕思路:首先要计算出缩放后图片的尺寸,该尺寸的长宽都在指定尺寸范围内,也就是,如果上传的图片和指定尺寸比例不等的话,不是纵向就是横向会留下空边,但不会两向都会留,因为上传的图片长宽都比指定尺寸大的话,需要把图片缩小,直至长或宽和指定的长或宽相等,如果上传的图片长宽都比指定的长宽小的话,也需要把图片放大,直至长或宽和指定的长或宽相等。开始写代码了,先把这个思想转化成代码: /// <summary> /// 给定一个矩形(长方形 正方形)剪切的范围 传入一张图片的原始尺寸 /// 得到一个在该矩形范围内的最佳尺寸(原图的比例不会变) /// add 2goo 2011-4-8 /// </summary> /// <param name="specifySize">指定尺寸</param> /// <param name="originalSize">原始尺寸</param> /// <returns>返回(原图片等比例)最佳尺寸</returns> private static Size ResizeSite(Size specifySize, Size originalSize) { Size finaSize = new Size(); float specifyScale = (float)specifySize.Width / (float)specifySize.Height; float originalScale = (float)originalSize.Width / (float)originalSize.Height; if (specifySize.Width >= originalSize.Width) { finaSize.Height = specifySize.Height; finaSize.Width = (int)(finaSize.Height * originalScale); if (finaSize.Width > specifySize.Width) { finaSize.Width = specifySize.Width; finaSize.Height = (int)(finaSize.Width / originalScale); } } else { finaSize.Width = specifySize.Width; finaSize.Height = (int)(finaSize.Width / originalScale); if (finaSize.Height > specifySize.Height) { finaSize.Height = specifySize.Height; finaSize.Width = (int)(finaSize.Height * originalScale); } } return finaSize; }后续思路只要结合指定尺寸把上传的图片的长宽计算出来,那剩下的工作就是图片的缩放处理了,写代码之前,想法大概思路是这样的:先结合刚才的代码,把图片的长宽取出来,用C#的Graphics DrawImage把图片等比列缩放成计算出来的尺寸,然后再画个新图,尺寸和指向尺寸一样,把刚才的缩放好的图片粘贴找这张新图上即可,当然这个过程,还要计算空边(有两边)的尺寸,好了写好代码如下: /// <summary> /// 缩放图片 按比例 如果指定的尺寸和原图片尺寸比例不等,会留空边 /// 2goo add 2011-04-06 /// </summary> /// <param name="postedFile">原图HttpPostedFile对象</param> /// <param name="savePath">保存图片的绝对路径 包括图片名</param> /// <param name="newWidth">指定宽度</param> /// <param name="newHeight">指定高度</param> public static void ResizeImage(System.Web.HttpPostedFile postedFile, string savePath, int newWidth, int newHeight) { //创建目录 string dir = Path.GetDirectoryName(savePath); if (!Directory.Exists(dir)) Directory.CreateDirectory(dir); //原始图片(获取原始图片创建对象,并使用流中嵌入的颜色管理信息) System.Drawing.Image originalImage = System.Drawing.Image.FromStream(postedFile.InputStream, true); int ow = originalImage.Width;//原始宽度 int oh = originalImage.Height;//原始高度 Size toSize = ResizeSite(new Size(newWidth, newHeight), new Size(ow,oh)); int towidth = toSize.Width;//原图片缩放后的宽度 int toheight = toSize.Height;//原图片缩放后的高度 int x = 0; int y = 0; x = (newWidth - towidth) / 2; y = (newHeight - toheight) … -
Django ORM捨遗--返回QuerySets的某些函数
整个Django框架,如果要问喜欢那部分,我首先想到的就是它的ORM;Django集成的ORM好用,秉承了Pythonic的理念,还有很浓的OO味道。单个看ORM的函数,似乎是管中窥豹,如果你把各种函数组合起来写,你会发现,原来也可以这么用的,太酷了吧?但还是单独看看这些函数的,等你逐个了解了,一气呵成的感觉就有了。拾遗,随意拿些函数来说说,读者只需了解,理念就形成了,有兴趣的稍微记忆下,就是自己的东西了。1.annotate说到annotate,不能提到聚合aggregate(Avg,Count,Max,Min...),因为annotate需要结合这些聚合函数,才能发挥它的作用,比如博客应用,博客和博客的回复Commnet,取出博客列表的同时,你如果也要取出回复的条数,应该怎么写呢:blogs = Blog.objects.annotate(Count('commnet'))这回取出博客列表的同时,也能取到相应的回复条数了。template中怎么取值:{%for blog in blogs%}{{blog.comment__count}}{%endfor%}你也可以该字段给个别名:blogs = Blog.objects.annotate(comment_count=Count('commnet'))这个函数,如果结合filter exclude get,出来的效果你懂的!2 valuesvalues是返回QuerySet吗?严格说是ValuesQuerySet,是QuerySet的子集。看代码:Blog.objects.values()得出的是:[{'id': 1, 'name': 'Beatles Blog', 'tagline': 'All the latest Beatles news.'},...]没有指定参数,默认会返回全部的字段字典列表。指定参数:Blog.objects.values('id', 'name')得出:[{'id': 1, 'name': 'Beatles Blog'}]在template里使用它 只需把它当成一个iterable,循环取值即可,每条记录就是一个字典,记录的属性就是实体的属性字段。值得注意的是它返回的是ValuesQuerySet,而不是QuerySet,如果你使用了values()后,再使用QuerySet的函数如filter,出现什么问题,你可以试试。3 dates顾名思义,dates是和时间有关的函数,用法:Entry.objects.dates('pub_date', 'year')结果:[datetime.datetime(2005, 1, 1),...]得出的是时间datetime列表,和values函数相似,得出的是QuerySet的子集:DateQuerySet;这个函数不好理解,如上面的Entry.objects.dates('pub_date', 'year'),是什么意思呢?其实就是取出所有博客的时间列表,参数‘year’,出来的时间列表 是以年份为依据,不会有重复年份,月份和日期默认是1;比如众多blog中,有几万条,发表时间当然不止同一年的,该语句出来 :[datetime.datetime(2005, 1, 1),datetime.datetime(2006, 1, 1),datetime.datetime(2007, 1, 1),datetime.datetime(2008, 1, 1),...]嗯,时间列表,在template用,你应该知道了!参数 field kind order,形如:Entry.objects.dates('pub_date', 'day', order='DESC')field就是实体的一个时间字段,kid就是 year month day,order就是排序 desc asc,好理解吧?如果你还有疑问:我们想取出博客的所有月份,怎么写? 呃,试试这样:Blog.objects.dates('pub_date', 'month', order='DESC')...结果:[datetime.datetime(2005, 1, 1),datetime.datetime(2005, 2, 1),... ,datetime.datetime(2006, 4, 1),...,datetime.datetime(2008, 6, 1),...]但如果想取所有日期列表呢?唉,有必要吗?dates用途,你平时见到的归档 都是按照年份或者月份归档的,如果按照日期归档,该网站的文摘更新速度不是一般的快哦!还是有办法的:Blog.objects.dates('pub_date', 'day', order='DESC')...4 deferdefer是个好函数,有时候一个实体有过多的字段,取实体或者实体列表的时候,占用了多大的内存,而你却不需要取出全部的字段,比如博客的正文内容,你不需要立即检索数据库,这时defer就是你需要的东西。defer函数与前面讲的values有区别的,前者返回的是ValuesQuerySet,而defer返回的是QuerySet对象,这意味着,使用了defer后,你还可以结合QuerySet其他的函数,让整个语句结合更多的条件;Django的ORM除了做得OO,还很注重性能的。如果取博客的文章列表,让容量很大的正文和副标题在数据库层不进行检索,看看代码:Blog.objects.defer("content", "subtitle")defer的用法还比较多,比如:my_queryset=Blog.objects.select_related().defer("commnet__content", "commnet__pic")以上的语句说明,获取博客表和回复表,他们两表是使用了内连接,获取的时候,让回复表不检索回复内容和图片。select_related之前记得有说过,是一次性表关联。如果你想再原来语句获取到的实体列表上取消某些字段的延时,可以通过这样的用法取消延时,让数据库立即检索全部字段:my_queryset.defer(None)还有很多的defer组合用法,需要自己去慢慢体会了。5 onlyonly很多程度上和defer是同一类的东西,可以理解为defer的相反函数吧。比如Person实体里有三个字段:name age birthday,下面这两条语句是等价的:Person.objects.defer("age", "biography")Person.objects.only("name")好了就写到这里了,周末愉快. -
Django外键的删除
Django 1.3版本以后,对models外键进行了扩展,记得之前models的外键删除,都是级联删除的,举个例子好理解:Cateogry和Blog关系,Cateory有多个Blog,所以常常在Blog实体里新建一个category的外键,当我们删除一个Category的时候,归属该Category的所有Blog,同时都被删除了,这就是级联删除了。有个题外话,Django的models和底层的数据库联系很密切,models之间创建的关联,都直接映射到数据库,是真正的物理关联,个人觉得这种方式,有利有弊,好的方面就是更好保持了数据的一致性;感觉不好的是,这样数据库的表之间都建立物理关联,开发过程中建立models的时候,最好想好了表的关联,不然后面models加关联,需要在数据库上手动去关联,而且如果想在数据库操作数据的时候,需要考虑这些关联,不然你可能遇到一些关联的问题。在Rails上,这点都是在程序级上定义models关联,数据库并没有是正的物理关联。既然要用Django,应该先抛开这些,接受它的设计理念,才不会有困惑。Django 1.3 models之间关联还是保存原来的做法,当你删除一个外键的时候,外键关联的实体也被删除,但在创建models的时候,外键增加了一个可选参数on_delete。今天看看它的用法:class Blog(models.Model): user = models.ForeignKey(User, blank=True, null=True, on_delete=models.SET_NULL) ...当blog对应的user被删除了,blog里的user字段会设置为空值,而不是连同blog也删除掉,这点比原先的进了一小步,有点选择性了。当然,如果没有指定on_delete,Django还是采用级联的删除方式。on_delete有多少个选项呢:CASCADE:这就是默认的选项,级联删除,你无需显性指定它。PROTECT: 保护模式,如果采用该选项,删除的时候,会抛出ProtectedError错误。SET_NULL: 置空模式,删除的时候,外键字段被设置为空,前提就是blank=True, null=True,定义该字段的时候,允许为空。SET_DEFAULT: 置默认值,删除的时候,外键字段设置为默认值,所以定义外键的时候注意加上一个默认值。SET(): 自定义一个值,该值当然只能是对应的实体了,看一下代码:def get_sentinel_user(): return User.objects.get_or_create(username='deleted')[0] class MyModel(models.Model): user = models.ForeignKey(User, on_delete=models.SET(get_sentinel_user))以上的代码,当删除mymodel对应的user的时候,mymodel不会删除掉,而是找到一个名叫 deleted的user,与之重建关联。 -
PostgreSQL数据库完美备份恢复
PostgreSQL自带一个客户端pgAdmin,里面有个备份,恢复选项,也能对数据库进行备份 恢复(还原),但最近发现数据库慢慢庞大的时候,经常出错,备份的文件过程中出错的几率那是相当大,手动调节灰常有限。所以一直寻找完美的备份恢复方案。梦里寻他千百度,伊人却在灯火阑珊处...其实PostgreSQL内置不少的工具,寻找的备份恢复方案就在其中:pg_dump,psql。这两个指令在数据库的安装目录下,比如我自己本地安装的,路径形如:C:\Program Files\PostgreSQL\9.0\;然后进入到bin文件夹,会看到不少的exe文件,这就是PostgreSQL内置的工具了。里面会找到pg_dump.exe,psql.exe两个文件。我们怎么用他们?用法:备份数据库,指令如下:pg_dump -h 164.82.233.54 -U postgres databasename > C:\databasename.bak开始-运行-cmd 弹出dos控制台;然后 在控制台里,进入PostgreSQL安装目录bin下:cd C:\Program Files\PostgreSQL\9.0\bin最后执行备份指令:pg_dump -h 164.82.233.54 -U postgres databasename > C:\databasename.bak指令解释:如上命令,pg_dump 是备份数据库指令,164.82.233.54是数据库的ip地址(必须保证数据库允许外部访问的权限哦~),当然本地的数据库ip写 localhost;postgres 是数据库的用户名;databasename 是数据库名。> 意思是导出到C:\databasename.bak文件里,如果没有写路径,单单写databasename.bak文件名,那么备份文件会保存在C:\Program Files\PostgreSQL\9.0\bin 文件夹里。恢复数据库,指令如下:psql -h localhost -U postgres -d databasename < C:\databasename.bak指令解释:如上命令,psql是恢复数据库命令,localhost是要恢复到哪个数据库的地址,当然你可以写上ip地址,也就是说能远程恢复(必须保证数据库允许外部访问的权限哦~);postgres 就是要恢复到哪个数据库的用户;databasename 是要恢复到哪个数据库。< 的意思是把C:\databasename.bak文件导入到指定的数据库里。以上所有的是针对windows而言的,如果在linux下,会不会有效?在linux里依然有效。有一个值得注意的是:如果直接进入PostgreSQL的安装目录bin下,执行命令,可能会出现 找不到pg_dump,psql的现象,我们在可以这样:备份:/opt/PostgreSQL/9.0/bin/pg_dump -h 164.82.233.54 -U postgres databasename > databasename.bak恢复:/opt/PostgreSQL/9.0/bin/psql -h localhost -U postgres -d databasename < databasename.bak好了就写这么多了。 -
用OSQA搭建一个问答社区
在海外,问答社区相当盛行,stackoverflow和quora两个知名的社区都很火。在中国,有“百度知道”,但“百度知道”所涉及到的内容范围五花八门,作为程序员,有时候很希望有个中国版的stackoverflow,一个纯粹的中文IT问答社区。问答社区对整个IT社区还是有优势的,比如:和篇幅长而又有内涵的博客相比,你可以更直接更专注于问题和答案本身,更有效率地解决问题(当然问答和博客的作用本质还是有点区别)。基于种状况,一直想搭建一个良好的IT问答社区,类似stackoverflow的网站。得益于OSQA开源项目,今天终于把它部署到服务器上:http://5-wow.com 。在此声明,本文需要大家的理解,请不要马上断言本文是软文、广告之类的,OSQA和5-wow.com本身并没有任何的商业成份,是个非盈利的问答社区,本人只是想尝试借助开源项目来服务国内的IT社区,让热爱IT技术的朋友群力群策,聚在一起探讨解决问题;如果你觉得事情本身还有点意义,请别向我仍石头,鸡蛋之类的。 OSQA开源项目很简洁,整个项目大概就是几千行代码,“麻雀虽小而五脏俱全”,基本实现了问答操作所需的功能,包括答案的评论、回复和投票;还有就是会员的积分统计功能。这些细节功能组在一起,很适合问答社区中使用,每个人进来都是社区的一份子,所有的问答都是会员自己监督和管理,内容的质量完全由社区掌控,所以一旦会员参与,就会意识到自己就是管理员。积分统计功能,是通过奖牌榜形式来表现,奖牌暂时细分成30多种奖项,看奖牌榜,别人很容易发现自己所擅长的领域,可能有些爵位很适合自己...整个问答社区就这样潜移默化地把权重分配给会员,同时会员的影响力也渐渐发挥出来了。问答社区里的东西简单而又不失乐趣,欢迎新老程序员加入到 5-wow.com IT问答社区来,有问题 没有问题的时候,进来看看,到时候你就会发现:在IT社区里,其实自己还是有某种魅力和影响力的。 -
让PostgreSQL9支持外部IP连接
PostgreSQL9默认是不允许外部IP链接的,这和多数的数据库一样,是一种保护策略。有时候,我们需要开启,让外部的客户端链接,对数据库进行操作。做法也很简单,找到PostgreSQL的安装路径,liunx默认的安装路径可能在 /opt/PostgreSQL/9.0,我们进入/opt/PostgreSQL/9.0/data/目录下,找到pg_hba.conf配置文件,找到以下的行:# IPv4 local connections: host all all 127.0.0.1/32 md5改成:# IPv4 local connections: #host all all 127.0.0.1/32 md5 host all all 0.0.0.0 0.0.0.0 md5然后重启PostgreSQL9数据库 service postgresql-9.0 restart 即可。官方并不推荐我们的做法,主要是为了数据的安全,避免外部对数据库进行攻击,修改的时候,切记要谨慎。 -
Django环境搭建常用的工具及做法
自己购买了个廉价的vps,部署Django开发的网站,汲取强大互联网的信息,结合自己需要的环境尝试去搭配,从中把最常用的工具和命令记录下来。服务器我选择Debian,觉它更适合自己。Debian自带主流版本的Python,最先要安装的是easy_install 和pip,因为这两个工具,可以方便安装python所需要的类库。安装方法:apt-get install python-pip pip install easy_install pip install -U virtualenv我们只需要给python安装基本的类库即可,比如上面的pip easy_install和virtualenv等即可,其他和django项目紧密相关的,而因django项目不同而不用的类库,我们采用virtualenv工具具体安装就好了,比如:Django psycopg MySQLdb simplejson python-openid flup html5lib simplejson等。这样的做的好处很多,这些类库版本都不断更新,我们具体的项目具体安装具体的版本,而不会影响全局的python环境,把他们都集中在一个项目中。而且可以使用pip把这些虚拟环境的类库清单生成一个txt文件,然后再通过pip一键式安装到位。开始我们的环境搭建之旅吧。我们创建一个django虚拟环境:virtualenv --no-site-packages --distribute twogoo cd twogoo source bin/activate此时,已经进入虚拟环境,接下来就是使用pip或者easy_install安装项目的类库了,如:pip install django pip install psycopg pip install flup ...我们目前在项目环境文件twogoo下,当下建立项目程序文件夹myprojectmkdir myproject我们已经安装了flup,如果要启动fastcgi,在虚拟环境中启动想要的端口(9090或者其他的)即可:python myproject/manage.py runfcgi method=threaded host=127.0.0.1 port=9090启动了fastcgi,如果我们修改了程序,想再重启,使用以上的命令是无效的,我们需要关闭掉9090端口,再重新启动:python myproject/manage.py runfcgi method=threaded host=127.0.0.1 port=9090查看端口的PID,关闭掉端口的办法:netstat -anp|grep 9090 #(端口号)这时PID会列举出来,比如PID是8920,我们kill掉它kill 8920刚才说通过pip一键式安装虚拟环境,办法是先导出环境的类库列表:pip freeze > req.txt这时会生成req.txt文件,里面是具体的类库名和版本号,格式如下:Django==1.3 Markdown==2.0.3 PIL==1.1.7 South==0.7.3 distribute==0.6.15 django-debug-toolbar==0.8.5 flup==1.0.3.dev-20110405 html5lib==0.90 psycopg2==2.4.1 python-openid==2.2.5 simplejson==2.1.6 wsgiref==0.1.2我们再根据req.txt文件,创建一个wow项目虚拟环境:cd ../ pip install -E wow -r twogoo/req.txt此时会创建一个wow文件夹,里面和twogoo环境是一模一样的。如果要退出虚拟环境,请使用:deactivate -
小区里的事件
凌晨4点,先是两个人的大吵大闹,然后是一个女人的哀嚎,过后又变为阴森恐怖的狂笑,小孩子的哭声也跟着时大时小,到早上5点,天蒙蒙亮了,小区里有清洁工扫地的声音,那些可怕的声音也跟着变小消失,天也亮了。只要凌晨醒来都会听到一些莫名其妙的声音,不知道是认为制造还是真实存在。 之前也有过类似的情况,比如:一个女的拼命拍门叫开门,要么就是一个人嚎啕痛苦,也有过某个不知道是男是女的人一个晚上在学鬼叫。最还在凌晨醒来,只要醒来都会听到这样的声音,挺可怕的。不知道是认为制造还是真实存在,总感觉某天会发生什么更可怕的事。 -
ubuntu11.04编译安装nginx1.0.4
在ubuntu下,一直都是采用sudo apt-get intall nginx命令方式来安装nginx,由于ubuntu源里的nginx版本有点旧,如果想换成最新版本的版本,只能采用编译的方式去升级了。升级nginx的办法很多实践博文,这里推荐一个:http://www.inginx.com/nginx-update/最近nginx1.0出来后,版本更新的很勤,打开官网发现版本已经升级到1.0.4,参考李高峰的笔记:http://www.ligaofeng.com/?p=1107 尝试来个全新编译,把遇到的问题也记下来:1 卸载原有陈旧的nginx:sudo aptitude remove nginx如果没有安装aptitude,安装它:sudo apt-get install aptitude2 编译安装nginx之前的准备,需要三大类库:PCRE,OpenSSL,zlib,要下载各自的源码,编译安装他们,过程中尝尽了苦头,结尾总结一下:PCRE的官网:http://www.pcre.org来到用户目录下,下载最新版本,解压 配置 编译 安装:cd ~wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.12.tar.gztar zxvf pcre-8.12.tar.gzcd pcre-8.12sudo ./configure --prefix=/usr/local/pcresudo make sudo make install总结:按照以上命令必能安装成功,因为安装的过程中需要新建一系列的目录,常常发生权限的问题,这次碰到程序在新建/usr/local/pcre文件夹时,没有权限,解决办法:sudo mkdir /usr/local/pcresudo chmod -v-R 777 /usr/local/pcre要参考具体问题解决他们,安装完成,可以把该文件夹权限恢复原样。OpenSSL官网:http://www.openssl.org来到用户目录下,下载最新版本,解压 配置 编译 安装:cd ../wget http://www.openssl.org/source/openssl-1.0.0d.tar.gztar zxvf openssl-1.0.0d.tar.gzcd openssl-1.0.0dsudo ./configsudo make sudo make install总结:同样是新建文件夹openssl的时候,没有权限,按照pcre的办法,解决他们。zlib官网:http://www.zlib.net来到用户目录下,下载最新版本,解压 配置 编译 安装:cd ../wget http://www.gzip.org/zlib/zlib-1.2.3.tar.gztar zxvf zlib-1.2.3.tar.gzcd zlib-1.2.3sudo ./configuresudo make sudo make install总结:同样是新建文件夹的时候,没有权限,按照pcre的办法,解决他们。3 安装NginxNginx官网:http://www.nginx.org来到用户目录下,下载最新版本,解压 配置 编译 安装:cd ../wget http://nginx.org/download/nginx-1.0.4.tar.gztar zxvf nginx-1.0.4.tar.gzcd nginx-1.0.4新建一个nginx组和nginx组下的nginx用户:groupadd nginxuseradd -r -g nginx nginx配置nginx模块,请参考Nginx官网的配置:http://wiki.nginx.org/NginxInstallOptions,简单配置一下模块,当然可以找到相应的help:./configure --help废话少说,来个简单的配置:sudo ./configure --with-http_stub_status_module --prefix=/usr/local/nginx --with-openssl=~/openssl-1.0.0d --with-pcre=~/pcre-8.12 --without-http_gzip_modulesudo make sudo make install配置总结:原以为安装了PCRE OpenSSL,在配置Nginx时,把路径直接指向到安装路径下,结果并不是,指向的是源码路径下,如刚才把PCRE OpenSSL下载在用户目录下~/,配置:--with-openssl=~/openssl-1.0.0d --with-pcre=~/pcre-8.12如果配置成:--with-openssl=/usr/local/ssl/ --with-pcre=/user/local/pcre安装会失败,这个值得注意的。如果安装完成,nginx会安装在指定/usr/local/nginx目录下,看看简单帮助,然后启动一下nginx:/usr/local/nginx/sbin/nginx -h>>nginx: nginx version: nginx/1.0.4nginx: Usage: nginx [-?hvVtq] [-s signal] [-c filename] [-p prefix] [-g directives]Options: -?,-h : this help -v : show version and exit -V : show version and configure options then exit -t : test configuration and exit -q : suppress non-error messages during configuration testing -s signal : send signal to a master process: stop, quit, reopen, reload -p prefix : set prefix path (default: /usr/local/nginx/) -c filename : set configuration file (default: conf/nginx.conf) -g directives : set global directives out of configuration file好,知道怎么启动重启nginx了:/usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx -s … -
Django和Ajax的那些事儿-Ajax Get
如果看过Jquery的ajax文档,很容易在各平台使用他们,ajax也不算是什么新鲜的事了,在Django中结合Jquery使用Ajax,让Django开发的应用发挥更好的用户体验,同时降低服务器的负担,也不是难事。来看Jquery下Ajax的使用说明,http://api.jquery.com/category/ajax/,哗,有十几个函数,如果想更生动学习,请移步到lulu studio:http://www.cnblogs.com/QLeelulu/archive/2008/04/21/1163021.html以下只挑jQuery.get() jQuery.post() jQuery.getJSON()三个函数来做例子,Django应用围绕这三个函数讲解:jQuery.get()也可以更简洁为:$.get(),官文使用例子:$.get('ajax/test.html', function(data) { $('.result').html(data); alert('Load was performed.'); });例子$.get()两个参数,一个url和一个函数,函数处理返回数据data。data到底是什么,alert出来的内容便是了。它是url返回的html代码,django提供url,返回一个html页面,比如一篇博客的标题和内容的html片段,然后$.get()对html进行处理,把html片段填充到一个div容器中,那就构成了一个完整的ajax get操作了,代码表演吧:定义一个url函数,根据blog id返回一篇博客html片段:url(r'^ajax_get_one_blog/$', 'ajax_get_one_blog',name="ajax_get_one_blog"),views定义ajax_get_one_blog python函数:def ajax_get_one_blog(request,template_name="blog/ajax_get_one_blog.html"): ctx=dict() id=request.GET.get("id") blog=get_object_or_404(Article,pk=int(id)) ctx["obj"]=blog return render_to_response(template_name,ctx,context_instance=RequestContext(request))其中ajax_get_one_blog的request.GET.get("id")是通过$.get()提供:function get_one_blog(id) { var container = $('#blog_container'); container.html("loading..."); $.get('{%url ajax_get_one_blog%}',{'id':id}, function(ret) { container.html(ret); }); }通过$.get()的第二个参数{'id':id}给服务器端函数ajax_get_one_blog提供id参数,第一个参数是url,第三个函数function(ret),已经从服务器端返回了html片段,最后填充到div中,整个无刷新过程就算完毕。人口当然是客户端的一个a链接:<a href="javascript:get_one_blog({{obj.id}})">{{obj.title}}</a>好,又到11点了,这次的ajax get操作就讲到这里了,剩下下回分解吧,最后会附上博文的 代码例子。 -
Asp.net Ajax页面和JQuery的ready函数冲突
Asp.net Ajax和Asp.net结合得很完美,发现不够用的时候,难免想到了Jquery。一般Jquery和Asp.net Ajax这两样东西结合使用也常见,如果处理好的话,并不会冲突。但最近发现Jquery的ready()函数在PostBack回来的时候,ready里执行的动作竟然无效了,第一印象:会不会Asp.net Ajax和Jqueryd的ready冲突了,然后去掉Asp.net Ajax脚本的引用,果然一切正常了。思前思后,最后给Asp.net Ajax ScriptManager添加一个add_endRequest(),Jquery的ready终于恢复正常了。脚本如下:<script type="text/javascript"> Sys.WebForms.PageRequestManager.getInstance() .add_endRequest(EndRequestHandler); function EndRequestHandler(sender, args) { if (args.get_error() == undefined) { PageInit(); } } function PageInit() { $(document).ready(function() { //TODO }); } PageInit(); </script>其中,添加上这段代码,还有一些注意的事项,如果这段脚本放置在head里,会发生一个错误,提示Sys对象undefined,因为Asp.net Ajax的ScriptManager,还没有状态完,Sys对象肯定找不到,这时把这脚本放置在body末尾,一切都正常了。 -
Django和Ajax的那些事儿-Ajax Post
上回的《Django和Ajax的那些事儿-Ajax Get》,讲过$.get(),它是从Django服务端获取我们想要的数据,然后渲染到前端html。今天说到Post方式,葫芦画瓢,让人想:会不会有$.post()。嗯,没错,的确有$.post(),官网示例:$.post("test.cgi", { name: "John", time: "2pm" }, function(data){ alert("Data Loaded: " + data); } );不妨说说,$.post()和传统form下的post动作是一样的,是把form里的各表单值提交给服务端。但$.post()是在前端触发,把数据提交给服务器端,整个过程都是无刷新的。官网示例就很清楚说明这个过程:$.post()把{ name: "John", time: "2pm" }这两个数据,提交给test.cgi,让test.cgi在服务端处理后返回data给自己进一步处理(示例把返回的数据alert出来)。这回通过添加一篇博客,来看看Django下结合JQuery Ajax Post是怎么做的。为了更好说明,下面的例子尽量要简单。博客只有标题和内容,这次的任务就是使用JQuery把页面的输入的标题和内容,提交给Django保存到数据库,整个过程要做到不刷新。看看前端的js代码:function post_one_blog() { msg=$("#msg"); title=$('#id_title').val(); content=$('#id_content').val(); msg.html("submit..."); $.post('{%url ajax_add%}',{'title':title,'content':content}, function(ret) { if(ret=='1'){ msg.html("提交成功!"); } else if(ret=="2"){ msg.html("请输入标题和内容!"); } else{ msg.html("系统错误!"); } }); }前期工作是,获取页面上三个元素对象:用于提示的span标签,博客标题,正文的输入框。这三个对象到后面,将给$.post()调用。这段代码核心部分是$.post()整个函数,我们给它传了一个服务端的url(保存数据到数据库的页面)和两个Post参数{'title':title,'content':content},在服务端处理后,会返回“1” “2”..等这些标识(这个任由自己定义,只要明白当中的意义即可),最后$.post()获取到服务端返回的标识,根据它们判断服务端处理的怎么样了,再给出适当的提示。看看服务端的处理方法:def ajax_add(request): response=HttpResponse() response['Content-Type']="text/javascript" title=request.POST.get("title",'') content=request.POST.get("content",'') ret="0" if title and content: blog=Article(title=title,content=content,user=request.user) blog.save() ret="1" else: ret="2" response.write(ret) return response幸好Python拥有简洁的语法,一看就大概知道什么意思来了。因为刚才是想服务端给我们返回简单的字符串如“1”“2”此类的标识即可,所以首先确定返回的内容格式为"text/javascript",然后再接收js给post过来的数据{'title':title,'content':content},怎么接收呢?看看代码:title=request.POST.get("title",'') content=request.POST.get("content",''),因为js提交数据的行为是Post方式,我们自然使用Djanog提供的request.POST.get()方法来获取,题外话,如果js是采用Get方式,我们应该能想到使用request.GET.get()方法。注意大小写。python区分大小写的。接下来,判断接收到的两个参数都不为空,才构造一个博客对象,保存它,返回“1”;否则返回“2”。这时候整个动作都完成了。这些做好后,你可能急着测试,并发现了404之类的错误,其实在Django 1.2之后使用Post方式数据提交,都涉及到了安全性的问题,Django默认打上了CSRF中间件,你需要在post页面上加一些代码,让程序正常使用:$(document).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; } function sameOrigin(url) { // url could be relative or scheme relative or absolute var host = document.location.host; // host + port var protocol = document.location.protocol; var sr_origin = '//' + host; var origin = protocol + sr_origin; // Allow absolute or scheme relative URLs to same origin return (url == origin || url.slice(0, origin.length + 1) == origin + '/') || (url == sr_origin || url.slice(0, …