python中前后端通信方法Ajax和ORM映射(form表单提交)

后端从数据库获取数据给到前端:

第一种方式:

admin.py文件代码:

@admin.route('/showList')
def show():# 获取数据库所有文章数据,得到一个个对象res=Article.query.all()dicts=[]# 将每一个对象转成字典并加入一个列表,再用jinja模板将数据渲染到视图html中for item in res:dicts.append(item.__dict__)print('读取所有内容',dicts)print('每一个字段的值',dicts[0]['title'])# 将数据dicts=dicts传到articleList.html页面渲染return render_template('admin/articleList.html',dicts=dicts)

前端利用jinja语法渲染:

    <!--该内容使用了jinja模板--><div id="top">{%for item in dicts%}<!--<form id="form1" method='POST' enctype="multipart/form-data" action="url">--><hr/><h3 class="zuo">作者:</h3><p class="biao">{{item['author']}}</p><p class="lei">文章分类:{{item['category']}}</p><p class="shi">文章发布时间:{{item['put_date']}}</p><p class="nei">文章内容:{{item['content']}}</p><button   class="authorList" id="{{item.id}}" >编辑</button><!--这里的data-id是设置的标签数学,在点击不同的item时获取它的id值,下面讲解在js里用到--><button data-id="{{item.id}}" οnclick="del(event)" type="submit" class="delete">删除</button><hr style="border:1rem;border-bottom-color: black"/><!--</form>-->{% endfor %}</div>

在点击修改文章时需要知道具体是哪偏文章需要修改所以在上面用data-id将每篇文章的id保存到设置属性dataset里

在js里直接设置路由,根据相应路由程序会执行相应的py文件下路由的函数方法:

    function del(e){console.log('删除',e)//获取表单设置好的data—id值value = e.target.dataset.id//本地路由定向location.href='/admin/delArticle/'+ value// console.log('/admin/delArticle/'+ value)//  $('form1').attr('action','/admin/delArticle/'+ value)}

相应路由下的py方法:

# 此处使用动态路由的方式接收前端传来的id,根据相应的id删除相应的文章
@admin.route('/delArticle/<delid>',methods=['GET','POST'])
def delArticle(delid):print('123456',delid)delAr=Article.query.filter(Article.id==delid).first()db.session.delete(delAr)db.session.commit()return render_template('admin/addArticle.html')

第二种ajax请求方式:

利用ajax传递前端请求的数据并返回数据给到前端:

js代码:

//被点击的标签对象$('.authorList')$('.authorList').click(function() {//获取当前点击对象标签上的属性id值var ID = $(this).attr('id')data = {'Articleid': ID}console.log(data)$.ajax({// ajax请求的路由地址(py文件下的路由下有方法)url: '/admin/editArticle',// 向后端请求类型(是一个对象格式)type: 'post',// 向后端发送请求的数据
                    data: data,// 请求成功后后端返回回来的数据,后端对数据json.dumps(data)
                    success: function (res) {// 后端对数据json.dumps(data)data是一个对象类型才能dumps,所以在此要对数据进行解析resData=JSON.parse(res)console.log(resData)//将获取到的数据渲染到相应的标签里$('#title').val(resData.title)$('#category').val(resData.category)$('#author').val(resData.author)$('#editText')[0].innerHTML=(resData.content)}})$('#edit')[0].style.display='block '$('#top')[0].style.display='none '$('#top')[0].style.opacity='0 !important'})

后端py文件下的方法接收到数据返回数据:

@admin.route('/editArticle',methods=['post','get'])
def editArticle():# 定义一个全局共用变量id(因为下面else里要用到)global A_idprint('bianjie',len(request.form))# 前端点击编辑时传入的是一个id值所以长度为1,这是将所有文章内容原样渲染到编辑页面,得返回所有文章内容if len(request.form)<2:A_id= request.form['Articleid']print('获取前端post请求数据id',request.form['Articleid'])resEdit=Article.query.filter(Article.id==int(request.form['Articleid'])).first()data={'title':resEdit.title,'author':resEdit.author,'content':resEdit.content,'category':resEdit.category,'files':resEdit.files}# data是一个对象类型才能dumps# print(resEdit.title)return json.dumps(data)# 否则提交回来的就是修改文章后的内容长度大于1,执行修改相应数据库的内容else:print('修改文章', request.form)edit=Article.query.filter(Article.id== A_id).first()edit.title=request.form['title']edit.content = request.form['content']edit.category = request.form['category']edit.files = request.form['files']edit.author = request.form['author']edit.edit_time =datetime.now()db.session.commit()print('修改文章')# return redirect('/showList')return '完成修改'

前后端交互还有form 表单提交post或者get传递信息给后端相对较简单,在此不多加描述

哎,还是说一下:在这里method='post' enctype="multipart/form-data"必须写method方法可以是post也可以是get,action是表单提交到后端的具体路由,

在该路由下py执行的具体方法

<form role="form" action='/admin/addArticle' method='post' enctype="multipart/form-data"><div class="form-group"><label>文章标题</label><input type="text" placeholder="请输入文章标题" name="title" class="form-control"></div></form>

后端接收表单信息:

@add_article.route('/',methods=['POST','GET'])
# 添加文章
def addArticle():return render_template('admin/form_basic.html')@add_article.route('/add',methods=['POST','GET'])
def add():# print(request.method)if request.method=='GET':print('运行到此处1')return render_template('admin/form_basic.html')else:# 获取用户名,然后再根据用户名获取用户id# 获取sessionprint('运行到此处2')# 获取表单图片文件的方法img = request.filesprint('图片',img)img = img['cover_img']# print(img.filename)if img !=None :# 获取图片名字img_name=img.filename# 保存图片到本地img.save('./static/images/{}'.format(img_name))cover_img = './static/images/{}'.format(img_name)else:cover_img = 'http://bpic.588ku.com/back_pic/04/54/42/0658634373900c4.jpg'# 获取用户账号username = session.get('user_name')if username != None:check = User.query.filter(User.user_name == username).first()userid = check.idprint('用户id', userid)else:username = '失心哥'check = User.query.filter(User.user_name == username).first()userid = check.id#     print('出错了,该用户不存在')# return '出错了,该用户不存在'# 获取表单提交里面的name为title的值title = request.form['title']type = request.form['type']author = request.form['author']content = request.form['content']times = datetime.now()# 添加文章,foreign_user=useridaddInfo=Article(title=title,cover_img=cover_img,type=type,author=author,content=content,time=times,state=1,foreign_user=userid)db.session.add(addInfo)db.session.commit()return render_template('admin/form_basic.html')# return '成功增加文章'
View Code

 

转载于:https://www.cnblogs.com/Dark-fire-liehuo/p/9884117.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/570220.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java异常代码分析

觉得自己是一个Java专家吗&#xff1f;是否肯定自己已经全面掌握了Java的异常处理机制&#xff1f;在下面这段代码中&#xff0c;你能够迅速找出异常处理的六个问题吗&#xff1f; 1 OutputStreamWriter out ... 2 java.sql.Connection conn ... 3 try { // ⑸ 4  Statement…

NetworkManager

NetworkManager NetworkManager是一个组件,用来管理网络多人游戏的状态。 NetworkManager所具备的属性包括如下&#xff1a; 游戏状态管理派生管理场景管理Debugging信息比赛选择&#xff08;Matchmaker&#xff09;用户自定义使用NetworkManager NetworkManager可以作为核心控…

C#知识点总结系列:3、C#中Delegate和Event

一、Delegate委托可以理解为一个方法签名。 可以将方法作为另外一个方法的参数带入其中进行运算。在C#中我们有三种方式去创建委托&#xff0c;分别如下&#xff1a; public delegate void Print(string str);static void delegatemethod(string str){Console.WriteLine(str);}…

js获得7天后的日期时间

思路&#xff1a;当前日期天数7 直接上代码&#xff1a; function getSpecialTime() {var currentDate;var arry currentDate.split("-");var year parseInt(arry[0],10);var month parseInt(arry[1],10);var day parseInt(arry[2],10); //月份的方法&#xff…

python的2种字符串格式化输出

字符串格式化代码&#xff08;typecode&#xff09; 法一&#xff1a; %格式使用下面的格式 %[(name)] [flags] [width][.precision] typecode (name)输出字典的value使用&#xff0c;这里的name是字典的key&#xff08;实际指定时&#xff0c;必须有外面的圆括号&#xff09; …

JS弹出DIV并使整个页面背景变暗功能的实现代码

1.首先写一个遮罩层div&#xff0c;然后再写一个弹窗的div <!-- 遮罩层 --> <div id"cover" style"background: #000; position: absolute; left: 0px; top: 0px; width: 100%; filter: alpha(opacity30); opacity: 0.3; display: none; z-index: 2 &…

dos命令测试网络连通情况

telnet测试端口命令&#xff1a; telnet IP地址 端口号 或者 telnet 域名 端口号traceroute指令让你追踪网络数据包的路由途径&#xff0c;命令&#xff1a; traceroute ip地址

Python中字典合并的四种方法

字典是Python语言中唯一的映射类型。映射类型对象里哈希值&#xff08;键&#xff0c;key&#xff09;和指向的对象&#xff08;值&#xff0c;value&#xff09;是一对多的的关系&#xff0c;通常被认为是可变的哈希表。字典对象是可变的&#xff0c;它是一个容器类型&#xf…

jar包打开闪退

第一种方法&#xff1a; 步骤一&#xff1a;新建一个文本文档&#xff0c;输入内容"javaw -jar %1 "&#xff0c;并保存为批处理文件&#xff0c;例如"run.bat "。 步骤二&#xff1a;右键点击.jar格式的文件 &#xff0c;选择其打开方式 为上面建的run.ba…

从零开始的全栈工程师——js篇2.12(面向对象)

面向对象 Js一开始就是写网页特效&#xff0c;面向过程的&#xff0c;作者发现这样写不好&#xff0c;代码重复利用率太高&#xff0c;计算机内存消耗太大&#xff0c;网页性能很差。 所以作者就收到java和c的影响&#xff0c;往面向对象靠齐。Js天生有一个Object&#xff0c;但…

java,js获取数组最大/小值

js最小值&#xff1a; var minValue Math.min.apply(null,args[]);js最大值 var maxValue Math.max.apply(null,args[]);JDK8特性&#xff1a;java最大值&#xff08;整数数组&#xff09;&#xff1a; int[] A {6,7,8,2,1,3,4,5}; int maxVal Arrays.stream(A).max().g…

20172332 2017-2018-2 《程序设计与数据结构》第七周学习总结

20172332 2017-2018-2 《程序设计与数据结构》第七周学习总结 教材学习内容总结 第十一章 二叉查找树 1.二叉查找树&#xff1a;一种带有附加属性的二叉树。即每个结点其左孩子都要小于其父结点&#xff0c;而父结点又小于或等于其右孩子。&#xff08;左孩子<父结点<右孩…

JAVA读取本地图片并展示

代码如下&#xff1a; //读取本地图片输入流 FileInputStream inStream new FileInputStream("D:/image/123.jpg");//byte数组用于存放图片字节数据 byte[] buff new byte[inSteam.available()];inStream.read(buff); inStream.close();//设置发送到客户端的响应内…

Java中map关于putAll()和“=”的区别

putAll()方法&#xff1a; 相同的key&#xff0c;map1.putAll(map2); map1中的key-value会被覆盖。 不同的key&#xff0c;map2中的key-value会被追加到map1中。“”的使用&#xff1a; map1 map2; map1中所有的key-value都会被map2中的key-value覆盖。

Neo4j简介

1、什么是Neo4j   Neo4j是由java实现的开源NOSQL图数据库   数据库分为关系型和非关系型两种类型。   其中非关系型又分为Graph(图形),Document(文档),Cloumn Family(列式)&#xff0c;以及Key-Value Store(KV),   这四种类型数据库分别使用不同的数据结构进行存储。因…

js比较日期大小

//获取当前时间 var currentTime new Date();//自定义时间 var customTime"2019-03-01 00:00:00"; customTime customTime.replace("-","/");//替换字符&#xff0c;变成标准格式 customTime new Date(Date.parse(customTime));if(currentT…

Docker-容器数据卷

docker容器数据卷相当于外置的移动硬盘 docker容器数据卷主要功能是&#xff1a;容器的持久化、容器间继承共享数据 特点&#xff1a; &#xff08;1&#xff09;数据卷可以容器之间共享或重用数据 &#xff08;2&#xff09;卷中更改可以直接生效 &#xff08;3&#xff09;数…

weblogic的输出打印日志设置

设置路径&#xff1a; 1、服务器——》控制&#xff0c;进入服务器设置 2、服务器启动——>设置参数 3、参数配置&#xff1a; -Xms2048m -Xmx4096m -XX:PermSize256m -XX:MaxPermSize512m -XX:UseConcMarkSweepGC -XX:CMSClassUnloadingEnabled -XX:DisableExplicitGC -…

支持向量机——Large Margin Classifier

支持向量机的目标是 \[\underbrace {\min }_\theta \left\{ {C\left[ {\sum\limits_{i 1}^m {{y^{\left( i \right)}}{\mathop{\rm Cos}\nolimits} {t_1}\left( {{\theta ^T}{x^{\left( i \right)}}} \right) \left( {1 - {y^{\left( i \right)}}} \right){\mathop{\rm Cos}\…

WebLogic清理缓存

清除缓存路径&#xff1a; D:\Oracle\Middleware\user_projects\domains\my_domain\servers\AdminServer\cache D:\Oracle\Middleware\user_projects\domains\my_domain\servers\AdminServer\tmp D:\Oracle\Middleware\user_projects\domains\my_domain\servers\AdminServer\…