我们可以用form方式提交表单,不过我一般喜欢用jquery的方式来操作。主要有两种方式。
get方式
get方式不需要预设并且传递csrf标签。
js代码部分:
$("#buy-button").click(function(){
var productId=$(this).attr("product_id");
var url =$(this).attr("product_url");
//$.post("")
var post_data ={"product_id":productId};
$.get("/addbuy/",post_data,function(datas){
alert(datas);
})
location.href=url;
});
后台django的urls.py映射部分:
views.py文件部分:
def addbuy(req, *call_args):
'''
function:add the buy click number
author:liushuchun
'''
product_id = req.GET.get("product_id")
if product_id is not None:
logger.info("the add product_id: %s" % product_id)
product = Product.objects.get(id=str(product_id))
product.buy_num = product.buy_num + 1
product.save()
return HttpResponse("success", mimetype="javascript/json")
POST方式
post提交方式与get方式存在略微的区别,因为post是修改添加操作,涉及到数据的读写,而get更多只是读取,明显post的权限要大的多,所以安全方面限制也要更多,提供CSRFtoken是为了防止跨域攻击,因为现在很容易用第三方工具构造出post以及get请求,js稍有一些区别:
//获取cookie代码
function getCookie(name) {
var cookieValue = null;
if (document.cookie && document.cookie != '') {
var cookies = document.cookie.split(';');
for (var i = 0; i < cookies.length; i++) {
var cookie = jQuery.trim(cookies[i]);
// Does this cookie string begin with the name we want?
if (cookie.substring(0, name.length + 1) == (name + '=')) {
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
break;
}
}
}
return cookieValue;
}
$.ajaxSetup({
beforeSend: function(xhr, settings){
xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken')); //request头需要添加csrftoken,告诉服务器,我是个好yin哪,我是正常访问者
}
});
function addProduct(){
var name=$("#pro-name").val();
var img=$("#up-img").val();
var postdata={
"name":name,
"big_photo_url":img,
};
//alert(content);
jQuery.post('/cms/addpro/',postdata,function(data){
alert("上传成功");
});
}
其中后台views.py中代码如下:
def addpro(req):
'''
添加商品
'''
if 'POST' == req.method:
data = req.POST //获取POST中的数据
当然urls.py中类似get中也需要添加映射。
还有在post所在页面中,需要添加: {% csrf_token %},该句会添加对应的csrf token.
并且,后台views.py中需要添加装饰器:
这块其实差不多这些,基本上我希望把经常要用到的东西囊括进来,当然还有一些其他控制安全的部分,这里不再赘述。