👏作者简介:大家好,我是爱敲代码的小王,CSDN博客博主,Python小白
📕系列专栏:python入门到实战、Python爬虫开发、Python办公自动化、Python数据分析、Python前后端开发
📧如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步👀
🔥如果感觉博主的文章还不错的话,请👍三连支持👍一下博主哦
🍂博主正在努力完成2023计划中:以梦为马,扬帆起航,2023追梦人
🔥🔥🔥 python入门到实战专栏:从入门到实战
🔥🔥🔥 Python爬虫开发专栏:从入门到实战
🔥🔥🔥 Python办公自动化专栏:从入门到实战
🔥🔥🔥 Python数据分析专栏:从入门到实战
🔥🔥🔥 Python前后端开发专栏:从入门到实战
文章目录
Flask_RESTful渲染模版
渲染模版就是在Flask_RESTful的类视图中要返回html片段代码,或者是整个html文件代码。
如何需要浏览器渲染模板内容应该使用 api.representation 这个装饰器来定义一个函数,
在这个函数中,应该对 html 代码进行一个封装,再返回。
注意
api.representation装饰器修饰的函数必须返回一个Response对象
from flask import
Flask,render_template,Response
from flask_restful import Api,Resource
import json
app = Flask(__name__)
# 如果想要前端的中文不再是\u这样的编码,可以加如下参数配置
app.config['RESTFUL_JSON'] = dict(ensure_ascii=False)
api = Api(app)
class HomeView(Resource):
def get(self):
return {"msg":"这个是个人主页"}
class IndexView(Resource):
def get(self):
return render_template('index.html')
api.add_resource(IndexView,'/index/')
api.add_resource(HomeView,'/home/')
@api.representation('text/html')
def out_html(data,code,headers):
# 必须返回一个response对象
if isinstance(data, str):
resp = Response(data)
return resp
else:
return
Response(json.dumps(data,ensure_ascii=False).encode('gbk'))
if __name__ == '__main__':
app.run(debug=True)
SQLAlchemy的使用
数据库是一个网站的基础。
比如MySQL、MongoDB、SQLite、PostgreSQL等,这里我们以MySQL为例进行讲解。
SQLAlchemy是一个ORM框架
对象关系映射(英语:Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序设计技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。
从效果上说,它其实是创建了一个可在编程语言里使用的“虚拟对象数据库”。
大白话
对象模型与数据库表的映射
为什么要有SQLAlchemy?
随着项目的越来越大,采用写原生SQL的方式在代码中会出现大量重复的SQL语句,那么,问题就出现了:
1、SQL语句重复利用率不高,越复杂的SQL语句条件越多,代码越长,会出现很多相近的SQL语句
2、很多SQL语句 是在业务逻辑中拼接出来的,如果数据库需要更改,就要去修改这些逻辑,这会容易漏掉对某些SQL语句的修改
3、写SQL时容易忽略web安全问题,造成隐患
而ORM可以通过类的方式去操作数据库而不用再写原生的SQL语句,通过把表映射成类,把行作为实例(一条数据),把字段作为属性,ORM在执行对象操作的时候最终还是会把对象的操作转换为数据库的原生语句,但使用ORM有许多优点:
1、易用性:使用ORM做数据库开发可以有效减少重复SQL语句的概率,写出来的模型也更加直观、清晰。
2、性能损耗小:ORM转换成底层数据库操作指令确实会有一些开销。但是从实际情况来看,这种性能损耗很少(不足5%),只要不是针对性能有严苛的要求,综合考虑开发效率、代码阅读性,带来的好处远大于性能损耗,而且项目越大作用越明显。
3、设计灵活:可以轻松的写出复杂的查询。
4、可移植性:SQLAlchemy封装了底层的数据库实现,支持多个关系数据库引擎,包括流行的
Mysql、PostgreSQL和SQLite,可以非常轻松的切换数据库。
使用ORM操作数据库将变得非常简单
class Person:
name = 'xx'
age = 18
country ='xx'
# Person类 -> 数据库中的一张表
# Person类中的属性 -> 数据库中一张表字段
# Person类的一个对象 -> 数据库中表的一条数据
# p = Person('xx',xx)
# p.save()
# insert into table values ('xx',xx)
我们会以 MySQL+ SQLAlchemy 组合进行讲解。
在操作数据库操作之前,先确保你已经安装了以下软件:
mysql
如果是在windows上,到官网下载
pymysql:pymysql是用Python来操作mysql的包
pip install pymysql
SQLAlchemy:SQLAlchemy是一个数据库的ORM框架,我们在后面会用到。
pip install SQLAlchemy
SQLAlchemy操作数据库
连接数据库
from sqlalchemy import create_engine
def conn_db1():
# 数据库的变量
HOST = '192.168.30.151' #127.0.0.1/localhost
PORT = 3306
DATA_BASE = 'flask_db'
USER = 'root'
PWD = '123'
# DB_URI = f'数据库的名+驱动名://{USER}: {PWD}@{HOST}:{PORT}/{DATA_BASE}'
DB_URI = f'mysql+pymysql://{USER}: {PWD}@{HOST}:{PORT}/{DATA_BASE}'
engine = create_engine(DB_URI)
# 执行一个SQL
sql = 'select 2;'
conn = engine.connect()
rs = conn.execute(sql)
print(rs.fetchone())
执行原生SQL
def conn_db2():
# 数据库的变量
HOST = '192.168.30.151' #127.0.0.1/localhost
PORT = 3306
DATA_BASE = 'flask_db'
USER = 'root'
PWD = '123'
# DB_URI = f'数据库的名+驱动名://{USER}:{PWD}@{HOST}:{PORT}/{DATA_BASE}'
DB_URI = f'mysql+pymysql://{USER}: {PWD}@{HOST}:{PORT}/{DATA_BASE}'
'''
# 创建一个引擎,专门链接数据库用的
engine = create_engine(DB_URI)
sql = 'create table t_user(id int primary key auto_increment, name varchar(32));'
# 链接数据库
conn = engine.connect()
# 执行SQL即可
conn.execute(sql)
'''
def conn_db3():
# 数据库的变量
HOST = '192.168.30.151' #127.0.0.1/localhost
PORT = 3306
DATA_BASE = 'flask_db'
USER = 'root'
PWD = '123'
# DB_URI = f'数据库的名+驱动名://{USER}: {PWD}@{HOST}:{PORT}/{DATA_BASE}'
DB_URI = f'mysql+pymysql://{USER}: {PWD}@{HOST}:{PORT}/{DATA_BASE}'
# 创建一个引擎,专门链接数据库用的
engine = create_engine(DB_URI)
sql = 'create table t_user1(id int primary key auto_increment, name varchar(32));'
# 链接数据库
with engine.connect() as conn:
# 执行SQL即可
conn.execute(sql)
ORM模型映射到数据库中
用 declarative_base 根据 engine 创建一个ORM基类
from sqlalchemy.ext.declarative import
declarative_base
engine = create_engine(DB_URI)
Base = declarative_base(engine)
用这个 Base 类作为基类来写自己的ORM类。要定义 __tablename__ 类属性,来指定这个模型映射到数据库中的表名
class Person(Base):
__tablename__ ='t_person'
创建属性来映射到表中的字段,所有需要映射到表中的属性都应该为Column类型
class Person(Base):
__tablename__ ='t_person'
# 在这个ORM模型中创建一些属性,来跟表中的字段进行一一映射。
# 这些属性必须是sqlalchemy给我们提供好的数据类型
id = Column(Integer,primary_key=True,autoincrement=True)
name = Column(String(50))
age = Column(Integer)
country = Column(String(50))
使用 Base.metadata.create_all() 来将模型映射到数据库中
Base.metadata.create_all()
注意
一旦使用 Base.metadata.create_all() 将模型映射到数据库中后,即使改变了模型的字段,也不会重新映射了
SQLAlchemy对数据的增删改查操作
构建session对象
所有和数据库的ORM操作都必须通过一个叫做 session 的会话对象来实现,通过以下代码来获取会话对象
from sqlalchemy.orm import sessionmaker
engine = create_engine(DB_URI)
Base = declarative_base(engine)
session = sessionmaker(engine)()
添加对象
def create_data_one():
with Session() as session:
p1 = Person(name = '小童',age = 6 , country='北京')
session.add(p1)
session.commit()
def create_data_many():
with Session() as session:
p2 = Person(name = '吕布',age = 19 ,country='北京')
p3 = Person(name = '貂蝉',age = 18 ,country='北京')
session.add_all([p2,p3])
session.commit()
查找对象
def query_data_all():
with Session() as session:
all_person = session.query(Person).all()
for p in all_person:
print(p.name)
def query_data_one():
with Session() as session:
p1 = session.query(Person).first()
print(p1.name)
def query_data_by_params():
with Session() as session:
# p1 =session.query(Person).filter_by(name='吕布').first()
p1 = session.query(Person).filter(Person.name == '吕布').first()
print(p1.age)
修改对象
def update_data():
with Session() as session:
p1 = session.query(Person).filter(Person.name == '吕布').first()
p1.age = 20
# 提交事务
session.commit()
删除对象
将需要删除的数据从数据库中查找出来,然后使用 session.delete 方法将这条数据从session中删除,最后做commit操作就可以了
def delete_data():
with Session() as session:
p1 = session.query(Person).filter(Person.name == '貂蝉').first()
session.delete(p1)
session.commit()