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[]['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}}" onclick="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('',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')[].innerHTML=(resData.content)
}
})
$('#edit')[].style.display='block '
$('#top')[].style.display='none '
$('#top')[].style.opacity='0 !important'
})
后端py文件下的方法接收到数据返回数据:
@admin.route('/editArticle',methods=['post','get'])
def editArticle():
# 定义一个全局共用变量id(因为下面else里要用到)
global A_id
print('bianjie',len(request.form))
# 前端点击编辑时传入的是一个id值所以长度为1,这是将所有文章内容原样渲染到编辑页面,得返回所有文章内容
if len(request.form)<:
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
# 获取session
print('运行到此处2')
# 获取表单图片文件的方法
img = request.files
print('图片',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.id
print('用户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=userid
addInfo=Article(title=title,cover_img=cover_img,type=type,author=author,content=content,time=times,state=,foreign_user=userid)
db.session.add(addInfo)
db.session.commit()
return render_template('admin/form_basic.html')
# return '成功增加文章'
python中前后端通信方法Ajax和ORM映射(form表单提交)的更多相关文章
- ajax传递数组、form表单提交对象数组
在JSP页面开发中,我们常常会用到form表单做数据提交,由于以前一直只是使用form表单提交单个对象,只要表单文本域的name值和接收的对象的属性名一致,那么传值就没有什么问题.不过,在前几天的开发 ...
- form表单提交与ajax消息传递
form表单提交与ajax消息传递 1.前后端传输数据编码格式contentType: urlencoded 对应的数据格式:name=xxx&password=666 后端获取数据:requ ...
- Checkbox框全选操作,form表单提交与jquery ajax提交两种处理方式
//1.jquery ajax<script type="text/javascript"> $(function(){ var basePath = $(" ...
- ajax form表单提交 input file中的文件
ajax form表单提交 input file中的文件 现今的主流浏览器由于ajax提交form表单无法把文件类型数据提交到后台,供后台处理,可是开发中由于某些原因又不得不用ajax提交文件, 为了 ...
- Form表单提交,Ajax请求,$http请求的区别
做过前端同学想必都避免不了要和后台server打交道.而以下这三种与后台交互的方式想必大家都不陌生. Form表单提交,Ajax请求,Angular的$http请求 以前一直搞不清楚什么时候应该用哪种 ...
- Atitit vue.js 把ajax数据 绑定到form表单
Atitit vue.js 把ajax数据 绑定到form表单 1.1. 使用场景:主要应用在编辑与提交场合..1 1.2. 绑定数据到form控件,可以使用jquery,不过vue.js更加简单1 ...
- jqPaginator分页(ajax用法和form表单提交用法)
一般使用方法 <!DOCTYPE html> <html> <head lang="en"> <meta charset="UT ...
- javascprit form表单提交前验证以及ajax返回json
1.今天要做一个手机验证码验证的功能.需求是前端页面点击发送 短信验证码,后台接收后通过ajax返回到前端,之后前端在提交时候进行验证.思路很简单,不过做的过程还是学到不少的东西. 1.ajax请求后 ...
- form表单提交转为ajax方式提交
<form action="xxx" method="get"> //action的值是请求的url地址 <div class="f ...
随机推荐
- A1110. Complete Binary Tree
Given a tree, you are supposed to tell if it is a complete binary tree. Input Specification: Each in ...
- [bzoj3524][Couriers]
题目链接 思路 观察这个\((r - l + 1)/2\),很容易证明,如果一个数出现次数大于\((r - l + 1) / 2\),那么这个区间内第\((r - l + 1) / 2 + 1\)大一 ...
- 【洛谷P1059 明明的随机数】
题目描述明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤100),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着 ...
- MySQL常用的一些函数
内容太多,走链接: MySQL函数大全
- Spring2
简介:1.Aop编程.2.AspectJ基于xml文件.3.AspectJ基于注解. 4.JdbcTemplate. 5.配置properties文件 1 AOP 1.1 AOP介绍 ...
- http 请求头和响应头
客户端发送请求过程带着的数据: 1.请求地址 2.请求方式 3.请求头 request headers 4.请求参数 https://www.juhe.cn/ 130.... 1a2b....pei ...
- qml: 模块定义与使用
1. 模块的定义qmldir Module MyModule MyTest 1.0 MyTest.qml MyTest 1.3 MyTest.qml 2. 导入: 使用qrc: RESOU ...
- Adobe Photoshop CC 2019 for Mac(介绍及下载)
[Adobe Photoshop 简介] Photoshop CC 2019 for Mac 破解版专为所有设计人员而设计.从海报到包装,从普通的横幅到绚丽的网站,从令人难忘的徽标到吸引眼球的图标,P ...
- urllib 学习二
编码解码: python2 用法: urllib.urlencode() 编码 urlparse.parse_qs() 解码 python3 用法: urllib.parse.urlencode() ...
- network / switchboard / jiaohuanji
s 步骤1:模拟交换机电源故障,验证设备运行正常 步骤2:模拟交换机主控故障,验证设备运行正常 步骤3:模拟交换机业务单板故障,验证业务运行正常 -- 需要验证业务 步骤4:模拟交换机堆叠分裂 -- ...