django 文件上传和菜单分级,mysql支持事务,F模块自增字段, python发送get,post请求
一、文件上传方法一上传文件视图函数defupload_img(request):obj=request.FILES.get('file')#前端js设置的keyimg_path=os.path.join('static','img',obj.name)withopen(img_path,mode='wb')asf:forchunkinobj.chunks():f.write(chunk)data={'status':True,'path':img_path}importjsonreturnHttpResponse(json.dumps(data))前端页面form表单<form><divclass="form-group"><labelfor="exampleInputFile">上传图片</label><inputtype="file"id="exampleInputFile"><buttontype="button"class="btnbtn-default"id="uploadfile">上传</button>{#<pclass="help-block">Exampleblock-levelhelptexthere.</p>#}</div><divclass="form-group"><labelfor="select_news">选择新闻类型</label><selectclass="form-control"id="select_news"><option>42区</option><option>段子</option><option>图片</option><option>挨踢1024</option><option>你问我答</option></select></div><divclass="form-group"><labelfor="news_url">新闻链接</label><inputtype="text"class="form-control"id="news_url"placeholder="Url"></div><divclass="form-group"><labelfor="news_title">新闻标题</label><textareaclass="form-control"rows="3"id="news_title"></textarea></div><divclass="form-group"><labelfor="news_summary">新闻简介</label><textareaclass="form-control"rows="3"id="news_summary"></textarea></div><divclass="modal-footer"><buttontype="button"class="btnbtn-default"data-dismiss="modal">关闭</button><buttontype="button"class="btnbtn-primary"id="news_publish">提交</button></div></form>js通过FormData方法处理$(document).ready(function(){$('#uploadfile').click(function(){varformData=newFormData();formData.append('file',$('#exampleInputFile')[0].files[0]);$.ajax({url:'/upload',type:'POST',data:formData,processData:false,//添加这两个参数,表示将原生文件发到后台contentType:false,success:function(res){console.log(res);}})})});方法二前端页面用form和iframe组合伪造ajax提交<formmethod="POST"target="xxxxxx"action="/upload_img2/"enctype="multipart/form-data">{%csrf_token%}<inputtype="text"name="user"/><a>上传<inputtype="file"name="avatar"/></a><inputtype="submit"value="提交"/></form><iframeid="ifm"name="xxxxxx"onload="successCallback(this);"></iframe>注:form属性target的值必须和iframe的name属性值一样view视图函数处理上传请求defupload_img2(request):response=BaseResponse()try:user=request.POST.get('user')#处理post请求obj=request.FILES.get('avatar')#处理上传文件img_path=os.path.join('static','img',obj.name)withopen(img_path,mode='wb')asf:forchunkinobj.chunks():f.write(chunk)exceptExceptionase:response.msg=str(e)else:response.status=Trueresponse.data=img_pathreturnHttpResponse(json.dumps(response.get_dict()))二、django对mysql事务的支持view视图importjsonfromdjango.db.modelsimportF#F模块实现数据库字段自增fromdjango.dbimporttransaction#支持事务原子性,对数据库的连续操作,操作成功必须每个sql都成功,否则都失败fromutils.responseimportLikeResponsedefdo_like(request):"""点赞:paramrequest::return:"""response=LikeResponse()try:new_id=request.POST.get('newId')#当前登录用户ID#uid=request.session.get('uid')uid=1exist_like=models.Like.objects.filter(nnew_id=new_id,uuser_id=uid).count()withtransaction.atomic():#事务ifexist_like:models.Like.objects.filter(nnew_id=new_id,uuser_id=uid).delete()models.News.objects.filter(id=new_id).update(like_count=F('like_count')-1)response.code=666else:models.Like.objects.create(nnew_id=new_id,uuser_id=uid)models.News.objects.filter(id=new_id).update(like_count=F('like_count')+1)response.code=999exceptExceptionase:response.msg=str(e)else:response.status=TruereturnHttpResponse(json.dumps(response.get_dict()))三、多级菜单,多级评论view视图fromdjango.shortcutsimportrender,HttpResponse,redirect#Createyourviewshere.importjsonfromdjango.db.modelsimportFfromapp01importmodelsfromdjango.dbimporttransactionfromutils.responseimportLikeResponsedefcomment_list(request):li=[{'id':1,'user':'银秋良','content':'灌我鸟事','parent_id':None},{'id':2,'user':'银秋良','content':'管我鸟事','parent_id':None},{'id':3,'user':'型谱','content':'你个文盲','parent_id':1},{'id':4,'user':'详解','content':'好羡慕你们这些没脸的人呀','parent_id':2},{'id':5,'user':'银秋良','content':'你是流氓','parent_id':3},{'id':6,'user':'银秋良','content':'你冷库无情','parent_id':5},{'id':7,'user':'银秋良','content':'你才冷酷无情','parent_id':4},{'id':8,'user':'银秋良','content':'你无理取闹','parent_id':4},]com_list=build_comment_data(li)html=build_comment_tree(com_list)returnrender(request,'comment_list.html',{'comment_html':html})#将列表子元素放入父级元素中defbuild_comment_data(li):dic={}foriteminli:item['children']=[]dic[item['id']]=itemresult=[]foriteminli:pid=item['parent_id']ifpid:dic[pid]['children'].append(item)else:result.append(item)returnresult#生成html页面defbuild_comment_tree(com_list):tpl="""<divclass='item'><divclass='title'>{0}:{1}</div><divclass='body'>{2}</div></div>"""html=""foritemincom_list:ifnotitem['children']:html+=tpl.format(item['user'],item['content'],"")else:html+=tpl.format(item['user'],item['content'],build_comment_tree(item['children']))returnhtmlcomment_list.html页面<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>Title</title><style>.body{margin-left:30px;}.hide{display:none;}</style></head><body><h2>评论</h2>{{comment_html|safe}}<h2>菜单</h2><hr/><scriptsrc="/static/jquery-3.1.1.js"></script><script>$(function(){$('.title').click(function(){if($(this).next().hasClass('hide')){$(this).next().removeClass('hide');}else{$(this).next().addClass('hide');}})})</script></body></html>四、python实现get和post请求客户端:importrequestsresponse=requests.get('传递字典类型参数data_dict={'k1':'v1','k2':'v2'}content-type:application/x-www-form-urlencodedresponse=requests.post('print(response.text)传递json类型参数content-type:appcation/jsonresponse=requests.post('print(response.text)服务端Django:fromdjango.views.decorators.csrfimportcsrf_exempt,csrf_protect@csrf_exemptdefasset(request):ifrequest.method=="GET":returnHttpResponse('收到:GET')else:print(request.POST)print(request.body)returnHttpResponse('收到:POST')
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。