python Web開發架構-Django (2),python-django
接上篇文章,介紹一些實用的技巧和注意點。首次用MarkDown編輯,感覺行空隙太大,不是那麼好看。
GET/POST
前後端會有資料互動,使用JQuery來實現get/post請求
GET
方法1:通過Regex匹配url傳遞參數
$.ajax({ type:"GET", url:"/search/serviceInfo/" + $('#servicename').val() + "/", dataType: 'json',//預期伺服器返回的資料類型,我喜歡用json,當然你可以用xml/text/responseXML等 success: function(msg) { //擷取服務端返回的資料 var logNames = msg['logName'];//讀取json中的欄位 document.getElementById('logs').innerHTML = logNames; },});
通過url路徑傳遞參數,需要urls.py配置
//urls.pyurlpatterns = patterns('', (r'^search/serviceInfo/(.+)/$', 'searchText.getServiceInfo'),)//searchText.pydef getServiceInfo(request, servicename): result = {} //something about servicename return HttpResponse(json.dumps(result))
方法2:request parameter
//.ajax同上url:"/search/searchLog/?offset=" + tmpOffset + "&count=" + pageCount//後台擷取參數,視圖函數def searchLog(request): offset = request.GET.get('offset'); count = request.GET.get('count'); //something
POST
提交表單或者上傳資料往往用post
//前端jslogConf = {};//something$.ajax({ type:"POST", url:"/setting/updschema/", data:JSON.stringify(logConf), dataType:'json', success: function(msg) { //something } });//後台py接收def addSchema(request): conf = json.loads(request.body) #中文轉換,前端過來的資料是unicode格式,需要一次轉碼 logSchema.servicename = conf["servicename"].encode('utf8') logSchema.fields = json.dumps(conf['fields']) logSchema.monitorLines = json.dumps(conf['lines']) //something...
json對象和字串的轉換:在js和python中,json對象對應的是字典、序列,各指令碼語言都提供的有字串轉為字典/序列對象、對象轉為json串的方法。
//jsJSON.stringify(obj)將JSON轉為字串JSON.parse(string)將字串轉為JSON對象//pythonjson.dumps(obj)JSON轉為字串json.loads(str)字串轉為JSON
CSRF: Cross Site Request Forgery跨站請求偽造,為了確保請求的真實性django提供了防止csrf攻擊的方法,在post時需要請求帶上csrf token。所以使用post時會遇到csrf相關的錯誤,請求被拒絕。正規解決辦法見django csrf protection。
背景程式員做的web服務多是內部使用,提供一個繞開csrf的方法。修改settings.py關掉csrf驗證,如下
MIDDLEWARE_CLASSES = ( //....注釋掉下面這行 #'django.middleware.csrf.CsrfViewMiddleware', //....)
資料返回
//後端返回頁面或json資料#返回新頁面return render_to_response('current_datetime.html')#返回json資料,result是一個字典return HttpResponse(json.dumps(result))
log使用
在settings.py中設定log
import loggingfrom logging.handlers import *from logging import Formatterroot = logging.getLogger()if len(root.handlers) == 0: #日誌路徑 filename = os.path.join(BASE_DIR,'log/tulip.log').replace('\\','/') #日誌格式 format = '%(asctime)s %(levelname)s %(module)s.%(funcName)s Line:%(lineno)d %(message)s' #歸檔切換 rotate = TimedRotatingFileHandler(filename,"midnight",1,5) fmt = Formatter(format) rotate.setFormatter(fmt) root.addHandler(rotate)#log level,如下debug及其以上都會顯示root.setLevel(logging.DEBUG)
在後台python中就可以直接使用log了:
import logginglogging.info(str)logging.debug(str)logging.warn(str)#....
前端
模板:搜bootstrap模板,可以看到很多漂亮簡潔的前端模板
jquery:
//樣式管理$('#servicenameErr').addClass('has-error');$('#servicenameErr').removeClass('has-error');//取值servicename = $('#servicename').val();//ajax$.ajax({});
HTML DOM:
//清除selector的option,很簡單喲document.getElementById("logName").length = 0;//表格行刪除document.getElementById('fieldTable').deleteRow(index);//表格行增加row =document.getElementById('fieldTable').insertRow(index);row.innerHTML = "xxx";//遍曆表格var fieldRows = document.getElementById('fieldTable').rows;for (var i = 1; i < fieldRows.length; ++i) { var cells = fieldRows[i].cells; name = cells[0].childNodes[0].value;//儲存格中有個input控制項}//設定控制項內容document.getElementById('xxx').innerHTML="";//可以帶html標籤document.getElementById('xxx').innerText ="";//純文字
一款漂亮的alert-toastr:
toastr.options['positionClass'] = 'toast-top-center';toastr.options['timeOut'] = "1000";toastr.success('配置成功');
一款好用的日曆控制項-My97DatePicker
//注意到在onclick指出了日曆的調用、日期格式、以及取值限制<script language="javascript" type="text/javascript" src="/static/My97DatePicker/WdatePicker.js"></script><input id="startTime" type="text" placeholder="起始時間" onClick="WdatePicker({dateFmt:'yyyy-MM-dd HH:mm:ss',maxDate:'#F{$dp.$D(\'endTime\')}'})"/><input id="endTime" type="text" placeholder="終止時間" onClick="WdatePicker({dateFmt:'yyyy-MM-dd HH:mm:ss',minDate:'#F{$dp.$D(\'startTime\')}'})"/>
參考資料
Django book: http://djangobook.py3k.cn/2.0/
Django下載:https://www.djangoproject.com/download/
bootstrap前端架構:http://www.bootcss.com/
JQuery:http://www.w3school.com.cn/jquery/
HTML DOM:http://www.w3school.com.cn/htmldom/
toastr:https://github.com/CodeSeven/toastr
My97DatePicker:http://www.my97.net/
django csrf:https://docs.djangoproject.com/en/dev/ref/csrf