Another small project with django/Ajax/Mysql/Highcharts. 看下效果圖 - delivery dashboard .嘿嘿 是否是還蠻好看的。html
廢話很少說。在過程當中遇到的問題總結:前端
1. Ajax URL 請求403 錯誤:mysql
是因爲CSRF(Cross-site request forgery跨站請求僞造請求保護)的緣由。目前有三種方法ajax
1.1 我使用的是@csrf_exempt加在相應的view前,可是這樣不安全,是關閉csrf保護功能。sql
(view裏引入包,setting里加入MIDDLEWARE_CLASSES數據庫
view.py: from django.views.decorators.csrf import csrf_exempt setting.py: 'django.middleware.csrf.CsrfViewMiddleware',
1.2 好像是在模板提交區域里加{% csrf_token %}?不是特別明白,我先建起來,這個之後再研究,pendingdjango
1.3 略json
2. MYSQL/JSON 日期格式的問題數組
由於django從mysql裏讀取出來的日期格式爲datetime.date(2015, 4, 28),對於轉換成JSON到前臺或者其餘操做都是有問題的安全
def date_handler(obj): return obj.isoformat() if hasattr(obj, 'isoformat') else obj #hasattr()方法是查找是否包含該屬性,返回爲boolean類型
simplejson.dumps(數組,default=date_handler)
simplejson.loads(數組)
上面date.isoformat()的意思是 返回格式如'YYYY-MM-DD' 的字符串。 由於Python沒有像R同樣的apply功能,目前暫時使用json裏function將數組裏的數據轉換成
'YYYY-MM-DD' 的字符串
3. 使用2個不同的數據庫:
在setting中設置,好比加一個新的other(使用的是test數據庫):在view裏運行raw_query時,
<table_name>.objects.using('other').raw(raw_sql_line)
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'alert', 'USER': 'root', 'PASSWORD': '1234', 'HOST': '', 'PORT': '3306', }, 'other': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'test', 'USER': 'root', 'PASSWORD': '1234', 'HOST': '', 'PORT': '3306', } }
4.Highcharts/AJAX的數據傳輸問題
1. 除了字符串,但彷佛帶結構的好比數組,字典都沒法傳到前臺,惟獨JSON數據結構。因此沒辦法後臺view使用json.dump先把數據結構化。
而後在前臺使用{{變量|safe}}的方式能夠將其傳入前端。
2. Ajax/highcharts動態刷新
由於render_to_response 只能返回html的數據對於Javascript框架的hcharts很差操做。這裏咱們可使用 HttpResponse
from django.http import HttpResponse
return HttpResponse(<JSON_DATA>,content_type='application/json')
以爲比較神奇的事情是highcharts裏傳入的竟然直接是JSON數據格式的,以前我用jsonstrify來轉換成string一直不行,最後直接傳入居!然!可!以!
前臺js/ajax:
$.post("/cn_aj_res/",{"p":p},function(data){ $('#container-top').highcharts(data); });
後臺view.py:
cn_json={'title': {'text': '',},'xAxis': {'categories': 變量,'tickInterval': 1 },'yAxis': {'title': {'text': 'Missing SLA Silo number'},'min':0,'max':60,'plotLines': [{'value': 0,'width': 1,'color': '#808080',}]},'legend': {'layout': 'vertical','align': 'right','verticalAlign': 'middle','borderWidth': 0},'series': [{'name': 'Include Weekend','data': 變量},{'name': 'Exclude Weekend','data': 變量}]}
#注意此處的變量不能夠是JSON格式的,不然以後的整個cn_json轉成json時,會有問題,若是變量以前是json,先json.loads成普通
cn_json = simplejson.dumps(cn_json)
return HttpResponse(cn_json,content_type='application/json')
5. JSON數據真的是屌。。
5.1 好比你想傳幾組數據到前臺,把數據都合併到一個JSON對象中,再分別在前臺進行調用。好比:
#後臺view.py json_data ={'cn_json_line':cn_json_line} json_data = simplejson.dumps(json_data) return HttpResponse(json_data,content_type='application/json') #前臺引用變量時 $('#container-top').highcharts(data.cn_json_line);
5.2 highchart_pie數據:
v_pie=simplejson.dumps(v_pie.items())
v_pie = simplejson.loads(v_pie)
須要JSON函數導一下,我也以爲好奇怪。可是若是你不搞,一些字符前面會有 "\" 在前面,會然Highchart顯示不出來,好奇怪!
6. not enough arguments for format string
%Y%M%D 應該寫成 "%%Y-%%m-%%d"