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

第一种方式:

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表单提交)的更多相关文章

  1. ajax传递数组、form表单提交对象数组

    在JSP页面开发中,我们常常会用到form表单做数据提交,由于以前一直只是使用form表单提交单个对象,只要表单文本域的name值和接收的对象的属性名一致,那么传值就没有什么问题.不过,在前几天的开发 ...

  2. form表单提交与ajax消息传递

    form表单提交与ajax消息传递 1.前后端传输数据编码格式contentType: urlencoded 对应的数据格式:name=xxx&password=666 后端获取数据:requ ...

  3. Checkbox框全选操作,form表单提交与jquery ajax提交两种处理方式

    //1.jquery ajax<script type="text/javascript"> $(function(){ var basePath = $(" ...

  4. ajax form表单提交 input file中的文件

    ajax form表单提交 input file中的文件 现今的主流浏览器由于ajax提交form表单无法把文件类型数据提交到后台,供后台处理,可是开发中由于某些原因又不得不用ajax提交文件, 为了 ...

  5. Form表单提交,Ajax请求,$http请求的区别

    做过前端同学想必都避免不了要和后台server打交道.而以下这三种与后台交互的方式想必大家都不陌生. Form表单提交,Ajax请求,Angular的$http请求 以前一直搞不清楚什么时候应该用哪种 ...

  6. Atitit vue.js 把ajax数据 绑定到form表单

    Atitit vue.js 把ajax数据 绑定到form表单 1.1. 使用场景:主要应用在编辑与提交场合..1 1.2. 绑定数据到form控件,可以使用jquery,不过vue.js更加简单1 ...

  7. jqPaginator分页(ajax用法和form表单提交用法)

    一般使用方法 <!DOCTYPE html> <html> <head lang="en"> <meta charset="UT ...

  8. javascprit form表单提交前验证以及ajax返回json

    1.今天要做一个手机验证码验证的功能.需求是前端页面点击发送 短信验证码,后台接收后通过ajax返回到前端,之后前端在提交时候进行验证.思路很简单,不过做的过程还是学到不少的东西. 1.ajax请求后 ...

  9. form表单提交转为ajax方式提交

    <form action="xxx" method="get"> //action的值是请求的url地址 <div class="f ...

随机推荐

  1. 洛谷P4774 屠龙勇士

    啊我死了. 肝了三天的毒瘤题......他们考场怎么A的啊. 大意: 给你若干个形如 的方程组,求最小整数解. 嗯......exCRT的变式. 考虑把前面的系数化掉: 然后就是exCRT板子了. 我 ...

  2. A1140. Look-and-say Sequence

    Look-and-say sequence is a sequence of integers as the following: D, D1, D111, D113, D11231, D112213 ...

  3. 在html页面通过js实现复制粘贴功能

    前言:要实现这个功能,常用的方式大概分为两类,第一种就是上插件,这个网上有大把,第二种就是直接用几行JS来实现. 这次说第二种实现方式,这方式有很大的局限性,只能用表单元素,并且不能设置disable ...

  4. 计算机基础:计算机网络-chapter2

    因为计算机网络是的传输从物理到数据端的过程到端是自下而上的,所以大多数的教材都是从五层协议结构的底部开始向上延申. 物理层: = = 好复杂哦.看不懂,反正就是讲一些通信的线,信号传输的实现原理,和信 ...

  5. HDU 1560 DNA sequence (迭代加深搜索)

    The twenty-first century is a biology-technology developing century. We know that a gene is made of ...

  6. gitlab 500 服务器错误 重启解决了

    查看状态 sudo gitlab-ctl status # 启动Gitlab所有组件 sudo gitlab-ctl start # 停止Gitlab所有组件 sudo gitlab-ctl stop ...

  7. (线性DP LIS)POJ2533 Longest Ordered Subsequence

    Longest Ordered Subsequence Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 66763   Acc ...

  8. python之迭代器、生成器与面向过程编程

    目录 一 迭代器 二 生成器 三 面向过程编程 一.迭代器 1.迭代器的概念理解 ''' 迭代器从字面上理解就是迭代的工具.而迭代是每次的开始都是基于上一次的结果,不是周而复始的,而是不断发展的. ' ...

  9. Nginx 性能优化有这篇就够了!

    目录: 1.Nginx运行工作进程数量 Nginx运行工作进程个数一般设置CPU的核心或者核心数x2.如果不了解cpu的核数,可以top命令之后按1看出来,也可以查看/proc/cpuinfo文件 g ...

  10. Mysql数据约束 整理

    数据约束 1.默认值: 作用: 当用户对使用默认值的字段不插入值的时候,就使用默认值. 注意: 1)对默认值字段插入null是可以的. 2)对默认值字段可以插入非null   CREATE TABLE ...