python Web開發架構-Django (2),python-django

來源:互聯網
上載者:User

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.