项目3:“古典文学网”首页API接口开发_第1页
项目3:“古典文学网”首页API接口开发_第2页
项目3:“古典文学网”首页API接口开发_第3页
项目3:“古典文学网”首页API接口开发_第4页
项目3:“古典文学网”首页API接口开发_第5页
已阅读5页,还剩115页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

项目3:“古典文学网”首页API接口开发

目录01.06.拓展任务02.知识储备04.技能拓展项目描述03.项目任务05.项目总结

学习目标知识目标:了解RESTfulAPI的核心概念,掌握API接口设计的原则与最佳实践。了解Jinja2模板的语法及特性,掌握其开发动态网页的技能;了解flask-sqlalchemy包的功能与特性,掌握其在项目开发中的应用。能力目标:通过学习RESTfulAPI的设计原则,能为“古典文学网”设计符合规范的API接口;通过学习Jinja2模板的相关知识,能够运用Jinja2来构建动态网页;通过学习flask-sqlalchemy的相关知识,能够为项目开发数据库操作模块。素质目标:培养系统思维,严格遵守行业规范和标准,提高软件质量和可靠性;培养责任感、职业精神和团队精神,遵守职业道德。01项目描述

1.项目描述

小白已经逐步熟悉了项目的研发工作,接下来他计划为项目开发数据库操作模块,以便更好地与MySQL数据库进行交互。在此基础上,他还将开发首页模块中的多个API接口,包括导航栏API接口、搜索API接口以及文学推荐API接口,并对注册API接口和登录API接口的进一步优化,以确保用户注册和登录流程的顺畅与安全。02知识储备

2.知识储备

为了项目的顺利开发,小白需要了解了RESTfulAPI的设计原则,并熟悉了Jinja2模板引擎的使用方法,以及如何在Flask框架中执行数据库操作等关键知识。

2.1.后端API设计规范

下面,我们将探讨API开发中应遵循的一些常见规范,以确保接口设计的高效性、易用性和可维护性。

2.1.后端API设计规范1.接口路径规范(1)接口路径开头规范

一个产品,无论其后端由多少个服务构成,都应当只拥有一个统一的API入口。其URL路径的接口路径,通常以“/api”或“/[版本号]/api”为起始,这有助于确保API的清晰性和一致性。以下便是正确的API设计规范::5000/api/task:5000/v2/api/tasks错误的API设计规范如下所示::5000/biz/tasks:5000/biz/api/tasks

2.1.后端API设计规范1.接口路径规范(2)接口路径命名规范

接口路径应遵循统一的命名规范,即采用“api/aa-bb”的形式进行命名。以下是关于API设计的正确规范:

:5000/api/task-groups错误的API设计规范如下所示::5000/api/taskGroups在API设计中,接口路径中的资源应遵循使用复数的原则,而非单数。以下是关于API设计的正确规范::5000/api/tasks错误的API设计规范如下所示::5000/api/task

2.1.后端API设计规范(3)接口需面向通用业务

在API设计过程中,我们应确保接口路径的命名面向通用业务逻辑,而非局限于前端业务需求。以获取筛选表单中任务字段下拉选项为例,以下是该API设计的正确规范:1.接口路径规范:5000/api/tasks错误的API设计规范如下所示::5000/api/task-select-options

尽管目前这个接口仅被用于表单的下拉选择中,我们仍需考虑其未来可能应用于各种场景的可能性。因此,我们应该以更加通用的方式提供接口,以便客户端能够自由组合和灵活使用。这样的设计思路不仅满足了当前的业务需求,还为未来的扩展和变化预留了足够的空间。

2.1.后端API设计规范2.HTTP方法和HTTP状态码规范

在进行API设计时,我们需要规范地使用HTTP方法和HTTP状态码。HTTP方法(如GET、POST、PUT、DELETE等)应准确反映对资源的操作类型,而HTTP状态码则应清晰地传达请求的处理结果。这样的规范使用不仅能够提高API的易用性和一致性,还能帮助客户端更好地理解和处理响应。HTTP方法及HTTP状态码的具体内容分别如表所示。HTTP的常见方法方法场景接口示例说明GET获取数据获取单个数据:GET/api/tasks/1、获取数据列表:GET/api/tasksPOST创建数据创建单个数据:POST/api/tasksPATCH差量修改数据差量修改单个数据:PATCH/api/tasks/1PUT全量修改数据全量修改单个数据:PUT/api/tasks/1DELETE删除数据删除单个数据:DELETE/api/tasks/1

2.1.后端API设计规范2.HTTP方法和HTTP状态码规范HTTP的常见状态码状态码场景200创建成功,通常用在同步操作时202创建成功,通常用在异步操作时,表示请求已接受,但是还没有处理完成400参数错误,通常用在表单参数错误401授权错误,通常用在Token缺失或失效,注意401会触发前端跳转到登录页403操作被拒绝,通常发生在权限不足时,注意此时务必带上详细错误信息404没有找到对象,通常发生在使用错误的id查询详情500服务器错误

2.1.后端API设计规范3.接口请求及响应数据规范(1)数据传输格式规范

在前后端的数据传输过程中,我们推荐使用标准的JSON格式。这不仅能提高数据的可读性,还能减少反复的正反序列化操作,从而提升系统性能。以下是JSON格式数据的示例:{code:20000,status:200,message:"请求成功",data:{roles:[{id:1,name:'角色1'},{id:2,name:'角色2'}]}}需要注意的是,API设计规范中规定返回的是JSON格式数据而非JSON字符串。如果返回的是JSON字符串的话,需要额外进行字符串到JSON格式的转换工作。

2.1.后端API设计规范(2)请求及响应字段命名

在API设计中,我们推荐采用“aa_bb_cc”的命名方式,以规范请求和响应字段的命名。这种命名方式有助于提高代码的可读性和一致性,使开发人员能够更轻松地理解和维护API接口。以下是关于API设计的正确规范:3.接口请求及响应数据规范{role_ids:[11,12,35],}错误的API设计规范如下所示:{roleIds:[11,12,35],RoleIds:[11,12,35],ROLE_IDS:[11,12,35]}

2.1.后端API设计规范3.接口请求及响应数据规范(3)外层数据结构在API设计中,当需要返回单个数据时,我们通常采用以对象形式返回数据的方式。以下是一个具体案例:当查询某个任务时,API会返回该任务的相关信息,这些信息被封装在一个对象中。以下是该API设计的正确规范:{code:200,status:200,message:"请求成功",data:{id:1,name:'任务1'}}

2.1.后端API设计规范3.接口请求及响应数据规范当需要返回多个数据时,我们通常会选择以数组的形式来组织这些数据。以下是一个具体的应用场景:当查询某组任务时,API会返回一个包含多个任务相关信息的JSON数组。以下是该API设计的正确规范:{code:200,status:200,message:"请求成功",data:{items:[{id:1,name:'任务1'},{id:2,name:'任务2'}],total:2}}注意:在API设计中,当需要返回空数据集时,我们应使用空数组[]来表示,而非null。

2.1.后端API设计规范4.敏感数据规范

在API设计中,对于涉及用户隐私的敏感字段,我们应进行加密处理,以确保数据的安全性。以下是关于API设计的正确规范:{name:'小明',id_number:'U2FsdGVkX1+1fW7OpO/tlPXe4IGA/bXExlhKwIR/spk=',password:'U2FsdGVkX1/AnXKSBDbztNBfp4czlZxQ++3jRtNZhY0=',}错误的API设计规范如下所示:{name:'小明',id_number:,password:'ming@',}

2.1.后端API设计规范4.敏感数据规范

以上便是API开发中需遵循的一些常见规范。在未来的项目开发过程中,我们将以此为参照,进行API接口设计。然而,我们也不可一味生搬硬套,而是要根据项目的实际需求,灵活而审慎地运用这些设计规范,以确保项目开发的顺利进行和最终成果的高质量。

2.2.Flask的Jinja2模板引擎

在Web应用开发中,为了实现前后端的解耦并分离前后端逻辑,我们可以将页面逻辑独立出来,交由模板引擎进行渲染。鉴于“古典文学网”项目的前端开发采用Vue框架,对于Jinja2模板,我们在此仅简要介绍其基本的使用方法。

2.2.Flask的Jinja2模板引擎1.Jinja2模板渲染

Flask默认采用Jinja2作为其模板引擎,我们通常调用render_template()函数来准确地定位到指定的模板文件,并生成一个Response对象。这个对象包含了经过Jinja2渲染的HTML内容,可直接供前端进行展示。而模板文件是一个HTML文件,并存放在Flask应用的templates文件夹中,以便于管理和调用。

下面我们来看一个简单的模板渲染的案例,该案例显示一段“HelloWorld!”文字,请参考以下步骤完成。

首先,在磁盘中创建一个名为hi_jinja2的文件夹,并使用VSCode打开它。接下来,请按照以下的目录结构来构建项目目录架构。D:/Projects/hi_jinja2├──templates/│└──index.html├──static/└──app.py

2.2.Flask的Jinja2模板引擎1.Jinja2模板渲染随后,请打开/templates/index.html模板文件。此文件向客户展示“Hello

World!”的欢迎语,具体的代码实现如下所示:<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>Index</title></head><body>

<h1>HelloWorld!</h1></body></html>

2.2.Flask的Jinja2模板引擎1.Jinja2模板渲染接下来,在/app.py文件中,定义视图处理函数index(),并使用render_template()函数来渲染模板。这个函数会查找templates文件夹中的模板文件,并返回一个包含渲染后的HTML的响应对象。这一过程的代码实现如下:fromflaskimportFlaskfromflaskimportrender_templateapp=Flask(__name__)@app.route('/')defindex():

returnrender_template("index.html")if__name__=='__main__':app.run()

2.2.Flask的Jinja2模板引擎1.Jinja2模板渲染项目启动后,在浏览器中输入“:5000”进行访问,运行效果如图所示。

2.2.Flask的Jinja2模板引擎2.Jinja2模板的参数传递

在使用Jinja2模板引擎时,我们经常需要向模板传递参数。这些参数可以是变量、列表、字典或任何其他Python数据类型。传递参数的主要目的是在模板中动态地展示数据,或者根据传递的参数来控制模板的行为。

下面这个案例展示了如何传递更复杂的数据结构(如:列表或字典)到模板中,并显示传递的参数(请在前一小节的hi_jinja2项目中完成),具体操作参考如下步骤。

2.2.Flask的Jinja2模板引擎2.Jinja2模板的参数传递首先,在/app.py源文件中,找到index()视图函数。在这个函数中,传递users列表给模板文件。以下是具体的代码实现:fromflaskimportFlaskfromflaskimportrender_templateapp=Flask(__name__)@app.route('/')defindex():

users=[{'name':'Alice','age':25},{'name':'Bob','age':30},{'name':'Charlie','age':35}]returnrender_template('index.html',users=users)if__name__=='__main__':app.run()

2.2.Flask的Jinja2模板引擎2.Jinja2模板的参数传递接下来,在/templates/index.html模板文件中,接收并显示传递的users列表。以下是具体的代码实现:<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>Welcome</title></head><body><ul>

{%foruserinusers%}<li>{{}}-{{user.age}}</li>{%endfor%}</ul></body></html>

2.2.Flask的Jinja2模板引擎2.Jinja2模板的参数传递项目启动后,在浏览器中输入“:5000”进行访问,运行效果如图所示。

2.2.Flask的Jinja2模板引擎3.Jinja2模板语法下面是一些Jinja2模板语法的基本元素和常见用法,详细的模板语法请参考Jinja2官方文档。(1)变量在上面的模板中,我们可能注意到了一些不同于HTML原生语法的特殊结构:{{var}}。这正是Jinja2模板引擎的语法特性,我们使用双大括号{{}}来包裹变量,以便在渲染时输出其值。以下是一个示例代码片段,它用于在模板中输出name变量的值。<p>Hello,{{name}}!</p>

2.2.Flask的Jinja2模板引擎3.Jinja2模板语法(2)条件语句

如果我们经常需要根据某些条件来执行不同的代码块,那么可以使用if、elif和else语句来进行条件判断。这些语句允许我们根据条件的真假来选择执行相应的代码块,从而实现更加灵活和精确的逻辑控制。以下示例代码片段,展示了判断用户是否登录,并输出提示信息。{%ifuser.is_logged_in%}<p>Welcome,{{}}!</p>{%else%}<p>Pleaselogin.</p>{%endif%}

2.2.Flask的Jinja2模板引擎3.Jinja2模板语法(3)循环

我们可以使用for循环来遍历列表或字典,从而实现对集合中每个元素的迭代处理。这种循环结构在模板渲染过程中非常有用,可以方便地展示集合中的数据,并根据需要进行格式化或操作。以下示例展示了在模板中循环输出items集合中的数据。{%foriteminitems%}<li>{{item}}</li>{%endfor%}</ul>

2.3.Flask的数据库操作

接下来,我们将详细介绍“古典文学网”项目的数据库结构,并演示如何对用户表进行常见的数据库操作,包括增加、删除、修改和查询等操作。

2.3.Flask的数据库操作1.创建项目数据库(1)“古典文学网”数据库首先,我们来介绍一下“古典文学网”项目的数据库结构,该数据库将在后续的开发中持续被使用。项目的数据库名为classicsdb,其中包含6个表,具体的数据库表说明参见课本表3.3~3.9。古典文学网”项目数据库信息表数据库名:classicsdb说明:编码方式为UTF-8序号数据库表备注1users用户表2classictype文学类型表3classics文学表4discuss文学评论表5classicjudges文学评价表6discusjudges评论评价表说明:具体表结构参考课本

2.3.Flask的数据库操作1.创建项目数据库(2)创建“古典文学网”数据库

在了解“古典文学网”项目的数据库结构之后,我们选用MySQLWorkbench数据库管理工具,来创建classicsdb数据库。关于MySQLWorkbench工具的具体使用方法,可参考本项目的“3.4.1.使用MySQLWorkbench管理数据库”部分。

我们需要使用MySQLWorkbench成功连接至MySQL数据库服务,随后打开了本项目素材中提供的classicsdb.sql数据库脚本。通过执行该脚本,我们顺利创建了名为classicsdb的数据库。创建完成的数据库见图所示。

2.3.Flask的数据库操作2.连接数据库

为了开发“古典文学”项目的数据库操作模块,请确保我们已经正确安装了Flask-SQLAlchemy和PyMySQL扩展库。我们还需要配置数据库连接的URI,该URI包含了连接数据库所需的所有关键信息,诸如用户名、密码、主机名、数据库名,以及一系列用于额外配置的可选关键字参数等。连接MySQL数据库的URI的具体格式如下所示:mysql+pymysql://username:password@host:port/database?charset=utf8上述URI格式中的各个组成部分具有特定的含义,具体如下:lusername:MySQL数据库用户名;lpassword:与用户名对应的密码;lhost:MySQL服务器的主机名或IP地址;lport:MySQL服务器监听的端口号;ldatabase:连接的数据库的名称;lcharset=utf8:这是一个连接参数,用于指定字符集为utf8。

2.3.Flask的数据库操作2.连接数据库接下来,我们将开发一个案例,旨在连接“古典文学网”的classicsdb数据库。以下是具体的代码实现:fromflaskimportFlaskfromflask_sqlalchemyimportSQLAlchemyapp=Flask(__name__)#载入数据库配置#MySql连接的URIapp.config['SQLALCHEMY_DATABASE_URI']='mysql+pymysql://root:123456@:3306/classicsdb?charset=utf8'#记录所有发送到标准输出的SQL语句,通常在开发调试时很有帮助。app.config['SQLALCHEMY_ECHO']=True

#创建数据库的操作对象db=SQLAlchemy(app)if__name__=="__main__":app.run()在上述代码中,我们首先对SQLALCHEMY_DATABASE_URI和SQLALCHEMY_ECHO进行了配置,以便指定数据库的连接信息和是否开启SQLAlchemy的日志输出。随后,通过调用SQLAlchemy(app)语句,我们成功创建了数据库操作对象db。

2.3.Flask的数据库操作3.构建模型类

在使用Flask-SQLAlchemy进行数据库操作时,我们必须定义与数据库相对应的模型类。这些模型类均继承自db.Model,用于描述数据库表的结构和字段。通常情况下,这些模型类会被保存在models.py文件中,以便于管理和维护。通过定义这些模型类,我们可以方便地实现与数据库的交互,包括数据的增删改查等操作。

2.3.Flask的数据库操作3.构建模型类接下来,我们将定义与“古典文学网”数据库中users表相对应的模型类。以下是具体的代码实现:classUsers(db.Model):

__tablename__='users'__table_args__={'comment':'用户表'}uid:Mapped[int]=mapped_column(Integer,primary_key=True,comment='用户编号')uname:Mapped[str]=mapped_column(VARCHAR(100),comment='登录账号')upwd:Mapped[str]=mapped_column(VARCHAR(100),comment='登录密码')nikename:Mapped[Optional[str]]=mapped_column(VARCHAR(100),comment='昵称')avatar:Mapped[Optional[str]]=mapped_column(VARCHAR(200),comment='头像')sex:Mapped[Optional[str]]=mapped_column(VARCHAR(50),comment='性别')phone:Mapped[Optional[str]]=mapped_column(VARCHAR(50),comment='电话')remark:Mapped[Optional[str]]=mapped_column(VARCHAR(200),comment='备注')

2.3.Flask的数据库操作3.构建模型类在上述代码中,我们定义了一个名为Users的类,它借助__tablename__属性与数据库中的users表建立了关联。同时,我们定义了uid、uname等属性,它们与users表中的相应字段一一对应。通过Users类,我们可以轻松地对users数据库表执行增删改查等操作。在项目开发中,我们会使用flask-marshmallow和marshmallow-sqlalchemy扩展,它们主要用于将复杂的数据类型(如SQLAlchemy模型)转换为JSON格式,以及从JSON转换回Python对象。在开始构建模型类之前,请确保我们已经正确安装了flask-marshmallow和marshmallow-sqlalchemy扩展库。在使用flask-marshmallow扩展库时,我们首先需要执行以下代码来进行初始化操作。#初始化Marshmallowma=Marshmallow(app)

2.3.Flask的数据库操作3.构建模型类接下来,我们将定义与Users模型类相对应的Schema类。这个Schema类的主要作用是将Users模型类的数据转换为JSON格式,以便在前后端交互中更便捷地处理数据。以下是Users转化类具体的代码实现,它展示了如何构建这样一个转换类。#使用flask-marshmallow自动生成schema

classUsersSchema(ma.Schema):

classMeta:

model=Users

#序列化的字段

fields=("uid","uname","upwd","nikename","avatar","sex","phone","remark")在上述代码中,我们定义了一个名为UsersSchema的转换类。通过model字段,我们将其与Users模型类进行了关联,从而确保它能够准确地转换Users模型类的数据。同时,利用fields字段,我们明确指定了需要序列化的Users模型类的属性,以便在转换过程中只包含所需的信息。

2.3.Flask的数据库操作4.数据库操作

接下来,我们将以Users模型类为例,详细介绍如何使用Flask-SQLAlchemy扩展库的API进行数据库操作。(1)增加数据

在Flask-SQLAlchemy扩展库中,增加数据主要是通过创建模型类的实例,并将其添加到数据库会话中,最后提交会话来完成的。会话(session)提供了增加数据的add()和add_all()方法,其中add()方法用于向数据库中增加一条记录,add_all()方法用于向数据库中增加多条记录。

2.3.Flask的数据库操作4.数据库操作

接下来,我们将以上一节中定义的Users模型类为例,开发一个增加用户的API接口,演示如何向数据库中增加用户数据。以下是部分的实现代码(具体代码参考课本):fromflaskimportFlask,jsonify…………app=Flask(__name__)#载入数据库配置#MySql连接的URIapp.config['SQLALCHEMY_DATABASE_URI']='mysql+pymysql://root:123456@:3306/classicsdb?charset=utf8'#

记录所有发送到标准输出的SQL语句,通常在开发调试时很有帮助。app.config['SQLALCHEMY_ECHO']=True

2.3.Flask的数据库操作4.数据库操作

接上页代码#创建数据库的操作对象db=SQLAlchemy(app)#初始化Marshmallowma=Marshmallow(app)#1.增加用户数据@app.route('/add')defadd_user():

#新建用户对象user1=Users(uname='xiaoming',upwd='123456',nikename='小明',avatar='xm.jpg',……

2.3.Flask的数据库操作4.数据库操作在上述代码中,我们在add_user()视图函数中,通过add()和add_all()方法,成功地向数据库中添加了三条用户数据。项目启动后,可以通过“:5000/add”进行访问,在数据库的users数据表可以看到增加的用户数据,如图所示。

2.3.Flask的数据库操作4.数据库操作

(2)查询数据Flask-SQLAlchemy扩展库提供了query属性,这个属性是一个功能强大的查询构造器。当我们访问这个属性时,会得到一个新的查询对象,该对象提供了丰富的过滤器和查询方法,使我们能够对查询结果进行精确的过滤和筛选。查询数据的语法格式如下所示:模型类.query.<过滤器>.<查询方法>

2.3.Flask的数据库操作4.数据库操作

(2)查询数据在上述格式中,过滤器和查询方法是可选的,使用过滤器会返回一个新的查询对象,过滤和查询方法可以叠加使用,也可单独使用。查询对象的过滤器和查询方法分别见表

常用的SQLAlchemy查询过滤器过滤器说明filter把过滤器添加到原查询上,返回一个新查询filter_by把等值过滤器添加到原查询上,返回一个新查询limit使用指定的值限定原查询返回的结果offset偏移原查询返回的结果,返回一个新查询order_by根据指定条件对原查询结果进行排序,返回一个新查询group_by根据指定条件对原查询结果进行分组,返回一个新查询

2.3.Flask的数据库操作4.数据库操作

(2)查询数据在上述格式中,过滤器和查询方法是可选的,使用过滤器会返回一个新的查询对象,过滤和查询方法可以叠加使用,也可单独使用。查询对象的过滤器和查询方法分别见表

常用的SQLAlchemy查询方法方法说明all()以列表形式返回查询的所有结果first()返回查询的第一个结果,如果未查到,返回Nonefirst_or_404()返回查询的第一个结果,如果未查到,返回404get()返回指定主键对应的行,如不存在,返回Noneget_or_404()返回指定主键对应的行,如不存在,返回404count()返回查询结果的数量paginate()返回一个Paginate对象,它包含指定范围内的结果

2.3.Flask的数据库操作4.数据库操作接下来,我们将展示一些针对users表的常用查询案例,演示如何进行数据的查询操作。常见的查询操作的部分代码如下所示(具体代码参考课本):#简单查询users=Users.query.all()#查询所有用户数据count=Users.query.count()#查询有多少个用户user=Users.query.first()#查询第1个用户

#根据uid查询

返回模型对象/Noneuser=Users.query.get(5)users=Users.query.filter_by(uid=5).all()user=Users.query.filter(Users.uid==5).first()

#查询昵称以某个字符开始/结尾/包含的所有用户users=Users.query.filter(Users.nikename.endswith("g")).all()users=Users.query.filter(Users.nikename.startswith("w")).all()

…………

2.3.Flask的数据库操作4.数据库操作接下来,我们将展示一些针对users表的常用查询案例,演示如何进行数据的查询操作。常见的查询操作的部分代码如下所示(具体代码参考课本):#简单查询users=Users.query.all()#查询所有用户数据count=Users.query.count()#查询有多少个用户user=Users.query.first()#查询第1个用户

#根据uid查询

返回模型对象/Noneuser=Users.query.get(5)users=Users.query.filter_by(uid=5).all()user=Users.query.filter(Users.uid==5).first()

#查询昵称以某个字符开始/结尾/包含的所有用户users=Users.query.filter(Users.nikename.endswith("g")).all()users=Users.query.filter(Users.nikename.startswith("w")).all()

…………

2.3.Flask的数据库操作4.数据库操作项目启动后,可以通过“:5000/seach”进行访问,测试结果如图3.5所示。

2.3.Flask的数据库操作4.数据库操作(3)更新数据更新数据的过程相对直观且简便。我们只需为模型类的相关字段重新赋值,即可实现对原有字段值的修改。完成修改后,为确保更改生效,需要调用commit()方法,将数据变更提交至数据库中进行保存。接下来,我们开发一个修改用户的API接口(基于上一小节的案例中完成),修改用户编号(uid字段)为2的用户的昵称(nikename字段),具体代码如下所示:#3.更新用户数据@app.route('/update')defupdate_user():#返回主键为2的对应用户user=Users.query.get(2)#修改用户昵称user.nikename='李白'

#提交会话以保存更改

mit()

returnjsonify({"code":200,"msg":"操作成功"})

2.3.Flask的数据库操作4.数据库操作在上述代码中,我们首先查询了编号为2的用户,然后将其昵称修改为“李白”,并通过提交到数据库的方式完成了用户数据的更新操作。项目启动后,可以通过“:5000/update”进行访问,在数据库的users数据表可以看到修改后的用户数据,如图所示。

2.3.Flask的数据库操作4.数据库操作(4)删除数据当我们需要从数据库表中删除一个或多个不再需要的记录时,只需简单地调用delete()方法,即可轻松实现数据的删除操作。接下来,我们开发一个删除用户信息的API接口(基于上一小节的案例中完成),删除用户编号(uid字段)为9的用户,具体代码如下所示:#4.删除用户数据@app.route('/delete')defdelete_user():#返回主键为9的对应用户user=Users.query.get(9)#删除用户数据db.session.delete(user)#提交会话以保存更改mit()returnjsonify({"code":200,"msg":"操作成功"})

2.3.Flask的数据库操作4.数据库操作在上述代码中,我们首先查询了编号为9的用户,然后使用delete()方法将其删除,最后提交到数据库,完成了用户数据的删除操作。项目启动后,可以通过“:5000/delete”进行访问,在数据库的users数据表可以看到编号为9的用户被删除了,如图所示。03项目任务

3.项目任务

在这一阶段,小白将开发“古典文学网”项目的数据操作模块,并完成首页模块文学导航API接口、文学推荐API接口、文学搜索API接口、轮播图API接口的开发工作及进一步完善用户注册与登录的API接口功能。

3.1.开发项目的数据操作模块1.需求描述

在本次任务中,我们将为“古典文学网”的后端项目开发数据库操作模块。首先,我们需要在“古典文学网”后端项目中进行数据库配置工作,确保数据库的稳定运行与高效性能。随后,我们将开发后端项目的数据操作模块,使项目能够正常、顺畅地访问数据库。

3.1.开发项目的数据操作模块2.业务功能实现(1)配置数据库连接

在后端“cls_svr”项目的app/conf/目录下,我们需要创建一个名为dbconfig.py的数据库配置文件。在该文件中,我们将配置数据库的连接信息。请确保项目数据库classicsdb已经正确创建(参照3.2.3.小节中创建数据库的操作)。以下是dbconfig.py配置文件的代码实现:#------MySQL数据库配置------#MySql连接的URISQLALCHEMY_DATABASE_URI='mysql+pymysql://root:123456@:3306/classicsdb?charset=utf8'#记录所有发送到标准输出的SQL语句,通常在开发调试时很有帮助。SQLALCHEMY_ECHO=True

上述代码中,我们配置了项目的数据库访问信息,其中classicsdb为古典文学网的数据库名称。

3.1.开发项目的数据操作模块2.业务功能实现(1)配置数据库连接

在后端“cls_svr”项目的app/conf/目录下,我们需要创建一个名为dbconfig.py的数据库配置文件。在该文件中,我们将配置数据库的连接信息。请确保项目数据库classicsdb已经正确创建(参照3.2.3.小节中创建数据库的操作)。以下是dbconfig.py配置文件的代码实现:#------MySQL数据库配置------#MySql连接的URISQLALCHEMY_DATABASE_URI='mysql+pymysql://root:123456@:3306/classicsdb?charset=utf8'#记录所有发送到标准输出的SQL语句,通常在开发调试时很有帮助。SQLALCHEMY_ECHO=True

上述代码中,我们配置了项目的数据库访问信息,其中classicsdb为古典文学网的数据库名称。

3.1.开发项目的数据操作模块(2)开发项目数据操作框架

接下来,我们需要在项目中加载数据库配置信息,并构建完整的数据库操作框架。首先,我们需要定位到项目中的app/__init__.py文件。在此文件中,我们将加载数据库配置并创建数据库操作对象,以便后续能够顺利执行数据库操作。以下是关键代码的具体实现:......fromapp.conf.dbconfigimportSQLALCHEMY_DATABASE_URIfromapp.conf.dbconfigimportSQLALCHEMY_ECHOfromflask_sqlalchemyimportSQLAlchemyfromflask_marshmallowimportMarshmallow......db=SQLAlchemy()#创建数据库的操作对象ma=Marshmallow()#初始化Marshmallow

2.业务功能实现

3.1.开发项目的数据操作模块接上页代码defcreate_app():

......

#载入数据库配置

app.config['SQLALCHEMY_DATABASE_URI']=SQLALCHEMY_DATABASE_URIapp.config['SQLALCHEMY_ECHO']=SQLALCHEMY_ECHO

#数据库操作对象绑定app

db.init_app(app)

ma.init_app(app)

......

returnapp

2.业务功能实现在上述代码中,我们导入dbconfig.py中的数据库配置信息,并将配置参数加载到Flask实例中。随后,我们创建了数据库操作对象db和模型类转换对象ma,并调用init_app(app)方法完成了初始化操作。

3.1.开发项目的数据操作模块(3)构建项目模型类

我们接下来需要为“古典文学网”项目创建数据库模型类。我们需要找到本项目素材中的数据库模型文件models.py,将models.py复制到“cls_svr”项目的app/model/目录下,以便项目能够正确识别并使用这些模型类。以下是models.py代码片段。2.业务功能实现fromtypingimportList,Optional…………#导入数据库操作对象fromappimportdbfromappimportmaclassClassictype(db.Model):__tablename__='classictype'

__table_args__={'comment':'古典文学类型表'}tid:Mapped[int]=mapped_column(Integer,primary_key=True)…………对应上述模型类,建议直接使用本项目素材提供的数据库模型类文件models.py

3.2.完善用户注册API接口

在前面的开发中,我们已经成功开发了用户的注册API接口。然而,该接口目前尚未包含数据库操作模块。接下来,我们将为该接口加入数据库操作功能。

3.2.完善用户注册API接口1.需求描述

请在后端“cls_svr”项目的基础上,扩展用户注册API接口的功能,为其加入了数据库操作模块,该模块的主要作用是将用户的注册数据插入到用户表(users)中。通过这一改进,我们成功完成了整个用户注册API接口功能的开发,为用户提供了更加便捷、高效的注册体验。

3.2.完善用户注册API接口2.业务功能实现接下来,我们将着手完善用户注册API接口。以下是具体的开发步骤。(1)开发数据操作模块在“cls_svr”项目的app/dao/目录下创建用户数据库操作模块文件UsersDao.py,并开发增加用户的功能,具体代码如下所示:fromappimportdbfromapp.model.modelsimportUsers#数据库操作类classUsersDao:def__init__(self):print("UsersDaoisruning")

3.2.完善用户注册API接口2.业务功能实现接上页代码:#1.增加一个用户defaddUser(self,user):flag=True#成功标志,True操作成功,False操作失败try:db.session.add(user)mit()#提交至数据库exceptExceptionase:flag=Falsedb.session.rollback()#异常,回滚数据库passreturnflag在上述代码中,我们创建了一个名为UsersDao的数据库操作类。在UsersDao类中,我们定义了一个addUser(self,user)函数,该函数接收一个user参数,即用户对象,用于将新用户信息添加到数据库表(users)中。该方法执行后会返回一个名为flag的变量,当flag的值为True时,表示用户添加操作已成功完成;若flag的值为False,则意味着添加操作未能成功执行。

3.2.完善用户注册API接口2.业务功能实现(2)完善用户注册逻辑

在“cls_svr”项目的app/api/user_blueprint.py文件中,我们需要找到用户注册的视图函数register()。在该函数内部,我们需要增加数据库操作逻辑代码,以便在用户注册时能够将相关信息正确存储到数据库中。以下是关键代码实现:......#引入数据库操作对象fromapp.dao.UsersDaoimportUsersDaofromapp.model.modelsimportUsers#用户注册接口@user_blueprint.route('/register',methods=["POST"])defregister():

......#注册用户,创建数据库操作对象

db_op=UsersDao()

3.2.完善用户注册API接口2.业务功能实现接上页代码:#新建用户对象

user=Users(uname=uname,upwd=upwd,nikename=nikename,avatar=avatar,sex=sex,phone=phone)

flag=db_op.addUser(user) #增加用户

ifflag:

result_msg["code"]="200"

result_msg["msg"]="操作成功!"

else:

result_msg["code"]="404"

result_msg["msg"]="操作失败!"

#返回操作结果

returnjsonify(result_msg)......在上述代码中,我们成功导入了用户的数据库操作类UsersDao,并借助其提供的addUser()函数,将用户信息添加至用户表(users)中,从而实现了用户的注册功能。

3.2.完善用户注册API接口2.业务功能实现(3)用户注册API接口测试项目启动后,可以通过“:5000/api/user/register”进行访问,测试结果如图所示。

3.3.完善用户登录API接口

在前面的开发中,我们已经成功开发了用户的登录API接口。然而,该接口目前尚未包含数据库操作模块。接下来,我们将为该接口加入数据库操作功能。

3.3.完善用户登录API接口1.需求描述

请在后端“cls_svr”项目的基础上,扩展用户登录API接口的功能,为其加入了数据库操作模块。该模块的主要作用是查询登录用户是否在用户表(users)中。通过这一改进,我们成功完成了用户登录API接口功能的开发,为用户提供了更加便捷、高效的登录体验。

3.3.完善用户登录API接口2.业务功能实现接下来,我们将着手完善用户登录API接口。以下是具体的开发步骤。(1)开发数据操作模块

在“cls_svr”项目中,找到“app/dao/UsersDao.py”文件,在该文件中,开发用户登录查询的功能,具体关键代码如下所示:

3.3.完善用户登录API接口2.业务功能实现......#2.通过账号及密码查询用户defgetUserByLogin(self,uname,upwd):try:#查询user=Users.query.filter(Users.uname==uname,Users.upwd==upwd).first()returnuserexceptExceptionase:print(e)pass......在上述代码中,我们定义了一个名为getUserByLogin(self,uname,upwd)的函数,它接受两个参数:uname和upwd,分别代表用户的账号和密码。随后,该函数会利用这些账号和密码信息在用户数据库表(users)中进行查询,以验证用户是否存在。

3.3.完善用户登录API接口2.业务功能实现(2)开发用户登录逻辑

在“cls_svr”项目的app/api/user_blueprint.py文件中,我们找到用户登录的视图函数login()。在该函数内部,我们需要增加数据库操作逻辑代码,以便验证用户是否存在。以下是关键代码实现:......#用户登录接口@user_blueprint.route('/login',methods=["POST"])deflogin():

#返回信息

result_msg={"code":"200","msg":"操作成功!"}......#进行登录,创建数据库操作对象

db_op=UsersTypeDao()

#进行登录操作

user=db_op.getUserByLogin(uname,upwd)#判断是否登录成功

ifuserisnotNone:

......在上述代码中,我们在登录视图函数login()中调用getUserByLogin()函数,该函数根据账号和密码信息进行验证,并把验证结果返回给客户端,从而完成了整个登录流程。

3.3.完善用户登录API接口2.业务功能实现(3)用户登录API接口测试项目启动后,可以通过“:5000/api/user/login”进行访问,测试结果如图所示。

3.4.开发文学导航API接口接下来,我们着手开发“首页”文学导航API接口。

3.4.开发文学导航API接口1.需求描述“首页”文学导航API接口的主要功能是初始化首页的导航栏。在接口被调用时,它会从数据库中查询出所有的文学类型,并将这些信息以导航栏的形式在首页上呈现给用户。这一过程中,接口需要访问数据库中的文学类型表(classictype),并将查询到的文学类型信息返回给客户端,以便客户端能够正确地展示这些导航项。该API接口的详细说明,请参见课本表3.12。

3.4.开发文学导航API接口2.业务功能实现

接下来,我们将着手开发“首页”文学导航API接口。以下是具体的开发步骤。

3.4.开发文学导航API接口2.业务功能实现(1)开发数据操作模块在“cls_svr”项目的app/dao/目录下创建文学数据库操作模块ClassicsDao.py,并开发查询文学类型的功能,具体代码如下所示:fromappimportdbfromapp.model.modelsimportClassictype,Classics#数据库操作类classClassicsDao:def__init__(self):print("ClassicsDaoisruning")#1.获取文学类型列表defgetClassictypes(self):try:#获取所有文学类型

classictypes=Classictype.query.all()returnclassictypesexceptExceptionase:print(e)pass在上述代码中,创建了一个名为ClassicsDao的数据库操作类,该类负责处理与数据库相关的文学操作。在ClassicsDao类中,我们定义了一个getClassictypes()函数,该函数用于查询文学类型表(classictype)的数据,并以列表的形式返回。

3.4.开发文学导航API接口2.业务功能实现(2)创建文学蓝图在“cls_svr”项目的app/api/目录下创建文学蓝图classics_blueprint.py,用以获取文学类型数据,具体代码如下所示:fromflaskimportBlueprint,requestfromflaskimportjsonify#引入数据库操作对象fromapp.dao.ClassicsDaoimportClassicsDaofromapp.model.modelsimportClassictype,ClassictypeSchema#创建蓝图classics_blueprint=Blueprint("classics_blueprint",__name__) #获取所有文学类型@classics_blueprint.route('/get-classictypes')defget_classictypes():

#返回信息

result_msg={"code":"200","msg":"操作成功!"}

…………

导入了文学数据库操作类ClassicsDao,并利用其提供的getClassictypes()函数来查询数据库中所有的文学类型。

3.4.开发文学导航API接口2.业务功能实现(3)注册文学蓝图打开“cls_svr”项目的/app/app.py文件。在该文件中,我们进行文学蓝图的注册操作。以下是实现这一功能的关键代码:......fromapp.api.classics_blueprintimportclassics_blueprint#注册蓝图app.register_blueprint(classics_blueprint,url_prefix="/api/classics")

......在上述代码中,我们导入了文学蓝图classics__blueprint,通过register_blueprint()注册文学蓝图,蓝图的url_prefix="/api/classics",作为蓝图的URL规则。

3.4.开发文学导航API接口2.业务功能实现(4)“首页”文学导航API接口测试项目启动后,可以通过“:5000//api/classics/get-classictypes”进行访问,测试结果如图所示。

3.5.开发文学推荐API接口接下来,我们着手开发“首页”文学推荐API接口。

3.5.开发文学推荐API接口1.需求描述

“首页”文学推荐API接口主要用于初始化并呈现首页的内容。它会从数据库中查询出各类文学类型中星级评价最高的文学作品列表。随后,它会将这些查询出的文学信息列表返回给客户端。在这一过程中,接口需要对数据库中的文学类型表(classictype)和文学表(classics),进行高效且精准的数据查询。该API接口的详细说明,请参见课本表3.13。

3.5.开发文学推荐API接口2.业务功能实现接下来,我们将着手开发“首页”文学推荐API接口。以下是具体的开发步骤。(1)开发数据操作模块在“cls_svr”项目中,找到app/dao/ClassicsDao.py文件,在该文件中,开发文学查询的功能,具体关键代码如下所示:......fromapp.model.modelsimportClassics,ClassicsSchema#2.获取文学列表(首页推荐使用)defgetClassicsByIndex(self,tid,num):try:#排序查询:所有文学按星级评价从高到低排序,取前num个classics=Classics.query.filter(Classics.tid==tid)......在上述代码中,我们定义了一个名为getClassicsByIndex的函数,该函数接收两个参数:tid和num,分别代表文学类型编号和推荐的文学数量。该函数会根据提供的tid参数,在文学表(classics)中查询相应类型的数据,查询结果会按照星级进行降序排列,以确保用户最先看到的是评价最高的文学作品。之后,函数会选取排列后的前num条记录,并以列表的形式返回。

3.5.开发文学推荐API接口2.业务功能实现(2)开发文学推荐逻辑在“cls_svr”项目中,找到位于app/api/classics_blueprint.py的文学蓝图文件,并开发文学推荐API接口。以下是关键代码实现:......fromapp.model.modelsimportClassics,ClassicsSchema#按文学类型,获取推荐文学列表(首页)@classics_blueprint.route('/recommend-classics/<int:num>')defrecommend_classics(num):#返回信息result_msg={"code":"200","msg":"操作成功!"}#判断请求及参数是否正确............在上述代码中,我们利用getClassictypes()函数查询出所有的文学类型;接着,通过循环遍历文学类型列表,获取文学类型的编号tid,然后以tid为参数调用getClassicsByIndex()函数查询对应的文学列表,将其加入rd_list列表中。最后我们将rd_list列表以JSON格式返回给客户端。

3.5.开发文学推荐API接口2.业务功能实现(3)“首页”文学推荐API接口测试项目启动后,可以通过“:5000/api/classics/recommend-classics/6”进行访问,测试结果如图所示。

3.6.开发文学搜索API接口接下来,我们着手开发“首页”文学搜索API接口。

3.6.开发文学搜索API接口1.需求描述

“首页”文学搜索API接口的主要功能是为用户提供一个搜索功能。当该接口被调用时,它会根据用户输入的关键字,在数据库中查询与之匹配的文学作品。在此过程中,接口将访问文学表(classics),并将查询到的文学信息返回给客户端。该API接口的详细说明,请参见课本表3.14。

3.6.开发文学搜索API接口2.业务功能实现接下来,我们将着手开发“首页”文学搜索API接口。以下是具体的开发步骤。

3.6.开发文学搜索API接口(1)开发数据操作模块

在“cls_svr”项目中,找到app/dao/ClassicsDao.py文件,在该文件中,开发文学搜索的功能,具体关键代码如下所示:2.业务功能实现......#3.搜索文学列表(按文学标题搜索)defseachClassicsByKeyword(self,keyword):try:#按文学标题进行模糊查询

classics=Classics.query.filter(Classics.title.contains(keyword)).all()returnclassicsexceptExceptionase:print(e)pass......

3.6.开发文学搜索API接口

在上述代码中,我们定义了一个名为searchClassicsByKeyword(self,keyword)的函数,该函数会根据查询关键字对文学作品的搜索。函数将接收一个keyword参数,即查询关键字,函数会在文学表(classics)中查找标题包含该关键字的文学作品。2.业务功能实现

3.6.开发文学搜索API接口(2)开发文学搜索逻辑在“cls_svr”项目中,找到位于app/api/classics_blueprint.py的文学蓝图文件。在此文学蓝图中,我们将定义文学搜索API接口,用以查询文学数据。以下是关键代码实现:2.业务功能实现......#按关键字,搜索文学列表(搜索)@classics_blueprint.route('/seach-classics',methods=["POST"])defseach_classics():result_msg={"code":"200","msg":"操作成功!"} #返回信息#获取Json格式的请求,并解析JSONrequest_body=request.get_json()#判断传入的Json数据是否为空ifrequest.get_json()isNone:result_msg["code"]="404"result_msg["msg"]="参数错误"returnjsonify(result_msg)

3.6.开发文学搜索API接口接上页代码2.业务功能实现#获取参数keyword=request_body.get("keyword")#进行搜索操作,创建数据库操作对象db_op=ClassicsDao()#查询文学列表classics=db_op.seachClassicsByKeyword(keyword)#many=True转换多条数据classics_Schema=ClassicsSchema(many=True)classics_data=classics_Schema.dump(classics)#将转换后的JSON格式数据存储至返回结果result_msg["data"]=classics_data#返回操作结果returnjsonify(result_msg)......

3.6.开发文学搜索API接口

在上述代码中,我们定义了search_classics()视图函数。在该函数中,我们调用searc

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论