用pymysql和Flask搭建后端,响应前端POST和GET请求

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介:

用pymysql和Flask搭建后端,响应前端POST和GET请求

前言
这次作业不仅需要我建立一个数据库(详情请点击这里),还需要我基于这个数据库写后端接口(注册和登录)供前端访问,接收前端的POST和GET请求,并将登录、注册是否成功传给前端。

本文介绍如何用Flask搭建后端,其中使用了pymysql操作mysql数据库,也会做这个部分的介绍。

正文
需要为前端提供的接口有两个:注册和登录,为此我定义了四个函数,分别是

select_user(userid, password)
insert_user(userid, password, phone, email, company)
on_register()
on_login()
前两个函数是操作数据库,被后两个函数调用;后两个函数是给前端的接口。

后端说明
整个后端的代码如下:

from flask import Flask, request
import json
import pymysql
from flask_cors import CORS

定义app

app = Flask(__name__)

设置跨域

CORS(app, supports_credentials=True)

连接数据库,账号是root,密码是000,数据库名称是shopdata

db = pymysql.connect("localhost", "root", "000", "shopdata") # 连接数据库
cursor = db.cursor() # 定义游标

select a user,根据userid和password获取一个用户是否存在,即判断登录是否成功

def select_user(userid, password):

# mysql语句
select_user_sql = 'select * from userinfo where userid="%s" and password="%s";' % (userid, password)
# 执行mysql语句
result = cursor.execute(select_user_sql)
db.commit()
# 如果返回了一条数据,则登录成功,否则登录失败
if 1 == result:
    result = True
else:
    result = False
    print('there is no user where userid="%s and password="%s"!!' % (userid, password))
return result

insert a user,根据userid、password等信息,生成一个元组,将其插入数据库shopdata的userinfo表

def insert_user(userid, password, phone, email, company):

# mysql语句
insert_user_sql = 'insert into userinfo(userid, password, phone, email, company)' \
                  'values("%s", "%s", "%s", "%s", "%s");' % (userid, password, phone, email, company)
# 执行mysql语句,如果插入成功,则注册成功,否则注册失败
try:
    cursor.execute(insert_user_sql)
    db.commit()
    print('insert user where userid="%s" and password="%s"!!' % (userid, password))
    result = True
except:
    print('can not insert user where userid="%s" and password="%s"!!' % (userid, password))
    result = False
finally:
    return result

on_register,提供给前端的注册接口

@app.route("/api/register", methods=['POST']) # 路由,响应POST请求
def on_register():

# 默认的用户名和密码(该用户不存在且非法)
userid = ''
password = ''
phone = ''
email = ''
company = ''
# 判断传入的参数是否为空,并取出前端传来的参数
data = request.get_data()
# print(data)
if data is not None:
    # 将bytes类型转化为字典。对应的,前端发过来的内容应该是JSON.stringify(一个对象)
    data = json.loads(data)  # 转化为字典对象
    # print(data)
    userid = data.get('userid')
    password = data.get('password')
    phone = data.get('phone')
    email = data.get('email')
    company = data.get('company')
# 判断参数是否非法。若非法则直接判断出注册失败,若合法则尝试注册,再根据数据库操作结果判断。
if len(userid) > 0 and len(password) > 0 and len(phone) > 0 and len(email) > 0 and len(password) > 0:
    return_dict = {'success': insert_user(userid=userid, password=password, phone=phone,
                                          email=email, company=company)}
else:
    return_dict = {'success': False}
# 返回结果(结果暂时简单点,只返回成功或失败)
return json.dumps(return_dict)  # 字典转json

on_login,提供给前端的登录接口

@app.route("/api/login", methods=['GET']) # 路由,响应GET请求
def on_login():

# 默认的用户名和密码(数据库中不存在该用户)
userid = ''
password = ''
# 判断传入的参数是否为空,获取前端传来的参数
if request.args is not None:
    print(request.args)
    data = request.args.to_dict()
    userid = data.get('userid')
    password = data.get('password')
# 查询数据库
result = select_user(userid=userid, password=password)
if not result:
    print('user where userid="%s and password="%s" login!!' % (userid, password))
# 返回登录结果(暂时简单一点,成功或失败)
return_dict = {'success': result}
return json.dumps(return_dict)  # 字典转json

if name == '__main__':

# 运行app
app.run()

# 程序结束时释放数据库资源
cursor.close()
db.close()  # 关闭连接

值得注意的是,这里的两个接口分别响应POST请求和GET请求。

可以发现,两个接口获取前端传过来的参数的方式是不同的:

GET
data = request.args.to_dict() # 需from flask import request
这样拿到的data是一个python的字典对象

POST
data = request.get_data() # 需from flask import request
data = json.loads(data) # 转化为字典对象。需import json
这两行代码才拿到一个python的字典对象

接口获取前端传过来的参数的方式与其响应的请求类型(如POST、GET、POST和GET)是对应的。

对应地,前端发过来的参数类型也需要和后端进行匹配。

前端代码
这里给出前端处理用户登录和注册请求的函数。

login
function login() {

var url = "http://127.0.0.1:5000/api/login";
var userid = document.getElementById("userid");
var password = document.getElementById("password");
$.ajax({
    url: url,
    type: "GET",
    data: {
        userid: userid.value,
        password: password.value,
    },
    success: function(data) {
        var data1 = JSON.parse(data);
        // console.log(data1);
        if (data1.success) {
            window.sessionStorage.setItem("userid", userid.value);
            alert("登录成功!进入主页面!");
            window.location.href = 'index.html';
        } else {
            alert("登录失败!请输入正确的账号和密码!");
        }
    },
    error: function(XMLHttpRequest, textStatus, errorThrown) {
        if (textStatus === 'timeout') {
            alert('请求超时,请重试!');
        }
    }

})

}
register
function register() {

var password1 = document.getElementById("password1").value;
var password2 = document.getElementById("password2").value;
var userid = document.getElementById("userid").value;
var phone = document.getElementById("phone").value;
var email = document.getElementById("email").value;
var company = document.getElementById("company").value;
if (password1 !== password2) {
    alert("两次输入的密码不相同,请重新输入!");
    return;
}
$.ajax({
    url: "http://127.0.0.1:5000/api/register",
    type: "POST",
    // 转成json
    data: JSON.stringify({
        userid: userid,
        password: password1,
        phone: phone,
        email: email,
        company: company
    }),
    success: function(data) {
        var data1 = JSON.parse(data);
        if (data1.success) {
            alert("注册成功,请登录!");
            window.location.href = 'login.html';
        } else {
            alert("注册失败,请检查您输入的信息是否正确!");
        }
    },
    error: function(XMLHttpRequest, textStatus, errorThrown) {
        if (textStatus === 'timeout') {
            alert("请求超时!");
        }
    }
})

}
可以注意到,用ajax发送GET请求和PSOT请求时,我发的数据类型是不一样的。

login是GET请求,发送了json字符串
JSON.stringify({

userid: userid,
password: password1,
phone: phone,
email: email,
company: company

})
register是POST请求,发送了javascript的类的对象
{

userid: userid.value,
password: password.value,

}
至此,本文对这次作业中后端搭建的介绍就结束了。

这次作业算是我第一次写后端,也是我第一次接触Flask,如果我有写错的地方,请在评论区指正!

作者:@臭咸鱼

转载请注明出处:https://www.cnblogs.com/chouxianyu/

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
26天前
|
前端开发 JavaScript 开发工具
独家揭秘:前端大牛们都在用的高效开发工具,你get了吗?
前端开发领域日新月异,Visual Studio Code、Webpack、React/Vue和Git等工具凭借高效、便捷的特点,深受前端大牛们青睐。本文将揭秘这些工具的使用技巧,帮助你提升开发效率,轻松应对各种前端挑战。
30 3
|
2月前
|
JSON 前端开发 Java
震惊!图文并茂——Java后端如何响应不同格式的数据给前端(带源码)
文章介绍了Java后端如何使用Spring Boot框架响应不同格式的数据给前端,包括返回静态页面、数据、HTML代码片段、JSON对象、设置状态码和响应的Header。
153 1
震惊!图文并茂——Java后端如何响应不同格式的数据给前端(带源码)
|
2月前
|
监控 JavaScript 前端开发
前端的混合之路Meteor篇(六):发布订阅示例代码及如何将Meteor的响应数据映射到vue3的reactive系统
本文介绍了 Meteor 3.0 中的发布-订阅模型,详细讲解了如何在服务器端通过 `Meteor.publish` 发布数据,包括简单发布和自定义发布。客户端则通过 `Meteor.subscribe` 订阅数据,并使用 MiniMongo 实现实时数据同步。此外,还展示了如何在 Vue 3 中将 MiniMongo 的 `cursor` 转化为响应式数组,实现数据的自动更新。
|
2月前
|
前端开发 JavaScript API
前端Get请求能在body上传参吗
【10月更文挑战第11天】 在浏览器环境中,GET请求的body参数会被忽略,这是因为浏览器中的XHR和fetch实现限制了这一行为。而在Node.js服务端环境中,GET请求可以在body中传递参数,因为服务端请求库没有这样的限制。实际上,GET请求不带body是HTTP标准的一部分,但在某些场景下,为了遵循RESTful规范,可以考虑通过服务端转发或BFF模式来实现复杂的参数传递。
|
2月前
|
前端开发 小程序 Java
java基础:map遍历使用;java使用 Patten 和Matches 进行正则匹配;后端传到前端展示图片三种情况,并保存到手机
这篇文章介绍了Java中Map的遍历方法、使用Pattern和matches进行正则表达式匹配,以及后端向前端传输图片并保存到手机的三种情况。
22 1
|
2月前
|
存储 前端开发 Java
验证码案例 —— Kaptcha 插件介绍 后端生成验证码,前端展示并进行session验证(带完整前后端源码)
本文介绍了使用Kaptcha插件在SpringBoot项目中实现验证码的生成和验证,包括后端生成验证码、前端展示以及通过session进行验证码校验的完整前后端代码和配置过程。
214 0
验证码案例 —— Kaptcha 插件介绍 后端生成验证码,前端展示并进行session验证(带完整前后端源码)
|
2月前
|
JSON 中间件 数据格式
五、Flask的请求和响应方法与常用技巧
五、Flask的请求和响应方法与常用技巧
94 0
|
2月前
|
前端开发 JavaScript Java
导出excel的两个方式:前端vue+XLSX 导出excel,vue+后端POI 导出excel,并进行分析、比较
这篇文章介绍了使用前端Vue框架结合XLSX库和后端结合Apache POI库导出Excel文件的两种方法,并对比分析了它们的优缺点。
520 0
|
2月前
|
前端开发 JavaScript 小程序
前端uni开发后端用PHP的圈子系统该 如何做源码?
圈子系统系统基于TP6+Uni-app框架开发;客户移动端采用uni-app开发,管理后台TH6开发。系统支持微信公众号端、微信小程序端、H5端、PC端多端账号同步,可快速打包生成APP
|
2月前
|
前端开发 Java 数据库
springBoot:template engine&自定义一个mvc&后端给前端传数据&增删改查 (三)
本文介绍了如何自定义一个 MVC 框架,包括后端向前端传递数据、前后端代理配置、实现增删改查功能以及分页查询。详细展示了代码示例,从配置文件到控制器、服务层和数据访问层的实现,帮助开发者快速理解和应用。