python使用flask实现前后端分离&通过前端修改数据库数据【全栈开发基础】

青旅半醒 2024-05-04 08:14 19阅读 0赞

文章目录

    • ?前言:
    • ?工具
    • ?截图
      • ?数据库截图
      • ?前端截图
    • ?代码
      • ?增加
        • ?前端 HTML
        • ?后端 python
      • ? 删除
        • ?前端 HTML
        • ?后端 python
      • ? 编辑
        • ?前端 HTML
        • ?后端 python
      • ? 查看
        • ?前端 HTML
        • ?后端 python
    • ? 完整代码
      • ?前端 HTML
      • ?后端 python
    • ?结语

完整代码放到了最后,时间紧张的话直接拉到最后或点击目录【? 完整代码】看完整代码

?前言:

这里先提一下,我们运行后端代码之前需要先建立一个名字为python的数据库,而后在该数据库下创建表 userinfo,因为看到有的朋友后端代码拿过去后会运行不起来或者就是直接报错了。至于使用MySQL可视化工具还是用sql语句创建,这个看自己个人的,如果sql不怎么熟练的,甚至没有基础的,可以参考一下自己的这一篇文章MYSQL的增删改查相关操作


相信看过自己前期的博文python使用flask模块和前端交互基础以及python模块pymysql对数据库进行增删改查的小伙伴已经有了一定基础,这里我们在来对flask、pymsql、前端三个部分通过flask做一个整合。使用python来作为我们的后端来实现前后端的分离。
既然是作为基础,那我们这里主要实现通过前端对我们后端数据库实现增删改查就OK 了。下面我们开始。

?工具

后端:python(flask,pymsql)、MySQL、navicat、VScode
前端:VScode、Google浏览器

?截图

?数据库截图

这里的截图的是navicat,里面的id做了主键自增
在这里插入图片描述

?前端截图

前端上样式没有去做过多的修饰,只是做一个大概样式,有兴趣的也可以自己去用CSS修改一下
在这里插入图片描述

可视化截图就截图这两张吧,接下来就是代码了

?代码

这里先提一下,这个是需要下载MySQL数据库的,再有一些MySQL数据库的增删改查的代码学习基础。要不然有的代码可能是看不明白的哈,特别是数据库那一块的。restful风格这里对于增删改查使用了不同的方式

?增加

增加数据库这里用的也是基本和其它常见后端所用的那种方式,使用了post请求方法,对于前端不是从URL请求上携带的参数,我们都可以使用flask模块中的request的**get_dada()**方法来获取,至于如何取在URL上的数据,可以看下关于【? 删除】那里的简介。

?前端 HTML
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Document</title>
  8. <style>
  9. div {
  10. border-bottom: 1px solid gray;
  11. padding-bottom: 10px;
  12. }
  13. table {
  14. width: 100%;
  15. text-align: center;
  16. border: solid 1px gray;
  17. }
  18. </style>
  19. </head>
  20. <body>
  21. <div id="add">
  22. <h3>新增数据</h3>
  23. 姓名:<input type="text">
  24. 年龄:<input type="text">
  25. 专业:<input type="text">
  26. 爱好:<input type="text">
  27. <button onclick="add()">提交</button>
  28. </div>
  29. <script>
  30. let xhr = new XMLHttpRequest(); //前端使用XMLHttpRequest创建的对象来访问后端
  31. const add = () => {
  32. let inputs = document.querySelectorAll("#add input");
  33. let addJson = {
  34. }
  35. addJson.name = inputs[0].value
  36. addJson.age = inputs[1].value
  37. addJson.major = inputs[2].value
  38. addJson.hobby = inputs[3].value
  39. // let res = ajax(,)
  40. xhr.open('post', 'http://localhost:8090/add', true)//最后一个参数表示是否异步请求
  41. xhr.send(JSON.stringify(addJson))
  42. xhr.onreadystatechange = () => {
  43. if (xhr.readyState === 4) {
  44. if (xhr.status === 200) {
  45. let res = xhr.responseText;
  46. isFirstRender = false
  47. alert(JSON.parse(res).msg);
  48. select()
  49. }
  50. }
  51. }
  52. }
  53. </script>
  54. </body>
  55. </html>
?后端 python
  1. import pymysql
  2. from flask import Flask,request
  3. import json
  4. from flask_cors import CORS
  5. app = Flask(__name__)
  6. CORS(app=app) # 跨域设置
  7. app.debug=True # 开启debug模式
  8. db = pymysql.connect(host='localhost',user='root',password='root',database='python') # 建立连接
  9. cursor = db.cursor() #创建游标
  10. @app.route('/add',methods=['post']) #设置请求头和请求方式
  11. def add():
  12. req_data = request.get_data() # 获取data数据
  13. data = json.loads(req_data) # 需要使用json.loads来转换一下,返回的数据是字符码
  14. print(data)
  15. try:
  16. sql_data = (data['name'],int(data['age']),data['major'],data['hobby'])
  17. sql = "insert into userinfo(name,age,major,hobby) values (%s,%s,%s,%s)" #MySQL查询语句
  18. cursor.execute(sql,sql_data)
  19. db.commit()
  20. return {
  21. 'code':200,'msg':'数据新增成功'}
  22. except:
  23. db.rollback() # 发生错误时回滚
  24. return {
  25. 'code':1000,'msg':"添加失败"}
  26. if __name__ == '__main__':
  27. app.run(host="localhost",port='8090')
  28. cursor.close() #关闭游标
  29. db.close() # 关闭数据库连接

? 删除

删除使用的请求方式是delete。众所周知,前端发送给后端的数据要么在URL中,要么在请求体里面,这里的话,删除我就把数据放在了URL中,flask的request模块可以通过args.get()方法来接收前端放在URL中的数据。

?前端 HTML
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Document</title>
  8. <style>
  9. div {
  10. border-bottom: 1px solid gray;
  11. padding-bottom: 10px;
  12. }
  13. table {
  14. width: 100%;
  15. text-align: center;
  16. border: solid 1px gray;
  17. }
  18. </style>
  19. </head>
  20. <body>
  21. <div id="del">
  22. <h3>根据姓名删除数据</h3>
  23. 姓名:<input type="text">
  24. <button onclick="del()">删除</button>
  25. </div>
  26. <script>
  27. let xhr = new XMLHttpRequest();
  28. const del = () => {
  29. let input = document.querySelector("#del input");
  30. xhr.open('delete', 'http://localhost:8090/del?name=' + input.value, true)
  31. xhr.send()
  32. xhr.onreadystatechange = function () {
  33. if (xhr.readyState === 4) {
  34. if (xhr.status === 200) {
  35. let res = xhr.responseText
  36. isFirstRender = false
  37. alert(JSON.parse(res).msg);
  38. select()
  39. }
  40. }
  41. }
  42. }
  43. </script>
  44. </body>
  45. </html>
?后端 python
  1. import pymysql
  2. from flask import Flask,request
  3. import json
  4. from flask_cors import CORS
  5. app = Flask(__name__)
  6. CORS(app=app)
  7. app.debug=True
  8. db = pymysql.connect(host='localhost',user='root',password='root',database='python')
  9. cursor = db.cursor() #创建游标
  10. @app.route('/del',methods=['delete'])
  11. def delete():
  12. deleteName = request.args.get('name')
  13. sql=f'delete from `userinfo` where name="{
  14. deleteName}";' # 删除数据的sql语句
  15. try:
  16. cursor.execute(sql)
  17. db.commit()
  18. return {
  19. 'code':200,'msg':'删除成功'}
  20. except:
  21. db.rollback() # 发生错误时回滚
  22. return {
  23. 'code':1000,'msg':"删除失败"}
  24. if __name__ == '__main__':
  25. app.run(host="localhost",port='8090')
  26. cursor.close() #关闭游标
  27. db.close() # 关闭数据库连接

? 编辑

修改数据这里就不多说了,直接看源码吧

?前端 HTML
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Document</title>
  8. <style>
  9. div {
  10. border-bottom: 1px solid gray;
  11. padding-bottom: 10px;
  12. }
  13. table {
  14. width: 100%;
  15. text-align: center;
  16. border: solid 1px gray;
  17. }
  18. </style>
  19. </head>
  20. <body>
  21. <div id="edit">
  22. <h3>编辑数据</h3>
  23. <p>
  24. 姓名:<input type="text" class="name" placeholder="请输入需要修改的姓名"> <input class="name" type="text" placeholder="请输入修改后的姓名">
  25. <button onclick="edit()">修改</button>
  26. </p>
  27. </div>
  28. <script>
  29. let xhr = new XMLHttpRequest();
  30. const edit = () => {
  31. let names = document.querySelectorAll("#edit .name");
  32. let addJson = {
  33. }
  34. addJson.beforeName = names[0].value
  35. addJson.afterName = names[1].value
  36. xhr.open('put', 'http://localhost:8090/edit', true)
  37. xhr.send(JSON.stringify(addJson))
  38. xhr.onreadystatechange = function () {
  39. if (xhr.readyState === 4) {
  40. if (xhr.status === 200) {
  41. let res = xhr.responseText;
  42. isFirstRender = false
  43. alert(JSON.parse(res).msg);
  44. select()
  45. }
  46. }
  47. }
  48. }
  49. </script>
  50. </body>
  51. </html>
?后端 python
  1. import pymysql
  2. from flask import Flask,request
  3. import json
  4. from flask_cors import CORS
  5. app = Flask(__name__)
  6. CORS(app=app)
  7. app.debug=True
  8. db = pymysql.connect(host='localhost',user='root',password='root',database='python')
  9. cursor = db.cursor() #创建游标
  10. @app.route('/edit',methods=['put'])
  11. def edit():
  12. req_data = request.get_data()
  13. data = json.loads(req_data)
  14. print('修改消息:',data)
  15. try:
  16. sql = f"update userinfo set name='{
  17. data['afterName']}' where name='{
  18. data['beforeName']}'"
  19. cursor.execute(sql)
  20. db.commit()
  21. return {
  22. 'code':200,'msg':'修改成功'}
  23. except:
  24. db.rollback()
  25. return {
  26. 'code':1000,'msg':"修改失败"}
  27. if __name__ == '__main__':
  28. app.run(host="localhost",port='8090')
  29. cursor.close() #关闭游标
  30. db.close() # 关闭数据库连接

? 查看

?前端 HTML

查看数据这里需要注意一下,修改的数据是需要替换或者新增到我们的表里面,所以需要先删除掉原来的表再替换上新修改或增加的数据。有点前端基础的应该都清楚怎么做。

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Document</title>
  8. <style>
  9. div {
  10. border-bottom: 1px solid gray;
  11. padding-bottom: 10px;
  12. }
  13. table {
  14. width: 100%;
  15. text-align: center;
  16. border: solid 1px gray;
  17. }
  18. </style>
  19. </head>
  20. <body>
  21. <div id="select">
  22. <h3>查询数据 <button onclick="select()">查询</button></h3>
  23. <table border cellspacing="0px" cellpading="0">
  24. <tr class="tableT">
  25. <th>ID</th>
  26. <th>姓名</th>
  27. <th>年龄</th>
  28. <th>专业</th>
  29. <th>爱好</th>
  30. </tr>
  31. </table>
  32. </div>
  33. <script>
  34. let xhr = new XMLHttpRequest();
  35. const select = () => {
  36. xhr.open('get', 'http://localhost:8090/select', true)
  37. xhr.send()
  38. xhr.onreadystatechange = () => {
  39. if (xhr.readyState === 4) {
  40. if (xhr.status === 200) {
  41. let res = xhr.responseText;
  42. let tdData = JSON.parse(res).data
  43. let tableT = document.querySelector("table");
  44. if(isFirstRender){
  45. tdData.forEach(element => {
  46. let tableB = document.createElement('tr')
  47. tableB.className = 'tableB'
  48. tableB.innerHTML = `
  49. <td>${ element.id}</td>
  50. <td>${ element.name}</td>
  51. <td>${ element.age}</td>
  52. <td>${ element.major}</td>
  53. <td>${ element.hobby}</td>
  54. `
  55. tableT.appendChild(tableB)
  56. });
  57. }else{
  58. let delTableB = document.querySelectorAll('.tableB')
  59. for(let i = 0;i<delTableB.length;i++){
  60. tableT.removeChild(delTableB[i])
  61. }
  62. tdData.forEach(element => {
  63. let tableB = document.createElement('tr')
  64. tableB.className = 'tableB'
  65. tableB.innerHTML = `
  66. <td>${ element.id}</td>
  67. <td>${ element.name}</td>
  68. <td>${ element.age}</td>
  69. <td>${ element.major}</td>
  70. <td>${ element.hobby}</td>
  71. `
  72. tableT.appendChild(tableB)
  73. });
  74. }
  75. }
  76. }
  77. }
  78. }
  79. </script>
  80. </body>
  81. </html>
?后端 python
  1. import pymysql
  2. from flask import Flask,request
  3. import json
  4. from flask_cors import CORS
  5. app = Flask(__name__)
  6. CORS(app=app)
  7. app.debug=True
  8. db = pymysql.connect(host='localhost',user='root',password='root',database='python')
  9. cursor = db.cursor() #创建游标
  10. @app.route('/select',methods=['get'])
  11. def select():
  12. try:
  13. cursor.execute("SELECT * FROM userinfo")
  14. array = []
  15. data=()
  16. while isinstance(data,tuple):#循环遍历出data的数据
  17. data = cursor.fetchone() #fetchone方法用于取出数据库中查询的单个数据
  18. if(data == None): break
  19. obj = {
  20. }
  21. obj['id'] = data[0]
  22. obj['name'] = data[1]
  23. obj['age'] = data[2]
  24. obj['major'] = data[3]
  25. obj['hobby'] = data[4]
  26. array.append(obj)
  27. return {
  28. 'code':200,'msg':'查询成功','data':array}
  29. except:
  30. db.rollback()
  31. return {
  32. 'code':1000,'msg':"查询失败"}
  33. if __name__ == '__main__':
  34. app.run(host="localhost",port='8090')
  35. cursor.close() #关闭游标
  36. db.close() # 关闭数据库连接

? 完整代码

?前端 HTML

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Document</title>
  8. <style>
  9. div {
  10. border-bottom: 1px solid gray;
  11. padding-bottom: 10px;
  12. }
  13. table {
  14. width: 100%;
  15. text-align: center;
  16. border: solid 1px gray;
  17. }
  18. </style>
  19. </head>
  20. <body>
  21. <div id="select">
  22. <h3>查询数据</h3>
  23. <table border cellspacing="0px" cellpading="0">
  24. <tr class="tableT">
  25. <th>ID</th>
  26. <th>姓名</th>
  27. <th>年龄</th>
  28. <th>专业</th>
  29. <th>爱好</th>
  30. </tr>
  31. </table>
  32. </div>
  33. <div id="add">
  34. <h3>新增数据</h3>
  35. 姓名:<input type="text">
  36. 年龄:<input type="text">
  37. 专业:<input type="text">
  38. 爱好:<input type="text">
  39. <button onclick="add()">提交</button>
  40. </div>
  41. <div id="edit">
  42. <h3>编辑数据</h3>
  43. <p>
  44. 姓名:<input type="text" class="name" placeholder="请输入需要修改的姓名"> <input class="name" type="text" placeholder="请输入修改后的姓名">
  45. <button onclick="edit()">修改</button>
  46. </p>
  47. </div>
  48. <div id="del">
  49. <h3>根据姓名删除数据</h3>
  50. 姓名:<input type="text">
  51. <button onclick="del()">删除</button>
  52. </div>
  53. <script>
  54. let xhr = new XMLHttpRequest();
  55. function ajax(methods, url, data) {
  56. // xhr.setRequestHeader('Content-Type','text/json;charset=UTF-8')
  57. xhr.open(methods, url, true)
  58. xhr.send(data)
  59. xhr.onreadystatechange = () => {
  60. if (xhr.readyState === 4) {
  61. if (xhr.status === 200) {
  62. let res = xhr.responseText;
  63. console.log(JSON.parse(res));
  64. return JSON.parse(res)
  65. }
  66. }
  67. }
  68. }
  69. let isFirstRender = true
  70. const add = () => {
  71. let inputs = document.querySelectorAll("#add input");
  72. let addJson = {
  73. }
  74. addJson.name = inputs[0].value
  75. addJson.age = inputs[1].value
  76. addJson.major = inputs[2].value
  77. addJson.hobby = inputs[3].value
  78. // let res = ajax(,)
  79. xhr.open('post', 'http://localhost:8090/add', true)
  80. xhr.send(JSON.stringify(addJson))
  81. xhr.onreadystatechange = () => {
  82. if (xhr.readyState === 4) {
  83. if (xhr.status === 200) {
  84. let res = xhr.responseText;
  85. isFirstRender = false
  86. alert(JSON.parse(res).msg);
  87. select()
  88. }
  89. }
  90. }
  91. }
  92. const edit = () => {
  93. let names = document.querySelectorAll("#edit .name");
  94. let addJson = {
  95. }
  96. addJson.beforeName = names[0].value
  97. addJson.afterName = names[1].value
  98. xhr.open('put', 'http://localhost:8090/edit', true)
  99. xhr.send(JSON.stringify(addJson))
  100. xhr.onreadystatechange = function () {
  101. if (xhr.readyState === 4) {
  102. if (xhr.status === 200) {
  103. let res = xhr.responseText;
  104. isFirstRender = false
  105. alert(JSON.parse(res).msg);
  106. select()
  107. }
  108. }
  109. }
  110. }
  111. const select = () => {
  112. xhr.open('get', 'http://localhost:8090/select', true)
  113. xhr.send()
  114. xhr.onreadystatechange = () => {
  115. if (xhr.readyState === 4) {
  116. if (xhr.status === 200) {
  117. let res = xhr.responseText;
  118. let tdData = JSON.parse(res).data
  119. let tableT = document.querySelector("table");
  120. if(isFirstRender){
  121. tdData.forEach(element => {
  122. let tableB = document.createElement('tr')
  123. tableB.className = 'tableB'
  124. tableB.innerHTML = `
  125. <td>${ element.id}</td>
  126. <td>${ element.name}</td>
  127. <td>${ element.age}</td>
  128. <td>${ element.major}</td>
  129. <td>${ element.hobby}</td>
  130. `
  131. tableT.appendChild(tableB)
  132. });
  133. }else{
  134. let delTableB = document.querySelectorAll('.tableB')
  135. for(let i = 0;i<delTableB.length;i++){
  136. tableT.removeChild(delTableB[i])
  137. }
  138. tdData.forEach(element => {
  139. let tableB = document.createElement('tr')
  140. tableB.className = 'tableB'
  141. tableB.innerHTML = `
  142. <td>${ element.id}</td>
  143. <td>${ element.name}</td>
  144. <td>${ element.age}</td>
  145. <td>${ element.major}</td>
  146. <td>${ element.hobby}</td>
  147. `
  148. tableT.appendChild(tableB)
  149. });
  150. }
  151. }
  152. }
  153. }
  154. }
  155. const del = () => {
  156. let input = document.querySelector("#del input");
  157. xhr.open('delete', 'http://localhost:8090/del?name=' + input.value, true)
  158. xhr.send()
  159. xhr.onreadystatechange = function () {
  160. if (xhr.readyState === 4) {
  161. if (xhr.status === 200) {
  162. let res = xhr.responseText
  163. isFirstRender = false
  164. alert(JSON.parse(res).msg);
  165. select()
  166. }
  167. }
  168. }
  169. }
  170. select()
  171. </script>
  172. </body>
  173. </html>

?后端 python

  1. import pymysql
  2. from flask import Flask,request
  3. import json
  4. from flask_cors import CORS
  5. app = Flask(__name__)
  6. CORS(app=app)
  7. app.debug=True
  8. db = pymysql.connect(host='localhost',user='root',password='root',database='python')
  9. cursor = db.cursor() #创建游标
  10. @app.route('/add',methods=['post'])
  11. def add():
  12. req_data = request.get_data()
  13. data = json.loads(req_data)
  14. print(data)
  15. try:
  16. sql_data = (data['name'],int(data['age']),data['major'],data['hobby'])
  17. sql = "insert into userinfo(name,age,major,hobby) values (%s,%s,%s,%s)"
  18. cursor.execute(sql,sql_data)
  19. db.commit()
  20. return {
  21. 'code':200,'msg':'数据新增成功'}
  22. except:
  23. db.rollback() # 发生错误时回滚
  24. return {
  25. 'code':1000,'msg':"添加失败"}
  26. @app.route('/del',methods=['delete'])
  27. def delete():
  28. deleteName = request.args.get('name')
  29. sql=f'delete from `userinfo` where name="{
  30. deleteName}";'
  31. try:
  32. cursor.execute(sql)
  33. db.commit()
  34. return {
  35. 'code':200,'msg':'删除成功'}
  36. except:
  37. db.rollback() # 发生错误时回滚
  38. return {
  39. 'code':1000,'msg':"删除失败"}
  40. @app.route('/edit',methods=['put'])
  41. def edit():
  42. req_data = request.get_data()
  43. data = json.loads(req_data)
  44. print('修改消息:',data)
  45. try:
  46. sql = f"update userinfo set name='{
  47. data['afterName']}' where name='{
  48. data['beforeName']}'"
  49. cursor.execute(sql)
  50. db.commit()
  51. return {
  52. 'code':200,'msg':'修改成功'}
  53. except:
  54. db.rollback()
  55. return {
  56. 'code':1000,'msg':"修改失败"}
  57. @app.route('/select',methods=['get'])
  58. def select():
  59. try:
  60. cursor.execute("SELECT * FROM userinfo")
  61. array = []
  62. data=()
  63. while isinstance(data,tuple):#循环遍历出data的数据
  64. data = cursor.fetchone() #fetchone方法用于取出数据库中查询的单个数据
  65. if(data == None): break
  66. obj = {
  67. }
  68. obj['id'] = data[0]
  69. obj['name'] = data[1]
  70. obj['age'] = data[2]
  71. obj['major'] = data[3]
  72. obj['hobby'] = data[4]
  73. array.append(obj)
  74. return {
  75. 'code':200,'msg':'查询成功','data':array}
  76. except:
  77. db.rollback()
  78. return {
  79. 'code':1000,'msg':"查询失败"}
  80. if __name__ == '__main__':
  81. app.run(host="localhost",port='8090')
  82. cursor.close()
  83. db.close()

?结语

以上是通过python的flask库来实现前后端分离的一个小示例,现在基本的网页格式都是前后端分离的,因此写后端的时候我们只需要专注于后端接口服务的实现,前端实现数据的显示以及布局。
当然这个示例用flask模块取巧来实现后端比之传统的后端来说简单了很多,不过作为python全栈开发基础来说应该是可以作为示例的。可以通过这个示例去做出自己喜欢的网页,开发一些小系统之类的页面。
文章到此结束,谢谢大家!

发表评论

表情:
评论列表 (有 0 条评论,19人围观)

还没有评论,来说两句吧...

相关阅读