在開發部落格系統或者是電商系統,總之,凡是帶有回複、評論、回帖之類針對一個內容進行回複的功能的時候,現在幾乎全部都是採用ajax非同步提交,並且同步在正確的位置顯示提交結果,而不是在提交之後重新重新整理整個頁面來顯示提交之後的內容。
ajax由於google的使用,被廣為推廣。它在用戶端使用javascript語言編寫,使用XMLHttpRequest對象,實現和服務的資料互動,詳細資料參看:AJAX - 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) #str(request.raw_post_data) 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): """ summary: 將object轉換成dict類型 """ 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