前端和后端的数据交互(jquery ajax+python flask+mysql)
上web课的时候老师布置的一个实验,要求省市连动,基本要求如下:
1.用select选中一个省份。
2.省份数据传送到服务器,服务器从数据库中搜索对应城市信息。
3.将城市信息返回客户,客户用select控件进行显示。
基本效果如下所示(页面挺丑陋的,但是前后端数据交互的要求基本达到了):
我利用json进行数据传输。
所用的工具为:jQuery ajax+ python flask+mysql
想要代码的可以直接移步github:https://github.com/HBKO/web_practice
在此过程中,可能会碰到的问题如下(下面都会给出解决办法):
1.首先是mysql与python的中文乱码或者无法输入到数据库的问题:
这里可以看我的一篇博客:http://blog.csdn.net/github_33873969/article/details/78723621
如何通过python向mysql执行sql语句并得到数据,首先要先安装MySQLdb.
下载地址:https://pypi.python.org/pypi/MySQL-python/
下载MySQL-python-1.2.5.zip 文件之后直接解压。进入MySQL-python-1.2.5目录:
>>python setup.py install
- 1
执行安装命令。
连接mysql,使用sql语句的代码基本如下所示:
import MySQLdb
conn=MySQLdb.connect(
host='localhost',
port=3306,
user='root',
passwd='你的密码',
db='你要连接的数据库',
charset='utf8'
)
sql="你要执行的sql语句"
cur=conn.cursor() #创建sql连接的游标
cur.execute(sql) #执行sql语句
result=cur.fetchone() #获取查询结果的第一个结果
result=cur.fetchall() #获取查询的全部结果
#当然,如果你要进行更新,删除,添加的sql命令
#conn.commit() #执行更新,删除,添加的sql命令,然后确定
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
更加详细的连接细节,可以参考这个文档:
https://www.cnblogs.com/fnng/p/3565912.html
二.利用jquery和ajax发送json消息:
对于ajax发送post消息非常简单:
var data={"city":"重庆"};
$.ajax({
type: 'POST',
url:"/province",
data:JSON.stringify(data), //转化字符串
contentType: 'application/json; charset=UTF-8',
success:function(data){ //成功的话,得到消息
addselect(data);
}
});
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
决定发送的类型,url说明你要给你服务器上的那个url发送请求,我对应的路径是”/province”,你要改成你自己的路径。data数据表示一个字典类型的数据,先强制转化为JSON类型,然后进行发送消息。
如果发送成功的话,执行后面的function函数,从服务器上获取的数据为data.
这就是一个最简单的POST命令的发送方法。
那么,又怎么看我们post的内容是否成功呢,这个时候就要打开你的Chrome or Firefox ,打开页面开发者工具
看到下面页面(记得打勾Preserve log,查看先前日志 )
可以看到我们的Request Payload的上面有我们需要传递的json数据,post数据成功
三.flask读取json信息
在讲flask读取json信息,我想先介绍一下flask的一些基本概念:
首先,先说一下MVC的概念:
Model-View-Controller,中文名“模型-视图-控制器”
首先C-controller,指的就是我们在python后台里面利用各种web框架进行数据的收集和处理.
View视图就是我们最终将获取的数据经过处理呈现给用户的html页面。
那么model又是什么呢?
下面展示一个用jinja2渲染的一个html页面
<body>
<form action="/" method="post" id="formid" >
<input type="text" name="InNumber" id="InNumber" align="center" style="height: 50px; width: 400px; font-size: 40px" placeholder="20 30 40 ..">
<br>
<input type="button" name="btn1" value="进行排序" align="center" onclick="sendmessage()">
<br>
</form>
<p>{{result}} </p>>
<input type="button" value="省市联动" align="center" onclick="changepage()">
</body>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
下面的{{result}}就是一个模型,这个模型包括了从服务器传回来的数据.
在里面,model就是dict类型的数据:”result”:”….”
这是不是很想我们的json。没错的,在我们前后端交互的MVC模型中,M表示的就是我们交互传递的json数据。
好了,回到正题,服务器端获取json的方式有这么几种
request.form
request.args
request.data
request.get_json()
- 1
- 2
- 3
- 4
我们依次打印出来看结果:
ImmutableMultiDict([])
ImmutableMultiDict([])
{"city":"浙江"}
{u'city': u'\u6d59\u6c5f'}
- 1
- 2
- 3
- 4
第三个结果看似是我们想要,我们打印出它的类型再看看
<type 'str'>
- 1
它是一个str类型的数据,不是我们想要的
第四个结果是一个dict类型的数据,我们获取一下值,看是不是我们想要的
print request.get_json()['city']
- 1
浙江
- 1
成功获取了我们发送的消息。
OK,我们成功得到了我们的数据,接下来就进行数据库搜索,最后发送消息就行了。
但如何往浏览器发送消息呢?如下代码:
@app.route('/province',methods=['POST','GET'])
def province():
if request.method=='POST':
rev=request.get_json()['city']
result=selcity(rev)
return result
else:
return render_template('province.html')
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
直接把你的结果return就完啦,是不是很简单呀。
这就完成通过ajax和flask进行数据交互的一个过程,浏览器怎么处理数据,那就是view要做的事喽。
接下来,就是服务器端代码喽:
#!/usr/bin/env python
#encoding=utf-8
from flask import Flask
from flask import render_template
from flask import request
from flask import url_for
import MySQLdb
import re
import sys
import types
app=Flask(__name__)
reload(sys)
sys.setdefaultencoding("utf-8")
conn=MySQLdb.connect(
host='localhost',
port=3306,
user='root',
passwd='a821200725',
db='webjob',
charset='utf8'
)
#sys.setdefaultencoding('utf-8')
@app.route('/', methods=['POST','GET'])
def index():
if request.method == 'POST':
InNumber=request.form['InNumber']
InNumber=numsort(InNumber)
return render_template('index.html',result=InNumber)
else:
return render_template('index.html')
@app.route('/province',methods=['POST','GET'])
def province():
if request.method=='POST':
rev=request.get_json()['city']
result=selcity(rev)
return result
else:
return render_template('province.html')
def numsort(number):
print number
# tmp=number.split(' *')
tmp=re.split("\s+",number)
print tmp
for i in range(len(tmp)):
tmp[i]=int(tmp[i])
print tmp
tmp.sort()
res=""
for i in tmp:
res+=(str(i)+" ")
return res
def selcity(city):
sql="select litcity from Bigcity where city='"+city+"'"
cur=conn.cursor()
cur.execute(sql)
result=cur.fetchone()
results=result[0]
# results=results.decode("unicode-escape")
return results
if __name__=='__main__':
app.run(debug=True)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
可以看到flask在创建简单的web应用的时候确实很轻便,一个app.run就完了。
这里要注意两个地方:
一个是:
@app.route('/', methods=['POST','GET'])
def index():
- 1
- 2
这个是装饰器,用于绑定路由到def index这个函数。
也就是这时候你的url为ip+/的时候,服务器执行的就是index这个函数,要返回模版页面就只要:
return render_template(‘页面’)就好啦。
但你如果在前端加载服务器的静态文件,如:CSS,JS,IMG。
就要在前端写上:
{{url_for('static', filename='style.css')}}
- 1
当然你的静态文件要存在服务器的static文件夹中,
具体的页面代码例子如下:
<link rel="icon" href="{{ url_for('static', filename='favicon.ico')}}" type="image/x-icon">
- 1
另外一个就是:
if __name__=='__main__':
- 1
这个保证了,如果你直接执行的这个py文件,就会执行if里面语句。
但是你如果把这个py文件当成模块引入,就不会执行if里面语句。实际上,这时候
__name__='你的py文件名'
前端和后端的数据交互(jquery ajax+python flask+mysql)的更多相关文章
- 前端与后端的数据交互(jquery ajax+python flask)
前端与后端的数据交互,最常用的就是GET.POST,比较常用的用法是:提交表单数据到后端,后端返回json 前端的数据发送与接收 1)提交表单数据 2)提交JSON数据 后端的数据接收与响应 1)接收 ...
- webpack+vue项目实战(四,前端与后端的数据交互和前端展示数据)
地址:https://segmentfault.com/a/1190000010063757 1.前言 今天要做的,就是在上一篇文章的基础上,进行功能页面的开发.简单点说呢,就是与后端的数据交互和怎么 ...
- Python Django 前后端数据交互 之 前端向后端发送数据
Python Django 之 前端向后端发送数据
- Spring MVC之中前端向后端传数据
Spring MVC之中前端向后端传数据和后端向前端传数据是数据流动的两个方向, 在此先介绍前端向后端传数据的情况. 一般而言, 前端向后端传数据的场景, 大多是出现了表单的提交,form表单的内容在 ...
- 无废话ExtJs 入门教程二十[数据交互:AJAX]
无废话ExtJs 入门教程二十[数据交互:AJAX] extjs技术交流,欢迎加群(521711109) 1.代码如下: 1 <!DOCTYPE html PUBLIC "-//W3C ...
- 前后端进行数据交互时候 要优先考虑json格式即简直对形式,[{}] 列表形式 等便于操作的数据结构
前后端进行数据交互时候 要优先考虑json格式即简直对形式,[{}] 列表形式 等便于操作的数据结构
- Jquery使用ajax与Flask后端进行数据交互
最近做项目碰到一个坑,jquery使用ajax向flask传输数据的时候,在后端采用request.data无论如何都获取不到数据,代码如下: 前端: <script> function ...
- 利用Ajax实现前端与.net后端实现数据交互
使用场景和需求:用户在地址栏输入请求地址,先.net服务器发送页面请求,该页面包含Echart图表,在页面中向.net后端发送数据请求,获取数据后,将数据填充到Echart图表中.其中包含带参与不带参 ...
- 数据交互与ajax
在Long Long Ago,那个前端还是一个切图仔的年代,那时的页面根本没有js,前端的api非常的少,页面的所有数据都来自服务器渲染,任何的页面操作都会提交form表单请求刷新页面,直到那一天,浏 ...
随机推荐
- Android笔记(六):线程及线程通信
线程 由于Android的Activity中默认所有代码都在主线程(UI线程)中执行,如果在这里面执行耗时任务(例如下载),界面就会无反应且不可操作,直到耗时任务执行完毕. 如果想在执行耗时任务的同时 ...
- 版本视图找不到数据 EDITIONING VIEW
Oracle database 12 以后的版本,特别在EBS R12.2.X加入了版本视图这种技术,跟MOAC有点像. CREATE OR REPLACE FORCE EDITIONING VIEW ...
- JAVA分库分表的实现方案
分库分表的实现方案无非2种:1.本地,2.远程.而在本地一般有2种实现(1.业务代码级别 2.jdbc级别), 其中jdbc级别的本地代理方案的代表有:当当开源的 shardingsphere,远 ...
- Oracle之外键(Foreign Key)使用方法具体解释(二)- 级联删除(DELETE CASCADE)
Oracle外键(Foreign Key)之级联删除(DELETE CASCADE) 目标 演示样例解说怎样在Oracle外键中使用级联删除 什么是级联删除(DELETE CASCADE)? 级联删除 ...
- xml解析、写入遇到的坑
前言 最近在看一个线上xml文件导出的问题,需求如下: 从我们平台导出一个后缀为tmx的术语语料数据(实际内容为xml文件),然后导入到其他第三方平台发现无法导入. 从其他平台导入的tmx文件无法导入 ...
- react.js map遍历的问题
React遍历多个Ant Design中的Upload组件时,随意删除任一个Upload出现了bug,依次点击上传图片后,当点击删除时,倒着删除没有问题,从中间和从开头删问题出现了,出现了类似塌方的效 ...
- 【iCore4 双核心板_FPGA】例程四:Signal Tapll 实验——逻辑分析仪
实验现象: 三色led轮流闪烁,具体的逻辑分析仪使用教程请参考iCore3逻辑分析仪例程 核心代码: module signal_ctrl( input clk_25m, input rst_n, o ...
- 【WPF】点击滑动条(Slider),移动滑块(Tick)到鼠标点击的位置
问题:点击Slider控件时,滑块会自动跳到滑动条的最边缘位置,无法跳到鼠标点击的位置上. 办法:给Slider控件设置属性IsMoveToPointEnabled="True"即 ...
- 【原】为DevExpress的ChartControl添加Y轴控制 和 GridControl中指定列添加超级链接
一.控制ChartControl的Y轴范围 使用Devexpress中的CharControl控件,需要控制AxisY轴的显示范围,需要使用该控件的BoundDataChanged事件,具体代码如下: ...
- 【转】 Windows下配置Git
[转自]http://blog.csdn.net/exlsunshine/article/details/18939329 1.从git官网下载windows版本的git:http://git-scm ...