请问各位大神 如何用Ppython djangoo写一个新闻管理系统

5404人阅读
python web眾多有django、web.py、Tornado 、Pylons...
這麼多的框架學哪一個呢?我想與其隻了解一些眾多框架表面的使用技巧
還不如深入了解某一框架的核心, 所以就從最簡單的web.py開始吧,
看了一下web.py源代碼,發現要深入了解web.py還得從WSGI開始
所以花了幾天的的時間深入了解了一下WSGI
WSGI是什麼
WSGI(Web Server Gateway Interface)是一種規范
參見PEP 333 http://www.python.org/dev/peps/pep-0333/
WSGI Server有哪些
比如 Django、CherryPy 都自带 WSGI server 主要是测试用途, 发布时则使用生产环境的 WSGI server
而有些 WSGI 下的框架比如 pylons、bfg 等, 自己不实现 WSGI server。使用 paste 作为 WSGI server
CherryPy's WSGI server.
Python自帶的 wsgiref
WSGI application
一个接口与两个参数
application(environ, start_response)
#! /usr/bin/env python
# Our tutorial's WSGI server
from wsgiref.simple_server import make_server
def application(environ, start_response):
# Sorting and stringifying the environment key, value pairs
response_body = ['%s: %s' % (key, value)
for key, value in sorted(environ.items())]
response_body = '\n'.join(response_body)
status = '200 OK'
response_headers = [('Content-Type', 'text/plain'),
('Content-Length', str(len(response_body)))]
start_response(status, response_headers)
return [response_body]
# Instantiate the WSGI server.
# It will receive the request, pass it to the application
# and send the application's response to the client
httpd = make_server(
'localhost', # The host name.
8051, # A port number where to wait for the request.
application # Our application object name, in this case a function.
httpd.serve_forever()
wsgiref的simple_server說明
server的主要作用是接受client的請求,並把的收到的請求交給RequestHandlerClass處理,
RequestHandlerClass處理完成後回傳結果給client
WSGIServer繼承關系
WSGIServer--&HTTPServer--&SocketServer.TCPServer--&BaseServer
主要處理流程
serve_forever
& _handle_request_noblock()
&&& process_request
&&&&& finish_request--& RequestHandlerClass()
&&&&& close_request
serve_forever循環接受client請求, 如果有請求來,
經finish_request方法把請求交給RequestHandlerClass處理,
RequestHandlerClass調用handle()方法處理request,
WSGIRequestHandler的handle()方法把request又交給ServerHandler處理,
ServerHandler調用run執行application方法, 回傳綱頁的結果(含http header及綱頁內容)給client
WSGIRequestHandler繼承關系
WSGIRequestHandler--&BaseHTTPRequestHandler--&StreamRequestHandler--&BaseRequestHandler
BaseRequestHandler主要方法及處理流程
1、setup()
2、handle()
3、finish()
WSGIRequestHandler主要方法及處理流程
1、get_environ 增加env
2、handle (override)
&&&&&&& handler = ServerHandler
&&&&&&& handler.run(self.server.get_app())
ServerHandler繼承關系
ServerHandler--&SimpleHandler--&BaseHandler
& setup_environ
& self.result = application(self.environ, self.start_response)
& self.finish_response
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:148129次
积分:2932
积分:2932
排名:第4403名
原创:145篇
转载:49篇
评论:35条
(1)(3)(3)(1)(1)(1)(1)(1)(1)(1)(5)(11)(11)(14)(11)(4)(5)(6)(11)(14)(1)(2)(1)(5)(7)(6)(1)(2)(9)(3)(3)(14)(8)(4)(8)(6)(3)(3)(2)请先注册/登陆!
直接发微博申请就可以了, @ilove学习网Stephen,写明你的用户名,课程名,课程链接,并@三个好友,好友不要和以前的重复哦,每天傍晚会有人统一延期。
另外,也请关注微信公共号: ilove学习网,会通知您不定期的免费公开课,新技术,等等...
直接发微博申请就可以了, @ilove学习网Stephen,写明你的用户名,课程名,课程链接,并@三个好友,好友不要和以前的重复哦,每天傍晚会有人统一开通课程。
另外,也请关注微信公共号: ilove学习网,会通知您不定期的免费公开课,新技术,等等...
15分钟内购买第二门课程,我们将于当晚返还第一门课的30%现金到你账户!,购买第三门课,再返还第一门课价格30%到你账户!您只有这一次机会哦! 只有第一次购买课程才享有这样的特别优惠!(学习卡充值购买课程不算哦,也不和其他优惠同时享有)
你买过该课程了,请点击你想学的课程开始学习,不要重复购买
1)先给账户充值:【我的账户】->【支付宝充值】
2)充值完毕后,再回来购买课程
不要着急,请留言公共微信号:ilove学习网,告诉我们你的问题。
页面左上角->【我的账户】->【信息修改】
先发个简短的主题,说申请学习XXX后续课程,或者什么事情就可以了,不要把细节写在主题帖里面。发完主题贴后,点击主题贴进去,再追加细节的东西,或者链接地址,或者代码什么的。
这部分课程还没有开通,请点击页面最下面黄色按钮,咨询请联系微信公共号: ilove学习网
1)请等到视频中间没有圆圈在旋转的时候,再点击播放.
2)请使用支持HTML5的最新版本的浏览器。
3)目前不支持firefox(不支持mp4)
3)也可能是网络问题,请换个时间再试。
4)如果视频很卡,可以先卡卡的放一篇,然后在看
5)如果是文件不能下载,请告诉我们
6)如有其他问题请联系微信公共号: ilove学习网
Python Django实战通用班
Python是目前非常火的一门语言,Google的很多产品都使用了Python。Django是Python上最流行的第三代快速开发框架,就像Ruby on Rails或者Grails on Groovy一样。国外很多知名的网站都是用Django开发的,比如Pinterest,Instagram等等。Django还有个非常大的优势,是在后台系统,一个复杂的系统,后台的开发有时候占一半的工作量,而Django在后台开发上是最酷的一个!Django+Python绝对是一个强大组合。
【课程内容】:实战开发一个Django项目【课程特点】:速成,实用,深入简出,道理讲的很明白;【所需基础】:需要有面向对象,网站运行机制,网站开发常识,html基础。如果没有的话,可以在学习本课程的过程中,同步学习我们的相关课程,这样反而有利于学习一些本来难懂的逻辑概念。【学习完毕水平】:能够开发Django项目,掌握常用的Django技术.
100-总体介绍
Stephen Huang加拿大西安大略大学软件工程硕士,加拿大西安大略大学有超过一百三十多年的学术积累,被誉为“加拿大的哈佛”,在加综合排名前三。在加拿大期间,获得全额奖学金和助教资格,用英文教授学生计算机软件方面的课程,并且发表多篇软件工程的论文在国际软件期刊上。
在多家大型跨国公司或高科技软件公司工作10多年,历任项目经理,总监,执行总监,副总裁等职务, 并给中国银联等多家大型开发机构做技术培训和咨询。
我们精心研究技术,录制视频,尽最大的努力向学员提供最好的软件技术课程,如果你在学习中遇到困难,老师也提供一对一的辅导,帮你解决在学习过程中遇到的任何问题,我们保证在最短的时间里,教会你这门技术!教不会你,全额退款!
老师个人微信;hg8008, 全天及时回复; 微信公共号: ilove学习网, 主要用于重要通知,比如免费公开课,课程开通等;新浪微博: @ilove学习网Stephen,腾讯微博: @huangguan7992。
你们的课程有什么特点?
短小精悍,道理透彻,没有废话,让你在最短的时间掌握技术。非常实用,学完立即可以学以致用。
我是新手,不知道该从哪门课程开始学习。
请咨询老师个人微信;hg8008, 我们会根据你的具体情况,免费帮你制定一个学习计划。
有不懂的问题可以问你们吗?
当然可以,如果有必要,老师还会对你远程协助。
为什么课程视频编号不是连续的?
编号不连续方便随时中插入新的课件,还有很多实战练习是没办法显示在课件列表中的,另外,老师会根据每个学员的情况,帮你增加必要的内容,这部分也是没显示在课件列表中。
每个视频大概多长时间?
没有具体记录,因为不重要。我们视频最大特点是短小精悍,道理透彻,没有废话,让你在最短的时间掌握技术。
有没有实战项目啊?
有的有有的没有,这个世界没有绝对,不是任何情况下都要讲项目的,我们会根据情况采取最优教学方法。
什么是实战班,什么是框架班?
实战班讲的是实战项目,一步一步带着你开发实战项目,快速掌握这门技术,也培训项目分析能力。框架班是把这门技术框架深入的讲解,技术难度比实战班大,需要你有一定基础,学完后水平比实战班高。
现在还能申请免费学习吗?
请注册我们网站,并关注我们微信公共号 ilove学习网,如果有活动,会通知的。
Python Django实战通用班
精心研究,精心录制,最好的软件技术课程,保证在最短的时间教会你!学不会全额退款!
有效期:,次数:,有效期是希望大家尽快学完,没有压力,就没有动力。次数限制是为了让大家看视频更加顺畅,如果不设限,有人恶意不断点击,导致负载过大,正常学习的同学无法看视频,所以请理解,只要是自己正常学习,不借账号给别人,会免费帮你延期,免费增加次数的。人艰不拆+多多理解+和谐社会
关注微博@ilove学习网Stephen, 腾讯微博@huangguan7992, 新课程上线通知。
密码:, 请在这里下载,确保版本一致,这样有技术问题, 方便我们帮你解决。
如果比较长,先在这写一个简短的标题,提交,然后点击问题后面的按钮【0个回答】进去,再添加详细内容。
Copyright (C) 2012- All rights reserved. ilove学习网 版权所有&&virusswb 的BLOG
用户名:virusswb
文章数:204
评论数:167
访问量:198284
注册日期:
51CTO推荐博文
在开发博客系统或者是电商系统,总之,凡是带有回复、评论、回帖之类针对一个内容进行回复的功能的时候,现在几乎全部都是采用ajax异步提交,并且同步在正确的位置显示提交结果,而不是在提交之后重新刷新整个页面来显示提交之后的内容。
ajax由于google的使用,被广为推广。它在客户端使用javascript语言编写,使用XMLHttpRequest对象,实现和服务的数据交互,详细信息参看:。
ajax提交或者获取数据,常用数据形式包括:
普通文本,自己定义规则,自己解析,无成熟类库,需要自己编写。
xml文本,使用xml解析器解析,有成熟类库。
json文本,流行的数据形式,以体积小、灵活而著称,有成熟类库。
ajax有几个好处:
防止页面刷新,因为提交的只是一部分内容,页面大部分内容没有发生改变,如果还是刷新进而重新获取全部的话,对于服务器和客户端都是一种负担。而且页面刷新还会产生其他问题,诸如重复提交之类的。
减轻服务器负担,可以为更多人提供服务。
也有一些缺点:
给编程和调试带来一些小麻烦,不够使用习惯了,还是有一些方法和窍门的。
由于是ajax,所以页面地址没有变化,所以如果想分享地址的话,难以实现。需要做额外的工作,例如把地址打印出来,让用户复制分享。
用户不容易知道自己的提交正在进行,因为页面没有刷新,用户可能会重新点击提交按钮。这也可以解决,提交过程给出明显提示,然后灰掉提交按钮,或者做一些防止重复提交的工作。
今天的例子是博客评论的异步提交,环境是python2.7+django1.2+SAE。
下面是后台的处理代码,view中的代码
&&&&&&&&&&&&&&&&&&&&&&@csrf_exempt&&&&&&&&&&&&&&&&&&def&comment_new(request,blog_id):&&&&&blog=get_object_or_404(Blog,pk=blog_id)&&&&&&&&&&&&&&&if&request.method==&POST&&and&request.is_ajax():&&&&&&&&&title=request.POST['comment_title']&&&&&&&&&name=request.POST['comment_author_name']&&&&&&&&&email=request.POST['comment_author_email']&&&&&&&&&url=request.POST['comment_author_url']&&&&&&&&&content=request.POST['comment_content']&&&&&&&&&comment=Comment(title=title,author_name=name,author_email=email,author_url=url,content=content);&&&&&&&&&comment.blog=blog&&&&&&&&&comment=comment.save()&&&&&&&&&&_dict={}&&&&&&&&&_dict[&title&]=title&&&&&&&&&_dict[&author_name&]=name&&&&&&&&&_dict[&author_email&]=email&&&&&&&&&_dict[&author_url&]=url&&&&&&&&&_dict[&content&]=content&&&&&&&&&&&_dict[&created_at&]=unicode(datetime.datetime.now())&&&&&&&&&&&&&&&return&HttpResponse(simplejson.JSONEncoder().encode(str(_dict)))&&&def&obj2dict(obj):&&&&&&&&&&&&&memberlist&=&[m&for&m&in&dir(obj)]&&&&&_dict&=&{}&&&&&for&m&in&memberlist:&&&&&&&&&if&m[0]&!=&&_&&and&not&callable(m):&&&&&&&&&&&&&_dict[m]&=&getattr(obj,m)&&&&&&return&_dict&
下面是前段页面的代码
&type=&text/javascript&&src=&/site_static/js/tiny_mce_jquery/tiny_mce.js&&&type=&text/javascript&&src=&/site_static/js/textareas_simple.js&&&{%&if&comments&%}&&Comments:&&id=&blog_comments&&{%&for&comment&in&comments&%}&&&href=&{{&comment.author_url&}}&{{&comment.author_name&}}&&Said&at&{{&comment.created_at&}}&&&Title:&{{&comment.title&}}&&&&&&&Content:&&&&&{%&autoescape&off&%}&&&&&{{&comment.content&}}&&&&&{%&endautoescape&%}&&&&{%&endfor&%}&&&&&{%&else&%}&you&are&the&first&comment&man,&please!&{%&endif&%}&&New&Comment:&&type=&text/javascript&&&&&&$(document).ready(function(){&&&&&&&&&$(&#comment_form&).submit(function(e){&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&var&data=$('#comment_form').serialize();&&&&&&&&&&&&&&&&&&&&&&&&&&$.ajax({&&&&&&&&&&&&&&&&&url:&/blog/{{&blog.id&}}/comment/new/&,&&&&&&&&&&&&&&&&&type:&POST&,&&&&&&&&&&&&&&&&&contentType:&application/&charset=utf-8&,&&&&&&&&&&&&&&&&&dataType:&json&,&&&&&&&&&&&&&&&&&data:data,&&&&&&&&&&&&&&&&&success:function(data,&textStatus,&jqXHR){&&&&&&&&&&&&&&&&&&&&&//alert(typeof(data));&&&&&&&&&&&&&&&&&&&&&datadata=data.replace(/'/gi,&\&&);&&&&&&&&&&&&&&&&&&&&&datadata=data.replace(/u&/gi,&\&&);&&&&&&&&&&&&&&&&&&&&&//alert(data);&&&&&&&&&&&&&&&&&&&&&var&obj=$.parseJSON(data);&&&&&&&&&&&&&&&&&&&&&//alert(obj.content);&&&&&&&&&&&&&&&&&&&&&$(&#blog_comments&).append(&&href=\&&+obj.author_url+&\&&+obj.author_name+&&&Said&at&&+obj.created_at+&&+obj.title+&&+obj.content+&&);&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&$(&#comment_form&)[0].reset();&&&&&&&&&&&&&&&&&},&&&&&&&&&&&&&&&&&error:function(jqXHR,&textStatus,&errorThrown){&&&&&&&&&&&&&&&&&&&&&alert(textStatus);&&&&&&&&&&&&&&&&&&&&&alert(errorThrown);&&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&});&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&return&&&&&&&&&&&});&&&&&});&&&&&&&&method=&post&&action=&&&id=&comment_form&&&&&&&{%&csrf_token&%}&&&&&&&&&&{%&comment&%}&&&&&{%&for&field&in&comment_form&%}&&&&&&&&&&&&&&{{&field.errors&}}&&&&&&&&&{{&field.label_tag&}}:{{&field&}}&&&&&&&&&&{%&endfor&%}&&&&&&&&&&&&&&{%&endcomment&%}&&&&&&&&&&&&for=&comment_title&{{&comment_form.title.label&}}:&&&&&&type=&text&&id=&comment_title&&name=&comment_title&&&placeholder=&Title&&&&&&{{&comment_form.title.help_text&}}&&&&&&&&&&&&&&&&&&&&&for=&comment_author_name&{{&comment_form.author_name.label&}}:&&&&&&type=&text&&id=&comment_author_name&&name=&comment_author_name&&placeholder=&author&name&&&&&&{{&comment_form.author_name.help_text&}}&&&&&&&&&&&&&&&&&&&&&for=&comment_author_email&{{&comment_form.author_email.label&}}:&&&&&&type=&text&&id=&comment_author_email&&name=&comment_author_email&&&placeholder=&author&email&&&&&&{{&comment_form.author_email.help_text&}}&&&&&&&&&&&&&&&&&&&&&for=&comment_author_url&{{&comment_form.author_url.label&}}:&&&&&&type=&text&&id=&comment_author_url&&name=&comment_author_url&&&placeholder=&author&url&&&&&&{{&comment_form.author_url.help_text&}}&&&&&&&&&&&&&&&&&&&&&for=&comment_content&{{&comment_form.content.label&}}:&&&&&&rows=&10&&cols=&50&&placeholder=&content&&id=&comment_content&&name=&comment_content&&&&&&&&&&&{{&comment_form.content.help_text&}}&&&&&&&&&&&&&&&&&&&&&&&&&&&&&type=&submit&&value=&Save&&&&&&
在客户端用到了三个类库,分别是,和。
jquery是一个javascript类库,封装了javascript的很多操作,使用方便。
jquery.json是jquery的一个扩展,用来处理json文本和object之间的转换。
jquery.placeholder是jquery的一个扩展,用来实现在输入框没有内容的时候,添加一些提示信息。在输入框没有内容的时候,显示一些内容,提示你应该输入什么,输入的格式是什么。【placeholder是html5支持的一个属性,专门用来做提示的。】
datadata=data.replace(/'/gi,&\&&);&&datadata=data.replace(/u&/gi,&\&&);&&
前段页面的上面这两句需要大家注意,第一句用正则表达式替换【单引号】为【双引号】,第二句替换【u+双引号】为【双引号】。这都是为了后面使用
$.parseJSON(data);
做准备的。因为python后台返回的json字符串,也就是data的值是下面的格式
{'title':u'blog1','author':u'andyshi'}&
字符串中有单引号和u,这都需要替换,jquery解析的json必须是标准格式的,就是双引号,而且不能包含其他内容,所以我进行了替换,然后才可以使用jquery.json进行解析。
u是因为python后台返回的是unicode字符串的缘故。应该有办法解决,待我再研究一下,稍后补充上来。
之前ajax返回的数据还需要处理单引号和字母u的问题,现在修正一下。
首先将前端的ajax代码变更为
$.ajax({&&&&&&&&&&&&&&&&&url:&/blog/{{&blog.id&}}/comment/new/&,&&&&&&&&&&&&&&&&&type:&POST&,&&&&&&&&&&&&&&&&&contentType:&application/&charset=utf-8&,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&data:data,&&&&&&&&&&&&&&&&&success:function(data,&textStatus,&jqXHR){&&&&&&&&&&&&&&&&&&&&&&var&obj=$.parseJSON(data);&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&$(&#blog_comments&).append(&&p&&a&href=\&&+obj.author_url+&\&&&+obj.author_name+&&/a&&&Said&at&&+obj.created_at+&&/p&&p&&+obj.title+&&/p&&p&&+obj.content+&&/p&&hr&&);&&&&&&&&&&&&&&&&&&&&&$(&#comment_form&)[0].reset();&&&&&&&&&&&&&&&&&},&&&&&&&&&&&&&&&&&error:function(jqXHR,&textStatus,&errorThrown){&&&&&&&&&&&&&&&&&&&&&alert(textStatus);&&&&&&&&&&&&&&&&&&&&&alert(errorThrown);&&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&});&&
很明显,就是去掉了ajax参数dataType,返回的结果变成在服务端组织好的json字符串,然后用jquery.json解析成对象。顺便里面的两次替换就可以去掉了。
python后台的view代码变更为
@csrf_exempt&&&&&&&&&&&&&&&&&&&def&comment_new(request,blog_id):&&&&&blog=get_object_or_404(Blog,pk=blog_id)&&&&&&&&&&&&&&&if&request.method==&POST&&and&request.is_ajax():&&&&&&&&&title=request.POST['comment_title']&&&&&&&&&name=request.POST['comment_author_name']&&&&&&&&&email=request.POST['comment_author_email']&&&&&&&&&url=request.POST['comment_author_url']&&&&&&&&&content=request.POST['comment_content']&&&&&&&&&comment=Comment(title=title,author_name=name,author_email=email,author_url=url,content=content);&&&&&&&&&comment.blog=blog&&&&&&&&&comment=comment.save()&&&&&&&&&&&&&&&&&&&return&HttpResponse(&{\&title\&:\&%s\&,\&author_name\&:\&%s\&,\&author_email\&:\&%s\&,\&author_url\&:\&%s\&,\&content\&:\&%s\&,\&created_at\&:\&%s\&}&&&&&&&&&&&%&(title,name,email,url,content,unicode(datetime.datetime.now())))&
直接返回我们自己构造的字符串,构造的时候就使用双引号拼接。这样就给前台省去了正则替换的操作。
&本文出自 “” 博客,请务必保留此出处
了这篇文章
类别:┆阅读(0)┆评论(0)
16:17:05 15:24:59virusswb 的BLOG
用户名:virusswb
文章数:204
评论数:167
访问量:198284
注册日期:
51CTO推荐博文
在开发博客系统或者是电商系统,总之,凡是带有回复、评论、回帖之类针对一个内容进行回复的功能的时候,现在几乎全部都是采用ajax异步提交,并且同步在正确的位置显示提交结果,而不是在提交之后重新刷新整个页面来显示提交之后的内容。
ajax由于google的使用,被广为推广。它在客户端使用javascript语言编写,使用XMLHttpRequest对象,实现和服务的数据交互,详细信息参看:。
ajax提交或者获取数据,常用数据形式包括:
普通文本,自己定义规则,自己解析,无成熟类库,需要自己编写。
xml文本,使用xml解析器解析,有成熟类库。
json文本,流行的数据形式,以体积小、灵活而著称,有成熟类库。
ajax有几个好处:
防止页面刷新,因为提交的只是一部分内容,页面大部分内容没有发生改变,如果还是刷新进而重新获取全部的话,对于服务器和客户端都是一种负担。而且页面刷新还会产生其他问题,诸如重复提交之类的。
减轻服务器负担,可以为更多人提供服务。
也有一些缺点:
给编程和调试带来一些小麻烦,不够使用习惯了,还是有一些方法和窍门的。
由于是ajax,所以页面地址没有变化,所以如果想分享地址的话,难以实现。需要做额外的工作,例如把地址打印出来,让用户复制分享。
用户不容易知道自己的提交正在进行,因为页面没有刷新,用户可能会重新点击提交按钮。这也可以解决,提交过程给出明显提示,然后灰掉提交按钮,或者做一些防止重复提交的工作。
今天的例子是博客评论的异步提交,环境是python2.7+django1.2+SAE。
下面是后台的处理代码,view中的代码
&&&&&&&&&&&&&&&&&&&&&&@csrf_exempt&&&&&&&&&&&&&&&&&&def&comment_new(request,blog_id):&&&&&blog=get_object_or_404(Blog,pk=blog_id)&&&&&&&&&&&&&&&if&request.method==&POST&&and&request.is_ajax():&&&&&&&&&title=request.POST['comment_title']&&&&&&&&&name=request.POST['comment_author_name']&&&&&&&&&email=request.POST['comment_author_email']&&&&&&&&&url=request.POST['comment_author_url']&&&&&&&&&content=request.POST['comment_content']&&&&&&&&&comment=Comment(title=title,author_name=name,author_email=email,author_url=url,content=content);&&&&&&&&&comment.blog=blog&&&&&&&&&comment=comment.save()&&&&&&&&&&_dict={}&&&&&&&&&_dict[&title&]=title&&&&&&&&&_dict[&author_name&]=name&&&&&&&&&_dict[&author_email&]=email&&&&&&&&&_dict[&author_url&]=url&&&&&&&&&_dict[&content&]=content&&&&&&&&&&&_dict[&created_at&]=unicode(datetime.datetime.now())&&&&&&&&&&&&&&&return&HttpResponse(simplejson.JSONEncoder().encode(str(_dict)))&&&def&obj2dict(obj):&&&&&&&&&&&&&memberlist&=&[m&for&m&in&dir(obj)]&&&&&_dict&=&{}&&&&&for&m&in&memberlist:&&&&&&&&&if&m[0]&!=&&_&&and&not&callable(m):&&&&&&&&&&&&&_dict[m]&=&getattr(obj,m)&&&&&&return&_dict&
下面是前段页面的代码
&type=&text/javascript&&src=&/site_static/js/tiny_mce_jquery/tiny_mce.js&&&type=&text/javascript&&src=&/site_static/js/textareas_simple.js&&&{%&if&comments&%}&&Comments:&&id=&blog_comments&&{%&for&comment&in&comments&%}&&&href=&{{&comment.author_url&}}&{{&comment.author_name&}}&&Said&at&{{&comment.created_at&}}&&&Title:&{{&comment.title&}}&&&&&&&Content:&&&&&{%&autoescape&off&%}&&&&&{{&comment.content&}}&&&&&{%&endautoescape&%}&&&&{%&endfor&%}&&&&&{%&else&%}&you&are&the&first&comment&man,&please!&{%&endif&%}&&New&Comment:&&type=&text/javascript&&&&&&$(document).ready(function(){&&&&&&&&&$(&#comment_form&).submit(function(e){&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&var&data=$('#comment_form').serialize();&&&&&&&&&&&&&&&&&&&&&&&&&&$.ajax({&&&&&&&&&&&&&&&&&url:&/blog/{{&blog.id&}}/comment/new/&,&&&&&&&&&&&&&&&&&type:&POST&,&&&&&&&&&&&&&&&&&contentType:&application/&charset=utf-8&,&&&&&&&&&&&&&&&&&dataType:&json&,&&&&&&&&&&&&&&&&&data:data,&&&&&&&&&&&&&&&&&success:function(data,&textStatus,&jqXHR){&&&&&&&&&&&&&&&&&&&&&//alert(typeof(data));&&&&&&&&&&&&&&&&&&&&&datadata=data.replace(/'/gi,&\&&);&&&&&&&&&&&&&&&&&&&&&datadata=data.replace(/u&/gi,&\&&);&&&&&&&&&&&&&&&&&&&&&//alert(data);&&&&&&&&&&&&&&&&&&&&&var&obj=$.parseJSON(data);&&&&&&&&&&&&&&&&&&&&&//alert(obj.content);&&&&&&&&&&&&&&&&&&&&&$(&#blog_comments&).append(&&href=\&&+obj.author_url+&\&&+obj.author_name+&&&Said&at&&+obj.created_at+&&+obj.title+&&+obj.content+&&);&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&$(&#comment_form&)[0].reset();&&&&&&&&&&&&&&&&&},&&&&&&&&&&&&&&&&&error:function(jqXHR,&textStatus,&errorThrown){&&&&&&&&&&&&&&&&&&&&&alert(textStatus);&&&&&&&&&&&&&&&&&&&&&alert(errorThrown);&&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&});&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&return&&&&&&&&&&&});&&&&&});&&&&&&&&method=&post&&action=&&&id=&comment_form&&&&&&&{%&csrf_token&%}&&&&&&&&&&{%&comment&%}&&&&&{%&for&field&in&comment_form&%}&&&&&&&&&&&&&&{{&field.errors&}}&&&&&&&&&{{&field.label_tag&}}:{{&field&}}&&&&&&&&&&{%&endfor&%}&&&&&&&&&&&&&&{%&endcomment&%}&&&&&&&&&&&&for=&comment_title&{{&comment_form.title.label&}}:&&&&&&type=&text&&id=&comment_title&&name=&comment_title&&&placeholder=&Title&&&&&&{{&comment_form.title.help_text&}}&&&&&&&&&&&&&&&&&&&&&for=&comment_author_name&{{&comment_form.author_name.label&}}:&&&&&&type=&text&&id=&comment_author_name&&name=&comment_author_name&&placeholder=&author&name&&&&&&{{&comment_form.author_name.help_text&}}&&&&&&&&&&&&&&&&&&&&&for=&comment_author_email&{{&comment_form.author_email.label&}}:&&&&&&type=&text&&id=&comment_author_email&&name=&comment_author_email&&&placeholder=&author&email&&&&&&{{&comment_form.author_email.help_text&}}&&&&&&&&&&&&&&&&&&&&&for=&comment_author_url&{{&comment_form.author_url.label&}}:&&&&&&type=&text&&id=&comment_author_url&&name=&comment_author_url&&&placeholder=&author&url&&&&&&{{&comment_form.author_url.help_text&}}&&&&&&&&&&&&&&&&&&&&&for=&comment_content&{{&comment_form.content.label&}}:&&&&&&rows=&10&&cols=&50&&placeholder=&content&&id=&comment_content&&name=&comment_content&&&&&&&&&&&{{&comment_form.content.help_text&}}&&&&&&&&&&&&&&&&&&&&&&&&&&&&&type=&submit&&value=&Save&&&&&&
在客户端用到了三个类库,分别是,和。
jquery是一个javascript类库,封装了javascript的很多操作,使用方便。
jquery.json是jquery的一个扩展,用来处理json文本和object之间的转换。
jquery.placeholder是jquery的一个扩展,用来实现在输入框没有内容的时候,添加一些提示信息。在输入框没有内容的时候,显示一些内容,提示你应该输入什么,输入的格式是什么。【placeholder是html5支持的一个属性,专门用来做提示的。】
datadata=data.replace(/'/gi,&\&&);&&datadata=data.replace(/u&/gi,&\&&);&&
前段页面的上面这两句需要大家注意,第一句用正则表达式替换【单引号】为【双引号】,第二句替换【u+双引号】为【双引号】。这都是为了后面使用
$.parseJSON(data);
做准备的。因为python后台返回的json字符串,也就是data的值是下面的格式
{'title':u'blog1','author':u'andyshi'}&
字符串中有单引号和u,这都需要替换,jquery解析的json必须是标准格式的,就是双引号,而且不能包含其他内容,所以我进行了替换,然后才可以使用jquery.json进行解析。
u是因为python后台返回的是unicode字符串的缘故。应该有办法解决,待我再研究一下,稍后补充上来。
之前ajax返回的数据还需要处理单引号和字母u的问题,现在修正一下。
首先将前端的ajax代码变更为
$.ajax({&&&&&&&&&&&&&&&&&url:&/blog/{{&blog.id&}}/comment/new/&,&&&&&&&&&&&&&&&&&type:&POST&,&&&&&&&&&&&&&&&&&contentType:&application/&charset=utf-8&,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&data:data,&&&&&&&&&&&&&&&&&success:function(data,&textStatus,&jqXHR){&&&&&&&&&&&&&&&&&&&&&&var&obj=$.parseJSON(data);&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&$(&#blog_comments&).append(&&p&&a&href=\&&+obj.author_url+&\&&&+obj.author_name+&&/a&&&Said&at&&+obj.created_at+&&/p&&p&&+obj.title+&&/p&&p&&+obj.content+&&/p&&hr&&);&&&&&&&&&&&&&&&&&&&&&$(&#comment_form&)[0].reset();&&&&&&&&&&&&&&&&&},&&&&&&&&&&&&&&&&&error:function(jqXHR,&textStatus,&errorThrown){&&&&&&&&&&&&&&&&&&&&&alert(textStatus);&&&&&&&&&&&&&&&&&&&&&alert(errorThrown);&&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&});&&
很明显,就是去掉了ajax参数dataType,返回的结果变成在服务端组织好的json字符串,然后用jquery.json解析成对象。顺便里面的两次替换就可以去掉了。
python后台的view代码变更为
@csrf_exempt&&&&&&&&&&&&&&&&&&&def&comment_new(request,blog_id):&&&&&blog=get_object_or_404(Blog,pk=blog_id)&&&&&&&&&&&&&&&if&request.method==&POST&&and&request.is_ajax():&&&&&&&&&title=request.POST['comment_title']&&&&&&&&&name=request.POST['comment_author_name']&&&&&&&&&email=request.POST['comment_author_email']&&&&&&&&&url=request.POST['comment_author_url']&&&&&&&&&content=request.POST['comment_content']&&&&&&&&&comment=Comment(title=title,author_name=name,author_email=email,author_url=url,content=content);&&&&&&&&&comment.blog=blog&&&&&&&&&comment=comment.save()&&&&&&&&&&&&&&&&&&&return&HttpResponse(&{\&title\&:\&%s\&,\&author_name\&:\&%s\&,\&author_email\&:\&%s\&,\&author_url\&:\&%s\&,\&content\&:\&%s\&,\&created_at\&:\&%s\&}&&&&&&&&&&&%&(title,name,email,url,content,unicode(datetime.datetime.now())))&
直接返回我们自己构造的字符串,构造的时候就使用双引号拼接。这样就给前台省去了正则替换的操作。
&本文出自 “” 博客,请务必保留此出处
了这篇文章
类别:┆阅读(0)┆评论(0)
16:17:05 15:24:59

我要回帖

更多关于 django book 的文章

 

随机推荐