django 后台与前端js数据交互对ajax封装
2014-07-16 15:24
751 查看
1、首先定义一个js数组,对业务逻辑进行分类,如二手电子市场来说,有二手单车模块、二手电器模块、二手书籍模块等。
var models = [
{ modelName:"bicycleApi",remoteUrl:'/remote/bicycleApi/'},
{ modelName:"equipmentApi",remoteUrl:'/remote/equipmentApi/'}
]
2、js封闭ajax方法
(function($){
var remote = china.nameSpace("remote");
var models = window.models || [];
for (var i = 0; i < remoteUrls.length; i++) {
var modelName = models[i]['modelName'];
var remoteUrl = models[i]['remoteUrl'];
var initRemoteClass = function(modelName, remoteUrl) {
remote[viewName] = {};
remote[viewName].c = function(method, params, dataType, async) {
if ( typeof params == 'undefined') params = {};
if (!dataType) { dataType = "json"; }
if(async !== false){async = true}
var _params = $.toJSON( typeof params === "function" ? params() : params);
var url = remoteUrl + method + '/';
return $.ajax({
url : url,
type : "POST",
async : async,
data : {
params : _params
},
dataType : dataType
});
};
remote[viewName].rc = function(method, params) {
if ( typeof params == 'undefined')
params = {};
var url = remoteUrl + method + '/';
var readConfig = {
url : url,
type : 'post',
dataType : "json",
data : {
params : typeof (params) == 'function' ? function() {
return $.toJSON(params())
} : $.toJSON(params)
}
}
return readConfig;
};
};
initRemoteClass(modelName, remoteUrl);
}
})(jQuery);
3、在django urls.py里添加如下配置
import json
apiClasses = [
bicycleApi,
equipmentApi
]
def getApiClasses(clsName):
for apiCls in apiClasses:
if apiCls.__name__ == clsName:
return apiCls
return None
def _loadParams(request, pname):
q = request.REQUEST.get(pname, "{}")
q = json.loads(q)
return q
def remoteView(request, apiClsName, methodName):
cls = getApiClasses(apiClsName)
if not cls:raise Exception("Can't find remote api class [%s]" % apiClsName)
if cls and hasattr(cls, methodName):
params = _loadParams(request, 'params')
inst = cls()
inst.request = request
m = getattr(inst, methodName)
params = dict([[str(k), v] for k, v in params.items()])
rs = m(**params)
return HttpResponse(json.dumps(rs))
raise Exception("Can't find remote method[%s] with api class [%s]" % (methodName, apiClsName))
urlpatterns = patterns('',
(r'^remote/(?P<apiClsName>\w*)/(?P<methodName>[a-zA-Z]+\w*)/', remoteView)
)
bicycleApi类实现业务逻辑,如:
#coding=utf-8
class bicycleApi(object):
def getAllBicycleS(money=None):
pass
4、然后
bicycleApi、equipmentApi 实现后台逻辑
5、这样子后,js代码编写如下代码就只可以远程调用后台方法了
《完》
var models = [
{ modelName:"bicycleApi",remoteUrl:'/remote/bicycleApi/'},
{ modelName:"equipmentApi",remoteUrl:'/remote/equipmentApi/'}
]
2、js封闭ajax方法
(function($){
var remote = china.nameSpace("remote");
var models = window.models || [];
for (var i = 0; i < remoteUrls.length; i++) {
var modelName = models[i]['modelName'];
var remoteUrl = models[i]['remoteUrl'];
var initRemoteClass = function(modelName, remoteUrl) {
remote[viewName] = {};
remote[viewName].c = function(method, params, dataType, async) {
if ( typeof params == 'undefined') params = {};
if (!dataType) { dataType = "json"; }
if(async !== false){async = true}
var _params = $.toJSON( typeof params === "function" ? params() : params);
var url = remoteUrl + method + '/';
return $.ajax({
url : url,
type : "POST",
async : async,
data : {
params : _params
},
dataType : dataType
});
};
remote[viewName].rc = function(method, params) {
if ( typeof params == 'undefined')
params = {};
var url = remoteUrl + method + '/';
var readConfig = {
url : url,
type : 'post',
dataType : "json",
data : {
params : typeof (params) == 'function' ? function() {
return $.toJSON(params())
} : $.toJSON(params)
}
}
return readConfig;
};
};
initRemoteClass(modelName, remoteUrl);
}
})(jQuery);
3、在django urls.py里添加如下配置
import json
apiClasses = [
bicycleApi,
equipmentApi
]
def getApiClasses(clsName):
for apiCls in apiClasses:
if apiCls.__name__ == clsName:
return apiCls
return None
def _loadParams(request, pname):
q = request.REQUEST.get(pname, "{}")
q = json.loads(q)
return q
def remoteView(request, apiClsName, methodName):
cls = getApiClasses(apiClsName)
if not cls:raise Exception("Can't find remote api class [%s]" % apiClsName)
if cls and hasattr(cls, methodName):
params = _loadParams(request, 'params')
inst = cls()
inst.request = request
m = getattr(inst, methodName)
params = dict([[str(k), v] for k, v in params.items()])
rs = m(**params)
return HttpResponse(json.dumps(rs))
raise Exception("Can't find remote method[%s] with api class [%s]" % (methodName, apiClsName))
urlpatterns = patterns('',
(r'^remote/(?P<apiClsName>\w*)/(?P<methodName>[a-zA-Z]+\w*)/', remoteView)
)
bicycleApi类实现业务逻辑,如:
#coding=utf-8
class bicycleApi(object):
def getAllBicycleS(money=None):
pass
4、然后
bicycleApi、equipmentApi 实现后台逻辑
5、这样子后,js代码编写如下代码就只可以远程调用后台方法了
china.remote.bicycleApi.c("getAllBicycles", {money:30} ).success(function(msg){ })
《完》
相关文章推荐
- vue.js 2.0入门级前端和后台数据交互
- Django前端与后台数据交互:用json传输数据到javascript来画hichart图表
- Asp.net Webservice返回Datetime格式数据与前端JS的交互问题
- js前台与后台数据交互-后台调前台(后台调用、注册客户端脚本)
- 关于Web前端做前后台数据交互的那些事儿
- MVC后台数据赋值给前端JS对象
- 前端后台数据交互小知识
- JS调用后台方法进行数据交互
- jquery validate 及追加html 前端封装JS对象 后台@ReqesutBody 对象即拿到数据
- js前台与后台数据交互-前台调后台
- 浅谈web前端与后台数据交互
- 多种方式实现JS调用后台方法进行数据交互
- js前台与后台数据交互
- 前端学习总结(七)Angular.js——以数据交互为核心的前端框架
- Extjs学习总结之11前端与后台的数据交互ajax
- js前台与后台数据交互-前台调后台
- web前端与后台数据交互--Json
- js前台与后台数据交互-前台调后台
- web前端后台数据的交互方式总结
- MVC后台数据赋值给前端JS对象