全栈开发一条龙——前端篇
第一篇:框架确定、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 = em
usr_add.name = na
usr_add.password = ps
usr_add.id = id
db.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 = email
usr_add.name = name
usr_add.password = password
usr_add.id = id
db.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参数,默认为none
id = 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)
#启动flask
if __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.text
res = 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="测试文件内容")
就发送成功啦~