sql操作、发送http请求和邮件发送 全栈开发之路——后端篇(2)

全栈开发一条龙——前端篇
第一篇:框架确定、ide设置与项目创建
第二篇:介绍项目文件意义、组件结构与导入以及setup的引入。
第三篇:setup语法,设置响应式数据。
第四篇:数据绑定、计算属性和watch监视
第五篇 : 组件间通信及知识补充
第六篇:生命周期和自定义hooks
第七篇:路由
第八篇:传参
第九篇:插槽,常用api和全局api。
全栈开发一条龙——后端篇
第一篇:初识Flask&MySQL实现前后端通信

本文将继续讲述sql操作、发送http请求和邮件发送。

文章目录

  • 一、sql数据库操作
    • 1.添加数据
    • 2.修改数据
    • 3.删除数据
  • 二、模式请求
  • 三、类视图
  • 四、邮件发送

一、sql数据库操作

数据库只有查找操作是可以用老版写法的,在上一篇我们已经说过了,接下来介绍一些别的操作。

1.添加数据

按老版本这么写:

db.session.execute(  "insert into user (email,password,name) values('1177@hotmail.com','Aa123456','DJTrump' ) " )

报错,把bug修了

db.session.execute(  text("insert into user (email,password,name) values('1177@hotmail.com','Aa123456','DJTrump') ") )

不报错,但不添加至数据库

注:如果一定要用老版本,请把每一个元素都写全,不然添加不成功。使用我下面的方法,可以缺省自增变量。
同时请注意,用老方法也别忘了commit,不然只是缓存。

新版要这么写:

class user_add(db.Model):__tablename__ = 'user'id = db.Column(db.Integer, primary_key=True, autoincrement=True)email = db.Column( db.String(150) )password = db.Column( db.String(150) )name = db.Column( db.String(45) )
# 添加数据
usr_add = user_add()
usr_add.email = "1177@hotmail.com"
usr_add.name = "DJTrump"
usr_add.password = "Aa123456"
db.session.add(usr_add)
db.session.commit()


就添加成功了。我们把他封装起来,并写一个路由。

@app.route('/add')
def user_add(em,na,ps,id):# 添加数据usr_add = user()usr_add.email = emusr_add.name = nausr_add.password = psusr_add.id  =  iddb.session.add(usr_add)db.session.commit()

2.修改数据

我们先用filter找到我们要修改什么数据,然后修改,最后提交。

@app.route('/edit')
def user_edit():changei = user.query.filter(user.id=="1").first()changei.email = "114514@123.com"db.session.commit()


调用这个方法发现是可以修改成功的。
其中.first表示找到的第一个,也可以是all等参数,由于我们这里的id是唯一参数,所以必定只能找到一个,怎么写都可以了。

3.删除数据

与修改数据类似。

@app.route('/delete')
def user_delete():delete_user = user.query.filter(user.id=="2").first()db.session.delete(delete_user)db.session.commit()


至此完整代码如下:

from flask import Flask,jsonify,request
from flask_cors import CORS
from sqlalchemy import text
from dataset_info import *app = Flask(__name__)
app.config["JSON_AS_ASCII"] = False#导入数据库
from data import db
URI = "mysql://" + mysql_account + ":" + mysql_password + "@" + mysql_host + ":" + mysql_port + "/" + mysql_data_col
app.config["SQLALCHEMY_DATABASE_URI"] = URI
app.config["SQLALCHEMY_COMMIT_ON_TEARDOWN"] = True
#初始化操作
db.init_app(app)CORS(app,cors_allowed_orgins = "*")def list_row2list_dic(list_row):  dic_temp = {}list_dic = []for x in list_row:listda = []listidx= []for dx in x:    listda.append(dx)xx = x._key_to_index        for idx in xx:listidx.append(idx)dic_temp=dict(zip(listidx,listda))list_dic.append(dic_temp)return list_dic
class user(db.Model):__tablename__ = 'user'id = db.Column(db.Integer, primary_key=True, autoincrement=True)email = db.Column( db.String(150) )password = db.Column( db.String(150) )name = db.Column( db.String(45) )@app.route('/add')
def user_add(email,name,password,id):# 添加数据usr_add = user()usr_add.email = emailusr_add.name = nameusr_add.password = passwordusr_add.id  =  iddb.session.add(usr_add)db.session.commit()@app.route('/edit')
def user_edit():changei = user.query.filter(user.id=="1").first()changei.email = "114514@123.com"db.session.commit()@app.route('/delete')
def user_delete():delete_user = user.query.filter(user.id=="2").first()db.session.delete(delete_user)db.session.commit()@app.route('/', methods=['GET'])
def index():res = {"msg" : "你好,这里是后端入口"}#url传参 获取id参数,默认为noneid = request.args.get("id",None)print("id:"+id)raw_userlist = db.session.execute( text("select * from user") ).fetchall()userlist = list_row2list_dic(raw_userlist)d2js={"data":userlist}return jsonify(d2js)#启动flaskif __name__ == "__main__":#调试模式 这样每次修改代码不用每次重启服务app.run(debug=True, host = "0.0.0.0",port = 5000)# app.run(debug=True)

配置可以专门写一个文件,防止以后改的时候到处找

mysql_account = "root"
mysql_password = "xxxxx"
mysql_host = "localhost"
mysql_port = "3306"
mysql_data_col = "test_data"

二、模式请求

我们之前说过get的请求模式,我们现在来试试post的请求。一般我们用post来提交数据、表单等,返回值一般为是否提交成功。post的接参数的方法与put一致,用form。delete和get用args接收参数,其他写法几乎一致,我们这里拿post举例。其他只要form换args就行了,就不写了。

manage:

# 测试post
@app.route('/insert/', methods=['POST'])
def test_post():#post和get用form接收参数email = request.form.get("email",None)id = request.form.get("id",None)name = request.form.get("name",None)password = request.form.get("password",None)user_add(email=email,id=id,name=name,password=password)return jsonify(  {"errorcode":0,"msg":"插入成功"}  )

test:

    def test_post(self,url,data={}):res = requests.post(url=url,data=data)return res.textres = httpapi.test_post("http://localhost:5000/insert/",data={"id":123,"name":"123","email":"123","password":"123"})res = res.encode('utf-8').decode('unicode_escape')print(res)

运行后我们可以发现数据库中确实加入了数据,具体怎么写的应该很容易理解,看代码即可。

三、类视图

到此为止,我们的方法已经很多了,我们需要用更好的封装方式来管理我们的方法。


我们可以请求函数写成类,然后可以写get,post等几个不同的功能,这样就可以一个接口多个功能,而且还能继承,非常方便。

四、邮件发送

掌握了数据库和数据传输之后,我们如果想做最基础的登录注册,还需要学会邮箱验证。
打开你的邮箱,找到设置,我的是163邮箱

把这个服务打开,然后会跳出一长串大写字母的授权码,请记录下来。
接下来进入代码阶段:
我们先在social文件夹中在建立一个文件:mail_send.py文件,用于封装发送邮件。

我们先导入库,这些库应该都是python自带的。

import smtplib
#导入文本库
from email.mime.text import MIMEText
#导入邮件分类
from email.mime.multipart import MIMEMultipart

然后写发送邮件的业务类

class send_email:def __init__(self):self.sender_mail = "你的账号"self.password = "你的授权码"def send_mail(self,dest_mail,title,content):mail = MIMEMultipart()#设置标题mail["Subject"] = title#发送者mail["From"] = self.sender_mail#收件人mail["to"] = dest_mail#写内容part = MIMEText(content,"html","utf-8")#把内容填进去mail.attach(part)s = smtplib.SMTP_SSL("smtp.163.com",465) s.login(self.sender_mail , self.password )s.sendmail(self.sender_mail , dest_mail , mail.as_string() )s.close()

注释写的非常清楚,代码的理解请看注释,唯一要说的是 s = smtplib.SMTP_SSL("smtp.163.com",465)这是在定义stmp协议类,前面的请输入你的邮箱的运营商的stmp,我是163邮箱,如果你是qq邮箱,就把163换成qq。后一个参数是port端口号,stmp协议的默认端口号是465.

最后写一个测试代码

sendemail = send_email()
sendemail.send_mail(dest_mail="你想发给的人",title="测试标题",content="测试文件内容")


就发送成功啦~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/12339.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[BJDCTF 2020]easy_md5、[HNCTF 2022 Week1]Interesting_include、[GDOUCTF 2023]泄露的伪装

目录 [BJDCTF 2020]easy_md5 ffifdyop [SWPUCTF 2021 新生赛]crypto8 [HNCTF 2022 Week1]Interesting_include php://filter协议 [GDOUCTF 2023]泄露的伪装 [BJDCTF 2020]easy_md5 尝试输入一个1,发现输入的内容会通过get传递但是没有其他回显 观察一下响应…

VictoriaMetrics

概念 介绍 VictoriaMetrics,是一个快速高效、经济并且可扩展的监控解决方案和时序数据库 本文均用VM简称VictoriaMetric 作用 用于作为prometheus的长期储存方案,代替prometheus存储监控采集的数据 优点 远程存储:可作为单一或多个Pro…

【算法】二分查找——二分查找

本节博客详述“二分查找”并且以例子来进行讨论,有需要借鉴即可。 目录 1.二分查找1.1使用前提1.2模板 2.题目3.题解代码示例4.二分查找的一般模板5.总结 1.二分查找 1.1使用前提 使用的条件:数组具有“二段性”,二段性指的是数组可以根据某…

110份财务常用excel模板(个税、采购、报销、预算),超实用!

如果你还在为报表头疼,那你一定不能错过这篇干货满满的分享! 个税报表 个人所得税,听起来就头大?别担心,掌握这些技巧,轻松搞定! - 记录员工收入,确保数据准确无误 - 计算应纳税…

【Unity Shader入门精要 第7章】基础纹理(一)

1. 纹理映射 每一张纹理可以看作拥有一个属于自己的2D坐标空间,其横轴用U表示,纵轴用V表示,因此也称为UV坐标空间。 UV空间的坐标范围为[0,0]到[1,1],在Unity中,UV空间也是从左下到右上&#…

Network Compression

听课(李宏毅老师的)笔记,方便梳理框架,以作复习之用。本节课主要讲了Network Compression,包括为什么要压缩,压缩的主要手段(pruning,knowledge distillation,parameter quantization,architect…

Elasticsearch_sql插件安装+使用

一、安装 前提是你先安装好了elasticseach,安装过程在我上一篇博客有说,可以看一下。 在elasticsearch容器启动的情况下,进入到elasticsearch容器,Elasticsearch_sql仓库,比如我的版本是8.11.2,那么我就选…

[蓝桥杯]真题讲解:抓娃娃(思维+二分)

[蓝桥杯]真题讲解&#xff1a;抓娃娃&#xff08;思维二分&#xff09; 一、视频讲解二、正解代码1、C2、python33、Java 一、视频讲解 [蓝桥杯]真题讲解&#xff1a;抓娃娃&#xff08;思维二分&#xff09;&#xff09; 二、正解代码 1、C #include<bits/stdc.h> #d…

前端CSS3基础1(新增长度单位,盒子模型,背景,边框,文本属性,渐变,字体,2D变换,3D变换)

前端CSS3基础1&#xff08;新增长度单位&#xff0c;盒子模型&#xff0c;背景&#xff0c;边框&#xff0c;文本属性&#xff0c;渐变&#xff0c;字体&#xff0c;2D变换&#xff0c;3D变换&#xff09; CSS3 新增长度单位CSS3 新增盒子模型相关属性box-sizing怪异盒模型box-…

ambari-server高可用配置方案

制品 https://kdocs.cn/l/cie4hSgvUunX 前置条件 环境需要支持VRRP协议 环境需要配置好yum源 变更影响面 变更不会影响其他组件 配置lb(需要客户侧配置并提供LB地址) 转发方式选择 主备 监听端口为8080、8440、8441 协议为tcp 后端监听选择kde-offline1为主

【RAG 论文】UPR:使用 LLM 来做检索后的 re-rank

论文&#xff1a;Improving Passage Retrieval with Zero-Shot Question Generation ⭐⭐⭐⭐ EMNLP 2022, arXiv:2204.07496 Code: github.com/DevSinghSachan/unsupervised-passage-reranking 论文&#xff1a;Open-source Large Language Models are Strong Zero-shot Query…

【HR】阿里三板斧--20240514

参考https://blog.csdn.net/haydenwang8287/article/details/113541512 头部三板斧 战略能不能落地、文化能不能得到传承、人才能不能得到保障。 头部三板斧适用的核心场景有三个&#xff1a;一是战略不靠谱&#xff1b;二是组织效率低、不聚心&#xff1b;三是人才跟不上。对…

c++ 各版本特性介绍

c C是一种高级编程语言&#xff0c;以其强大的功能、灵活性和高效性而闻名。它是由Bjarne Stroustrup在20世纪80年代初期在贝尔实验室开发的&#xff0c;作为C语言的一个扩展。C不仅包含了C语言的所有特性&#xff0c;还引入了面向对象编程&#xff08;OOP&#xff09;的概念&…

基于Vue3+ElementPlus项目,复制文字到剪贴板功能实践指南,揭秘使用js-tool-big-box工具库的核心优势

在前端开发项目中&#xff0c;很多时候有那么一个场景&#xff0c;就是要求将一段文案复制下来&#xff0c;这段文案可能是一串很长的id&#xff0c;可能是一条命令语句&#xff0c;可能是一小段文案&#xff0c;复制到剪贴板上。这样有利于用户复制到其他地方去&#xff0c;使…

微软必应bing国内官方代理商,广告账户如何开户?

微软必应Bing作为全球知名的搜索引擎之一&#xff0c;其广告平台为众多企业提供了广阔的市场空间和精准的推广机会。对于中国内地的企业而言&#xff0c;通过必应Bing开展国内广告推广不仅能够触及更广泛的潜在客户群体&#xff0c;还能有效提升品牌影响力。通过微软必应Bing国…

搜索引擎的设计与实现(三)

目录 5 系统详细实现 5.1实现环境配置 5.2功能实现 5.2.1 建立索引 5.2.2 文件搜索实现 5.2.3 数据库的连接配置 5.2.4 数据库搜索实现 5.2.5 后台数据编辑实现 前面内容请移步 搜索引擎的设计与实现&#xff08;二&#xff09; 免费源代码&毕业设计论文 搜索…

git-删除workspace.xml的跟踪

问题描述 .gitignore 文件内容如下&#xff1a; .pyc *.pyc user_files/ .vscode/ __pycache__//.idea/misc.xml /.idea/modules.xml /.idea/inspectionProfiles/profiles_settings.xml /.idea/inspectionProfiles/Project_Default.xml /.idea/batrp_webbackend-server-dev.i…

NARUTO 复现记录

1 环境配置 下载项目&#xff0c;一定要 git 下载全项目&#xff0c;下载完后要检查third_parities 里面的coslam和neural_slam_eval 文件全不全。 git clone --recursive https://github.com/oppo-us-research/NARUTO.git 环境配置 注意 bash scripts/installation/conda…

番外篇 | 利用PyQt5+YOLOv5来搭建目标检测系统(附可视化界面+功能介绍+源代码)

前言:Hello大家好,我是小哥谈。PyQt5是一个Python绑定的Qt库,是用于创建图形用户界面(GUI)和其他应用程序组件的工具包。PyQt5提供了许多GUI元素,如按钮、文本框、标签等,也提供了许多Qt的功能,如网络、数据库、XML等。通过PyQt5可以在Python中使用Qt的丰富功能和强大的工…

克服亏损的负面影响 学学现货白银止损的方法

一个多月以前&#xff0c;现货黄金的上涨还十分强劲&#xff0c;一度还逼近历史的高位30大关。但是我们看近半个月以来&#xff0c;现货白银价格出现了调整。很多在高位买入的投资者都承受了较大的亏损&#xff0c;这时候就凸显出了现货白银止损的作用。如果投资者能够通过近期…