前言

这次作业不仅需要我建立一个数据库(详情请点击这里),还需要我基于这个数据库写后端接口(注册和登录)供前端访问,接收前端的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/

欢迎讨论和交流!


用pymysql和Flask搭建后端,响应前端POST和GET请求的更多相关文章

  1. express搭建后端请求路由,前端进行访问对应的接口 后端解决跨域

    代码在 ==>E:\nodes实战\myserve\testserve 1 express搭建后端请求路由,前端进行访问对应的接口 1) 创建项目目录 express 项目名 -e 然后按照提示 ...

  2. 从零开始用 Flask 搭建一个网站(四)

    前言 从零开始用 Flask 搭建一个网站(三) 介绍了网页前端与后端.前端与前端之间数据的交流.本节主要介绍一下如何应用 Flask-OAuthlib, 使用 Flask-OAuthlib 就可以轻 ...

  3. 从零开始用 Flask 搭建一个网站(三)

    从零开始用 Flask 搭建一个网站(二) 介绍了有关于数据库的运用,接下来我们在完善一下数据在前端以及前端到后端之间的交互.本节涉及到前端,因此也会讲解一下 jinja2 模板.jQuery.aja ...

  4. Flask搭建个人博客网站(1)—项目规划--李渣渣(lizaza.cn)

    Flask搭建个人博客网站(1)—项目规划--李渣渣(lizaza.cn) 发布时间:2020-05-2413次浏览 前言 现在市面上又许多比较成熟的博客平台,例如:CSDN,博客园,新浪博客等!对于 ...

  5. 基 vue-element-admin升级的Vue3 +TS +Element-Plus 版本的后端管理前端解决方案 vue3-element-admin 正式对外发布,有来开源组织又一精心力作,毫无保留开放从0到1构建过程

    项目简介 vue3-element-admin 是基于 vue-element-admin 升级的 Vue3 + Element Plus 版本的后台管理前端解决方案,是 有来技术团队 继 youla ...

  6. 从零开始用 Flask 搭建一个网站(一)

    前言 笔者之前未接触过 Python,只是略懂一点前端,所以说从零开始也相差无几吧.Flask 是一个轻量级的基于 Python 的框架,但是扩展性非常良好(Github 上 22000 多个 sta ...

  7. WebSocket.之.基础入门-后端响应消息

    WebSocket.之.基础入门-后端响应消息 在<WebSocket.之.基础入门-前端发送消息>的代码基础之上,进行添加代码.代码只改动了:TestSocket.java 和 inde ...

  8. Flask前后端分离项目案例

    简介 学习慕课课程,Flask前后端分离API后台接口的实现demo,前端可以接入小程序,暂时已经完成后台API基础架构,使用postman调试. git 重构部分: token校验模块 auths认 ...

  9. 从零开始用 Flask 搭建一个网站(二)

    从零开始用 Flask 搭建一个网站(一) 介绍了如何搭建 Python 环境,以及 Flask 应用基本项目结构.我们要搭建的网站是管理第三方集成的控制台,类似于 Slack. 本篇主要讲解数据如何 ...

随机推荐

  1. 从0开发3D引擎(十二):使用领域驱动设计,从最小3D程序中提炼引擎(第三部分)

    目录 上一篇博文 继续实现 实现"DirectorJsAPI.init" 实现"保存WebGL上下文"限界上下文 实现"初始化所有Shader&quo ...

  2. JUC常用同步工具类——CountDownLatch,CyclicBarrier,Semaphore

    在 JUC 下包含了一些常用的同步工具类,今天就来详细介绍一下,CountDownLatch,CyclicBarrier,Semaphore 的使用方法以及它们之间的区别. 一.CountDownLa ...

  3. 解决Hexo博客模板hexo-theme-next的翻页按钮不正常显示问题

    用Hexo搭了个Gitpage的博客,兴冲冲的发了11篇博文后发现翻页按钮不正常显示,显示为<i class="fa fa-angle-right"></i> ...

  4. python基本数据类型的操作

    1 列表和元组 1.列表基本操作 1. 列表赋值 a = [1,2,3,4,5,6,7,8] a[0] = 100 #the result : [100, 2, 3, 4, 5, 6, 7, 8] 2 ...

  5. MySQL数据备份之逻辑备份工具mysqldump

    #前言:我们知道对数据进行备份很重要,出现非正常操作可以进行对数据进行恢复,下面我们就来使用一下mysql数据库自带的一个逻辑备份工具mysqldump 1.简单概述 #mysqldump:mysql ...

  6. 开篇词The Start以及[Vjudge][HDU2242]空调教室

    开篇 这是我写的第一篇记录好题的博客,也是博客园上我发布的第一篇博客. 以后我的所有博客都将在洛谷和博客园上同时发布,同志们有兴趣的在哪里都可以看一看. [https://www.luogu.com. ...

  7. 求你了,别再说Java对象都是在堆内存上分配空间的了!

    Java作为一种面向对象的,跨平台语言,其对象.内存等一直是比较难的知识点,所以,即使是一个Java的初学者,也一定或多或少的对JVM有一些了解.可以说,关于JVM的相关知识,基本是每个Java开发者 ...

  8. python常用软件包

    redis数据库: 链接:https://pan.baidu.com/s/1X_ndCj0scF2WZd2FPLRKag 提取码:e3zm git安装包: 链接:https://pan.baidu.c ...

  9. 解决git推不上去1

    在使用 Android Studio 对源代码进行push到码云时可出错,报错如下: error: failed to push some refs to 'https://gitee.com/文件路 ...

  10. Python数据基本类型3

    -*- coding:utf-8 -*-字典 键值对数据 dict dic = {'键':'值'}存储数据 字典的查找快一些不可哈希的,就是可变的数据 可变的数据不能哈希 不可变的数据能哈希 pyth ...