




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
项目2:“古典文学网”后端框架解析与开发
目录01.06.拓展任务02.知识储备04.技能拓展项目描述03.项目任务05.项目总结
学习目标知识目标:了解Flask项目结构及特点,掌握Flask项目的整体框架结构;熟悉Flask的请求和响应,掌握如何处理请求并返回响应;熟悉Flask的路由和蓝图,掌握项目模块化开发的理念及应用。能力目标:通过学习Flask项目结构,能够开发“古典文学网”的后端项目框架;通过学习Flask的请求和响应,能够开发“注册”“登录”API接口;通过学习Flask的路由和蓝图,能够模块化管理项目中的程序路由。素质目标:培养软件工程师的系统思维,严格遵守行业规范和标准,提高软件质量和可靠性;培养软件工程师的责任感、职业精神和团队精神,遵守职业道德。01项目描述
1.项目描述
小白已经搭建了“古典文学网”项目的开发环境,接下来他计划对Flask框架技术进行深入研究,以设计出后端项目的整体架构,并基于这一框架,顺利完成项目的“注册”“登录”API接口的开发,为项目的顺利推进奠定坚实基础。02知识储备
2.知识储备
为了项目的顺利开发,小白需要系统地学习Flask框架的项目布局,掌握Flask框架的核心技术,包括路由和蓝图等关键组件,为后续的编码工作做好了充分的准备。
2.1.Flask程序框架解析1.Flask项目框架
Flask作为一款高度灵活且轻量级的Web框架,其项目结构并不拘泥于固定的模式,而是赋予了开发者充分的自由,允许他们根据自己的喜好进行设计。以下展示的是一个典型的Flask项目框架布局,然而在实际应用中,项目的具体结构可能会因项目的独特需求以及团队的个性化偏好而有所差异。D:/Projects/hi_svr├──app/│├──__init__.py│├──models.py│├──config.py│├──view.py│├──api/│├──templates/│└──static/├──tests/├──.venv/└──app.py
2.1.Flask程序框架解析1.Flask项目框架项目布局中的一些关键目录及文件,具体如表所示。目录/文件说明app/一个包含应用代码和文件的Python包app/api/一个存放后端Api接口的Python包,包括路由定义、数据处理等app/templates/用于存放HTML模板的文件夹。这些模板用于渲染视图app/static/用于存放静态文件的文件夹,如CSS、JavaScript、图片等app/models.py一个用于定义数据库模型的源文件app/views.py一个用于定义视图函数的源文件,处理请求并返回响应app/__init.py__一个用于初始化Flask应用的源文件,并导入其他模块tests/一个包含测试模块的文件夹venv/Python虚拟环境,用于安装Flask和其他依赖的包app.py一个项目程序入口源文件,用于启动项目
2.1.Flask程序框架解析2.Flask应用设置创建Flask应用时,最简单的方法是开始时就初始化一个全局的Flask实例。但项目变大变复杂后,这方法可能不够用。所以,我们可以在函数里创建Flask实例,这样的函数叫“应用工厂”。在应用工厂里,我们完成应用的配置、注册等设置,然后返回实例。这样做让代码更易维护、灵活,项目结构也更清晰和模块化。
2.1.Flask程序框架解析(1)创建应用工厂在app/__init__.py源文件中,我们定义了应用工厂函数,其代码实现如下:fromflaskimportFlaskdefcreate_app():#构建appapp=Flask(__name__)returnapp在上述代码中,我们定义了一个应用工厂函数create_app(),在后续的项目开发中,它能够执行一系列关键操作,如创建Flask实例、加载配置文件以及注册蓝图等。2.Flask应用设置
2.1.Flask程序框架解析(2)运行应用接下来,在app.py文件中,可通过create_app()函数来创建Flask实例。参考代码实现如下:#引入应用工厂函数fromappimportcreate_app#调用工厂,创建appapp=create_app()#一个输出hello的方法@app.route('/')defhello(): return'Hello,World!'#启动Flask程序if__name__=="__main__":app.run()在上述代码中,我们通过app=create_app()
代码创建了一个Flask实例app。2.Flask应用设置
2.2.Flask的路由
在Flask应用中,路由就是连接用户请求的URL和视图函数的方式。Flask会根据HTTP请求的URL在路由表中找到匹配的规则,然后调用相应的视图函数,并把结果返回给用户。
2.2.Flask的路由1.注册路由
Flask使用route()装饰器或add_url_rule()函数来创建URL规则,将函数绑定到URL上,实现路由的注册。一旦路由被注册,当用户访问相应的URL时,就会触发对应的视图函数,并返回该函数的结果作为响应。
2.2.Flask的路由(1)route()装饰器注册路由
在Flask中,route()装饰器的语法相对简单且直观。它用于将一个URL路径映射到一个视图函数上。以下是route()装饰器的基本语法:@app.route(path,methods=['GET','POST',...],**options)defview_function():#函数体returnresponse1.注册路由
2.2.Flask的路由route()装饰器中参数含义如下:path:必选参数,一个字符串,表示URL路径模式。该字符串必须以“/”开头;methods:可选参数,包含HTTP方法的列表,指定HTTP请求方法,默认为['GET'];**options:可选参数,用于进一步定制路由的行为。1.注册路由
2.2.Flask的路由
接下来,我们将展示如何使用route()装饰器来注册路由,实现视图函数与URL之间的映射。以下代码定义了一个register()函数,用以输出一段文字。fromflaskimportFlaskapp=Flask(__name__)#通过route()方法注册路由,URL规则为:/register@app.route('/register',methods=['POST'])defregister():return'这是register()函数!'#启动Flask程序if__name__=="__main__":app.run()1.注册路由
上述代码中,我们定义了一个名为register()的视图函数,然后使用装饰器@app.route('/register',methods=['POST'])注册路由,将URL“/register”与视图函数register()进行映射关联,HTTP请求方法为POST。
2.2.Flask的路由
项目启动后,我们使用Postman测试工具对其进行测试,访问的URL为“:5000/register”,测试结果如图所示。1.注册路由
2.2.Flask的路由(2)add_url_rule()函数注册路由
在Flask中,add_url_rule()函数是另一种注册路由的方式,它提供了更多的灵活性和控制。该函数通常用于在创建Flask应用实例后动态地添加路由规则。下面是add_url_rule()函数的基本语法:app.add_url_rule(rule,endpoint=None,view_func=None,methods=None,
strict_slashes=None,**options)1.注册路由
2.2.Flask的路由add_url_rule()函数中参数含义如下:rule:必选参数,一个字符串,表示URL规则;endpoint:可选参数,与视图函数相关联的端点名;view_func:可选参数,当URL被请求时调用的视图函数。methods:可选参数,包含HTTP方法的列表,指定HTTP请求方法,默认为['GET'];strict_slashes:可选参数,如果为True,则URL必须是严格的,即如果规则中有斜杠,则URL中也必须包含斜杠。默认为None,意味着使用app的配置值;**options:其他可选参数,用于进一步定制路由的行为。1.注册路由
2.2.Flask的路由下面,我们使用add_url_rule()函数来注册路由,代码参考如下。fromflaskimportFlaskapp=Flask(__name__)deflogin():return'这是login()函数!'#add_url_rule()方法注册路由,URL规则为:/login,视图函数为:login()app.add_url_rule(rule="/login",view_func=login)#启动Flask程序if__name__=="__main__":app.run()1.注册路由
上述代码中,我们定义了一个名为login()的视图函数,然后使用app.add_url_rule()函数注册路由,将URL“/login”与视图函数login()进行映射关联,HTTP请求方法默认为GET。
2.2.Flask的路由
项目启动后,我们使用Postman测试工具对其进行测试,访问的URL为“:5000/login”,测试结果如图所示。1.注册路由
2.2.Flask的路由2.变量规则
为了给URL链接增加变量,我们可以定义路由规则,把变量部分用特定的字段标记成<variable_name>,其作为关键字参数传递给关联的视图函数。下面这个例子展示了通过URL传递变量,并显示该变量的功能,参考代码如下所示。fromflaskimportFlaskapp=Flask(__name__)#通过<variable_name>标记,传递变量,URL规则为:/user/小白@app.route('/user/<name>',methods=['GET','POST'])defshow_name(name):returnname+'欢迎您!'#启动Flask程序if__name__=="__main__":app.run()
2.2.Flask的路由2.变量规则
上述代码中,我们定义了一个show_name(name)视图函数,该函数会接收一个名为name的变量,在“/user/<name>”路由规则中,通过<name>标记传递字符串数据给视图函数,HTTP请求方法为GET和POST。项目启动后,我们使用Postman测试工具对其进行测试,访问的URL为“:5000/user/小白”,测试结果如图所示。
2.2.Flask的路由2.变量规则
在上面的示例中,我们使用了默认的string转换器,传递字符串数据。对于其他类型的数据,我们可以使用<converter:variable_name>标记,在URL中选择性地加上一个转换器,为变量指定规则。Flask常用的转换器见下表。转换器说明示例string(缺省值)接受任何不包含斜杠的文本route('/user/<name>')int接受正整数route('/user/<int:num>')float接受正浮点数route('/user/<float:num>')path接收字符串路径,似string,但可以包含斜杠route('/user/<path:mypath>')uuid接受UUID字符串route('/uuid/<uuid:myuuid>')
2.2.Flask的路由3.URL构建
url_for()是Flask框架中一个非常有用的函数,它用于动态地构建URL。它可以帮助我们生成应用程序内的URL,并确保URL的正确性和安全性。它接受一个或多个参数,其中第一个参数通常是视图函数的名称,其他参数则对应于该视图函数的路由规则中的变量。以下是url_for()函数的基本语法:
url=url_for('视图函数名',参数1=值1,参数2=值2,...)
url_for()方法中参数含义如下:“视图函数名”是生成URL的视图函数的名称。“参数1=值1,参数2=值2,...”是可选参数,对应于视图函数的路由规则中的变量。
2.2.Flask的路由3.URL构建
接下来,我们将展示如何使用url_for()方法生成视图函数的URL的程序。以下是具体的代码示例:fromflaskimportFlask,url_forapp=Flask(__name__)@app.route('/myindex',methods=['GET','POST'])defindex():return'这是首页函数!'#URL构建@app.route('/urlfor',methods=['GET'])defurlfor():#生成index视图函数的URL
index_url=url_for("index")return"URL构建:"+"首页的url="+index_url#启动Flask程序if__name__=="__main__":app.run()
2.2.Flask的路由3.URL构建
上述代码中,我们定义了一个index()视图函数,它的路由是/myindex,同时在urlfor()视图函数中利用url_for()方法生成index()视图函数的URL。项目启动后,我们使用Postman测试工具对其进行测试,访问的URL为“:5000/urlfor”,测试结果如图所示。
2.3.Flask的请求1.Flask请求方式
在Flask中,处理请求通常涉及接收和解析客户端发送的数据。Flask支持多种请求方式,其中最常见的是GET和POST请求。除了GET和POST请求,Flask还支持其他HTTP请求方法,如PUT、DELETE等,但它们在Web开发中的使用相对较少。Flask常见请求方式见下表。请求方式说明GET默认的请求方式,通常用于从服务器获取资源。POST用于向服务器提交数据或文件,请求的数据是隐藏发送的,因此比GET请求更安全。PUT用于向服务器上传或更新资源。DELETE用于请求服务器删除指定的资源。
2.3.Flask的请求1.Flask请求方式
在注册路由时,可以通过methods参数,指定路由的请求方式,以下代码展示了设置register()视图函数的请求方式为POST请求。#通过route()注册路由,URL规则为:/register@app.route('/register',methods=['POST'])defregister():
return'这是register()函数!'
2.3.Flask的请求2.Flask请求钩子
在Flask中,请求钩子(RequestHooks)是一组特殊的函数,它们在请求处理的不同阶段被自动调用。Flask提供了四种请求钩子,它们可以帮助我们在请求处理流程中执行一些必要的操作,比如认证、权限检查、数据库连接管理等。Flask的常用请求钩子见下表。命令命令说明before_first_request这个钩子在整个应用程序的生命周期中只会被调用一次,且在处理第一个请求之前被调用。它通常用于执行一些只需要在应用程序启动时执行一次的初始化操作。(Flask2.2及以上版本不再支持该请求钩子)before_request这个钩子在每次请求处理之前被调用。它通常用于执行一些每次请求都需要执行的操作,比如检查用户认证状态、记录请求日志等。after_request这个钩子在视图函数处理完请求之后,但在响应返回给客户端之前被调用。它通常用于执行一些后处理操作,比如修改响应等。teardown_request这个钩子在每次请求处理完之后被调用,无论是否发生异常。它通常用于执行一些清理操作,比如关闭数据库连接、释放资源等。
2.3.Flask的请求2.Flask请求钩子
在Flask程序中,请求钩子使用装饰器实现,接下来我们编写代码模拟Flask程序进行用户认证、记录操作日志和释放资源的操作,具体代码如下所示。fromflaskimportFlaskapp=Flask(__name__)#用户的Token,当token=""ortoken="user"判断用户是否有操作权限token=""@app.before_requestdefcheck_auth():
#检查用户是否已认证iftokenisNoneortoken=="":print("用户未认证,没有操作权限!")return"用户未认证,没有操作权限!"else:print("用户已认证,拥有操作权限!")pass
2.3.Flask的请求@app.after_requestdefadd_log(response):#给响应添加一些头信息
print("用户操作成功,记录操作信息!")returnresponse@app.teardown_requestdefclose_db_connection(exception):#关闭数据库连接print("关闭数据库连接,释放资源!")pass@app.route('/index',methods=['GET','POST'])defindex():print("欢迎访问古典文学网!")return'这是首页函数!'#启动Flask程序if__name__=="__main__":app.run()接上页2.Flask请求钩子
2.3.Flask的请求
上述代码中,我们为check_auth()函数添加了before_request请求钩子,该函数会在每次请求前被自动执行,它的核心功能是通过token的判断,从而验证用户是否具备相应的操作权限。
在程序中,我们为token设置不同的值(token=""或token="user"),然后启动项目。通过访问“:5000/index”,即可在VSCode的Terminal终端中查看运行结果。具体的运行效果如图所示。2.Flask请求钩子
2.3.Flask的请求3.重新定向
在Flask中,重定向(Redirect)是一种将用户从当前URL导向到另一个URL的机制。这通常用于在用户完成某项操作后,将他们导向到另一个页面,或者当用户尝试访问不存在的页面时,将他们导向到首页或其他合适的页面。
在Flask中,我们可以使用redirect()函数,进行重新定向,参考代码如下所示。fromflaskimportFlask,redirect,url_forapp=Flask(__name__)@app.route('/')defindex():#将用户重定向到'/hello'路由
returnredirect(url_for('hello'))@app.route('/hello')defhello():return'Hello,World!'if__name__=='__main__':app.run()
2.3.Flask的请求3.重新定向
在上述代码中,index()视图函数通过redirect()函数重定向到“/hello”路由。此处使用了url_for()函数用于动态地生成“/hello”路由。项目启动后,可以通过“:5000”进行访问,测试结果如图所示。
2.4.Flask上下文
在Flask框架中,上下文(Context)是一个至关重要的概念。它赋予了开发者在请求处理过程中便捷地访问和操作特定对象的能力,如当前请求对象、应用对象等。
在Flask中,请求上下文扮演着举足轻重的角色,它主要由request对象和session对象组成。
2.4.Flask上下文1.请求上下文(1)request对象
request对象作为Flask框架中的核心组件,汇聚了HTTP请求的所有关键信息。这些信息包括但不限于请求的URL地址、请求头部字段、请求所使用的方法(如GET、POST等)、查询参数、表单提交的数据以及上传的文件等。request对象的常用属性和方法已详细列于下表。request对象的常用属性表属性说明args获取Url中的请求参数method获取请求的HTTP方式cookies获取包含Cookie名称和值的字典对象data获取字符串形式的请求数据form获取解析后的表单数据values包含form和args全部内容的CombineMultiDictheaders获取请求user_agent获取浏览器标识信息
2.4.Flask上下文request对象的常用方法表方法说明close()关闭当前请求get_data()获取请求中的数据get_json()进行JSON解析并返回数据make_from_data_parse()创建表单数据解析器1.请求上下文
2.4.Flask上下文
接下来,我们将模拟一个登录程序。这个程序的主要任务是接收用户的登录请求,并获取用户输入的账号及密码并输出。具体代码如下所示。fromflaskimportFlask,requestapp=Flask(__name__)@app.route('/login',methods=['POST'])deflogin():#获取登录账号及密码
uname=request.form.get("uname")upwd=request.form.get("upwd")return'您的登录账号:'+uname+",密码:"+upwd#启动Flask程序if__name__=="__main__":app.run()1.请求上下文
在上述代码中,我们定义了login()视图函数,模拟用户登录。在该函数中,通过request.form属性来解析用户提交的表单数据,从而获取登录账号和密码,并将其输出。
2.4.Flask上下文
当项目启动后,我们可以通过访问“:5000/login”来触发这个登录功能,在过程中,登录账号和密码需要以表单的形式进行提交。测试结果如图所示。1.请求上下文
2.4.Flask上下文(2)session对象
Flask的session对象基于cookie机制实现,其键值对通常存储在服务端,形式类似{随机字符串:'xxxxxx'}。与此同时,浏览器端的cookie中也保存了相同的随机字符串,以确保在后续请求时能够进行验证。
在使用session对象之前,我们需进行一项重要的配置:设置SECRET_KEY。由于session是通过加密后存储在cookie中的,SECRET_KEY便扮演着加密和解密的关键角色。1.请求上下文
2.4.Flask上下文以下是一个简单的示例,展示了如何使用session对象存储和获取数据。fromflaskimportFlask,sessionapp=Flask(__name__)app.secret_key='your_secret_key'#配置SECRET_KEY@app.route('/')
defindex():
#设置session值
session['user']='小白'
return'保存用户到session!'@app.route('/get_session')defget_session():
#获取session值
user=session.get('user')return'session中保存的用户是:'+user#启动Flask程序if__name__=="__main__":app.run()1.请求上下文
2.4.Flask上下文
在上述代码中,我们通过Flask应用实例app设置了SECRET_KEY,以确保session的安全性。随后,我们定义了两个视图函数:index()和get_session()。在index()函数中,我们为session的user键设置了值小白,用于存储用户的标识信息。而在get_session()函数中,我们则通过session.get('user')来检索并返回session中user键所对应的值。
项目启动后,可以通过访问“:5000/”和“:5000/get_session”来分别触发index()和get_session()函数。测试结果如图所示。1.请求上下文
2.4.Flask上下文2.应用上下文
在Flask应用中,应用上下文(ApplicationContext)主要负责在应用层面执行一系列操作,如访问配置信息、加载扩展等。
2.4.Flask上下文(1)current_app对象
在开发过程中,我们有时需要在应用的各个角落使用app实例,然而直接导入可能会显得不太方便。此时,current_app便作为全局代理应运而生,它允许我们在应用的任何位置都能轻松地访问当前的Flask应用实例。以下示例展示了如何利用current_app对象来获取程序中配置的密钥。代码如下所示。fromflaskimportFlask,current_app
app=Flask(__name__)#假设我们在Flask应用的配置中设置了一个密钥
app.secret_key='your_secret_key'#配置SECRET_KEY
@app.route('/')defindex():#使用current_app对象来获取配置的密钥
secret_key=current_app.secret_keyreturn'配置的密钥为:'+secret_keyif__name__=='__main__':app.run()2.应用上下文
上述代码中,我们在index()视图函数中,通过current_app.secret_key的方式获取了之前配置的secret_key密钥值,并将其作为响应返回。
2.4.Flask上下文
项目启动后,可以通过“:5000”进行访问,测试结果如图所示。2.应用上下文
2.4.Flask上下文
(2)g对象
g对象在应用上下文中作为全局的一个临时变量存在,充当中间媒介的作用。在处理一个请求的过程中,g对象可以用来存储一些临时信息,这些信息在请求的生命周期内都是有效的,但在请求结束后会被清除。
以下示例展示了如何利用g对象来存储和获取临时数据。代码如下所示。fromflaskimportFlask,g
app=Flask(__name__)@app.route('/')defindex():#在应用上下文中使用g对象存储临时信息
g.some_data='我是临时数据!'returng.some_data
if__name__=='__main__':app.run()2.应用上下文
在上述代码中,我们在定义的路由处理函数index()中,通过g对象存储了一个临时字符串,并输出了它的值。
2.4.Flask上下文
项目启动后,可以通过“:5000”进行访问,测试结果如图所示。2.应用上下文
2.5.Flask的响应在Flask中,为了向客户端返回数据,我们需要利用Flask的响应机制。
2.5.Flask的响应1.响应报文
在Flask中,响应(Response)扮演着服务器向客户端传递数据的关键角色,它负责承载着服务器对客户端请求的处理结果。每当Flask的视图函数被调用并返回一个值时,Flask会自动将其转化为响应对象(Response对象),然后将其发送给客户端。响应报文主要由以下几个核心部分组成。状态码,表示请求的处理结果。例如,200表示请求成功,404表示资源未找到等;响应头,包含关于响应的元数据,如内容类型、缓存指令等;响应体,这是响应的主要内容,通常是客户端所期望的数据。它可以是HTML、JSON、XML或其他格式的数据,具体取决于客户端的请求和服务器的处理逻辑。
2.5.Flask的响应2.生成响应
当Flask的视图函数被调用并返回一个值时,会将其转化为响应对象(Response对象)。如果我们需要在程序中主动生成响应,那么可以借助于Response类的构造方法或make_response()函数。接下来,我们将对这两种方式进行详细介绍。
2.5.Flask的响应(1)Response类的构造方法我们先来看下Response类的构造方法的语法,其语法格式如下:
fromflaskimportResponseresponse=Response(response,status,headers,mimetype,content_type,direct_passthrough)上述构造方法中常用参数的含义如下。response,响应内容,可以是字符串、字节串或其他可迭代对象;status,HTTP状态码,默认为200;headers,响应头,是一个字典或类似字典的对象mimetype,内容的MIME类型,如'text/html'或'application/json';content_type,与mimetype相同,用于设置内容类型。2.生成响应
2.5.Flask的响应
接下来,我们将通过Response类的构造方法来生成响应并将其返回给客户端。具体的实现代码如下所示:fromflaskimportFlask,Response
app=Flask(__name__)@app.route('/')defindex():
returnResponse('Hello,Flask!',status=201,content_type='text/plain')if__name__=='__main__':app.run()2.生成响应
上述代码中,我们通过Response类的构造方法生成响应,并通过传入response、status和content_type等参数,分别代表了响应体内容、响应状态码、响应类型。
2.5.Flask的响应
项目启动后,可以通过“:5000”进行访问,测试结果如图所示。2.生成响应
2.5.Flask的响应(2)make_response()函数
在Flask中,make_response()函数用于创建和修改响应对象。它具备强大的兼容性,能够接收多种类型的参数,如字符串、元组、字典以及Response对象等,并统一转化为Response对象返回。
接下来,我们将通过make_response()函数来生成响应并将其返回给客户端。具体的实现代码如下所示:fromflaskimportFlask,make_response
app=Flask(__name__)@app.route('/')defindex():response=make_response(('Hello,Flask!',201))response.headers['content-type']='text/plain'returnresponseif__name__=='__main__':
app.run()2.生成响应
2.5.Flask的响应上述代码中,我们在视图函数index()中调用make_response()函数生成响应,并通过传入response、status和content-type参数的值依次设置了响应体内容、响应状态码、响应类型。项目启动后,可以通过“:5000”进行访问,测试结果如图所示。2.生成响应
2.5.Flask的响应(3)生成JSON类型的响应
在项目后端API开发中,当需要返回JSON格式的响应体时,可使用jsonify()函数创建JSON响应。它会将传入的参数转换为JSON格式,并自动设置正确的content-type为application/json,确保客户端能够正确解析响应内容。
接下来,我们将返回一个JSON响应给客户端。参考代码如下所示:fromflaskimportFlask,jsonifyapp=Flask(__name__)@app.route('/')defbasic_json():
data={'name':'小白','age':30}returnjsonify(data)
if__name__=='__main__':app.run()2.生成响应
2.5.Flask的响应
上述代码中,我们在视图函数index()
中将data字典被传递给jsonify()函数,它返回一个包含JSON数据和正确content-type的响应。
项目启动后,可以通过“:5000”进行访问,测试结果如图所示。2.生成响应
2.6.Flask的蓝图
随着Flask项目的规模逐渐扩大,对程序进行模块化的处理显得尤为重要。幸运的是,Flask内置了一个强大的模块化处理工具——蓝图(Blueprint)。通过蓝图,开发者能够将大型应用拆分成更小、更易于管理的模块,从而实现应用的模块化。Flask的蓝图应用场景主要聚焦于构建大型、复杂的Flask应用、API开发、插件化开发等。
下面我们将通过一个“用户管理”案例来展示其实际应用。在这个案例中,我们利用蓝图将程序划分为了管理员和普通用户两个独立运行的模块。使用蓝图前后的程序结构对比。
2.6.Flask的蓝图
在图(a)中,由于没有使用蓝图,所有视图函数都集中在app.py文件中,这不仅使得程序的开发过程变得烦琐,也给后续的运维工作带来了诸多不便。然而,在图(b)中,程序通过注册两个蓝图——普通用户蓝图和管理员蓝图,实现d了功能的模块化划分,从而有效地优化了程序结构,使开发更为清晰有序,同时也方便了后续的维护和扩展。
2.6.Flask的蓝图
接下来,我们将借助蓝图来开发图(b)中展示的案例,请参考如下步骤。
2.6.Flask的蓝图1.创建蓝图Flask提供了Blueprint类,可使用其构造方法创建蓝图,Blueprint类的构造方法的语法如下所示。blueprint_name=Blueprint('blueprint_name',__name__)上述构造方法中常用参数的含义如下。blueprint_name是蓝图的名称,用于在应用内部唯一标识蓝图;__name__是当前模块的名称,用于定位资源文件。
2.6.Flask的蓝图1.创建蓝图admin.py文件的代码如下所示:fromflaskimportBlueprint#创建蓝图admin_blueprint=Blueprint("admin",__name__)#注册路由@admin_blueprint.route('/register')defregister():return'管理员注册操作!'#登录路由@admin_blueprint.route('/login')deflogin():return'管理员登录操作!'
2.6.Flask的蓝图1.创建蓝图user.py文件的代码如下所示:fromflaskimportBlueprint#创建蓝图user_blueprint=Blueprint("user",__name__)#注册路由@user_blueprint.route('/register')defregister():return'用户注册操作!'#登录路由@user_blueprint.route('/login')deflogin():return'用户登录操作!'
2.6.Flask的蓝图2.注册蓝图完成了admin蓝图和user蓝图的创建后,接下来我们需要通过register_blueprint()方法注册蓝图,该方法的语法如下所示:app.register_blueprint(your_blueprint,url_prefix='/prefix')上述方法中常用参数的含义如下。your_blueprint参数是蓝图对象;url_prefix参数(可选)为蓝图下的所有路由添加前缀。
2.6.Flask的蓝图2.注册蓝图
在本案例中,我们在app.py文件中导入register_blueprint()方法,使用该方法注册admin蓝图和user蓝图,具体代码如下所示:fromflaskimportFlaskfromadminimportadmin_blueprintfromuserimportuser_blueprint
app=Flask(__name__)#注册蓝图app.register_blueprint(admin_blueprint,url_prefix="/admin")app.register_blueprint(user_blueprint,url_prefix="/user")
if__name__=='__main__':app.run()
2.6.Flask的蓝图2.注册蓝图
在上述代码中,我们使用register_blueprint()方法注册了admin蓝图和user蓝图,并指定了url_prefix前缀。项目启动后,可以通过“:5000/admin/login”和“:5000/user/login”访问管理员和普通用户的登录功能,测试结果如图所示。03项目任务
3.项目任务
在这一阶段,小白需要着手搭建“古典文学网”项目的框架,并借助之前学到的Flask技术,开发项目的用户注册、用户登录、图片显示API接口及身份验证功能。
3.1.开发项目的后端框架
“古典文学”网的后端核心在于提供API接口,因此,我们所开发的项目框架与常见的Web项目框架有着显著的区别,更偏向于一个典型的后端服务框架。
3.1.开发项目的后端框架1.需求描述
我们需要开发“古典文学网”项目的后端服务,该项目将采用“应用工厂”模式进行项目布局。通过这种模式,项目能够清晰地提供API接口程序、常用配置文件、数据库访问操作等不同程序目录,使得整个项目结构更加有序、易于维护。
3.1.开发项目的后端框架2.业务功能实现(1)创建项目
首先,在磁盘中创建一个名为cls_svr的文件夹(所在目录不能有中文或特殊字符),并使用VSCode这一开发工具打开它。接下来,我们将按照以下的目录结构来构建后端项目的整体架构,确保项目的组织清晰、易于管理。D:/Projects/cls_svr├──app/
#包含应用代码和文件的Python包│├──__init__.py
#初始化Flask应用的源文件,并导入其他模块│├──api/
#存放API接口的Python包,包括路由定义、数据处理等│├──conf/
#存放配置信息的Python包,包括程序配置、数据库配置等│├──dao/
#存放项目数据库访问层的Python包│└──model/
#存放数据库模型的Python包├──tests/
#测试模块的文件夹├──venv/
#Python虚拟环境└──app.py
#项目程序入口源文件,用于启动项目
3.1.开发项目的后端框架2.业务功能实现在成功创建项目的后端框架后,其项目结构如图所示
3.1.开发项目的后端框架2.业务功能实现(2)创建配置文件
在项目app/conf/目录下创建配置文件config.py,用于配置参数,代码如下所示:#项目常用配置#------JSON编码配置------ENSURE_ASCII=False#设置是否对JSON数据进行ascii编码
在上述代码中,我们对JSON数据的ASCII编码(ENSURE_ASCII)进行了配置,这一举措主要旨在解决可能出现的中文乱码问题。
3.1.开发项目的后端框架(3)配置应用工厂
为了确保后续开发中的代码更加易于维护、灵活,并使得项目结构更为清晰和模块化,我们在cls_svr项目中采用了应用工厂的方式来创建Flask实例。此处使用到了flask-cors扩展库,实现跨域支持,请确保其已经安装(可参照项目1中的“1.3.1.搭建项目后端开发环境”小节正确安装所有的Flask扩展库)。2.业务功能实现
3.1.开发项目的后端框架
首先在项目中找到app/__init__.py源文件中,创建create_app()应用工厂函数,在该函数中,我们配置了JSON的编码方式及允许程序跨域,其代码实现如下:2.业务功能实现fromflaskimportFlaskfromflask_corsimportCORSfromapp.conf.configimportENSURE_ASCIIdefcreate_app():#构建app
app=Flask(__name__)
app.json.ensure_ascii=ENSURE_ASCII#解决中文乱码问题CORS(app,resources=r'/*')#允许所有资源跨域
returnapp
3.1.开发项目的后端框架
在上述代码中,我们首先导入了config.py文件中的ENSURE_ASCII配置以及flask_cors扩展库。随后,在create_app()函数中,我们进行了两项关键设置:通过app.json_encoder.ensure_ascii=ENSURE_ASCII来配置JSON数据的编码方式;同时,使用CORS(app,resources=r'/*')来设置跨域访问。2.业务功能实现
接下来,在/app.py源文件中,通过create_app()应用工厂函数来创建Flask实例。这一过程的代码实现如下:#引入应用工厂函数fromappimportcreate_app#调用工厂,创建appapp=create_app()#启动Flask程序if__name__=="__main__":#启动服务,设置主机和端口app.run(host="",port=5000,debug=True)
3.2.开发用户注册API接口接下来,我们将开发“古典文学网”的用户注册API接口。
3.2.开发用户注册API接口1.需求描述
用户注册API接口在接收到注册请求后,会解析请求数据,并将用户的注册信息存储至数据库的用户表中。随后,接口会将操作结果反馈给客户端。由于此接口涉及数据库操作,其数据库操作部分将在后续项目中进一步完善。该API接口的详细说明,请参见表。
3.2.开发用户注册API接口用户注册API接口说明表功能说明用户注册API接口调用路径http://ip地址:端口/api/user/registerHTTP请求方式POST请求数据类型application/json请求数据参数参数名类型长度描述必须
unamevarchar登录账号■
upwdvarchar登录密码■
nikenamevarchar
昵称
avatarvarchar
头像
sexvarchar
性别
phonevarchar电话返回数据类型application/json1.需求描述
3.2.开发用户注册API接口用户注册API接口说明表(接上表)1.需求描述返回数据参数
参数名类型长度描述必须codevarchar状态码,200正确,其他错误■msgvarchar返回消息内容■请求参数JSON(样例)"uname":"xiaobai""upwd":""nikename""avatar":"xb.jpg""sex""phone":"}返回数据JSON(样例){"code":"200","msg":"操作成功!"}
3.2.开发用户注册API接口(1)创建用户蓝图
在cls_svr项目的app/api/目录下创建用户蓝图user_blueprint.py,并开发注册API接口,具体代码如下所示:2.业务功能实现fromflaskimportBlueprint,requestfromflaskimportjsonify#创建蓝图user_blueprint=Blueprint("user_blueprint",__name__)#用户注册接口@user_blueprint.route('/register',methods=["POST"])defregister():#返回信息result_msg={"code":"200","msg":"操作成功!"}#获取Json格式的请求,并解析JSONrequest_body=request.get_json()
3.2.开发用户注册API接口接上页代码2.业务功能实现
#判断传入的Json数据是否为空
ifrequest.get_json()isNone:
result_msg["code"]="404"
result_msg["msg"]="参数错误"
returnjsonify(result_msg)
#获取注册数据
uname=request_body.get("uname")#登录账号
upwd=request_body.get("upwd")#登录密码
nikename=request_body.get("nikename")#昵称
avatar="tx.png"#默认头像
sex=request_body.get("sex")#性别
phone=request_body.get("phone")#电话
3.2.开发用户注册API接口接上页代码2.业务功能实现#判断是否注册成功(默认账号为xiaobai的用户可以注册,后续项目将完善该接口)
ifuname=="xiaobai":
result_msg["code"]="200"
result_msg["msg"]="操作成功!"
else:
result_msg["code"]="400"
result_msg["msg"]="操作失败!"
#返回操作结果
returnjsonify(result_msg)
在上述代码中,我们成功地创建了用户蓝图user_blueprint。在这个蓝图中,我们开发了用户注册视图函数register()。该函数负责解析用户的注册请求,获取用户的注册信息,并判断注册是否成功。最后,它会将操作结果返回给客户端。
3.2.开发用户注册API接口2.业务功能实现(2)注册用户蓝图
首先,我们需要定位到项目中的/app/app.py文件。在这个文件中,我们需要进行用户蓝图的注册操作。以下是实现这一功能的具体代码:fromappimportcreate_appfromapp.api.user_blueprintimportuser_blueprint#调用工厂,创建appapp=create_app()#注册蓝图app.register_blueprint(user_blueprint,url_prefix="/api/user")
#启动Flask程序if__name__=="__main__":#启动服务,设置主机和端口app.run(host="",port=5000,debug=True)
在上述代码中,我们导入了用户蓝图user_blueprint,通过register_blueprint()注册用户蓝图,蓝图的url_prefix="/api/user",作为蓝图的URL规则。
3.2.开发用户注册API接口2.业务功能实现(3)用户注册API接口测试
在进行接口测试之前,我们需根据接口说明文档来准备相应的测试数据。本次测试所参考的JSON数据如下:{"uname":"xiaobai","upwd":"123456","nikename":"小白","avatar":"tx.png","sex":"男","phone":}
3.2.开发用户注册API接口2.业务功能实现(3)用户注册API接口测试
项目启动后,可以通过“:5000/api/user/register”进行访问注册API接口,测试结果如图2.18所示。
3.3.开发用户登录API接口接下来,我们将开发“古典文学网”的用户登录API接口。
3.3.开发用户登录API接口1.需求描述
用户登录API接口在接收到登录请求后,接口会解析请求数据,并判断登录用户是否在数据库的用户表中存在。随后,接口会将操作结果反馈给客户端。由于此接口涉及数据库操作和身份验证,这些功能将在后续项目中进一步完善。该API接口的详细说明,请参见表。
3.3.开发用户登录API接口1.需求描述用户登录API接口说明表功能说明用户登录API接口调用路径http://ip地址:端口/api/user/loginHTTP请求方式POST请求数据类型application/json请求数据参数参数名类型长度描述必须unamevarchar登录账号unameupwdvarchar登录密码upwd返回数据类型application/json返回数据参数参数名类型长度描述必须codevarchar状态码,200正确,其他错误codemsgvarchar返回消息内容msgtokenvarchar返回token信息,用户身份验证与赋权token请求参数JSON(样例)"uname":"xiaobai""upwd":"}返回数据JSON(样例)"code":"200""msg":"操作成功!""token":"eyJhbGciOiJIUzUxMiJ9……"}
3.3.开发用户登录API接口(1)开发用户登录API接口
在cls_svr项目中,找到位于app/api/user_blueprint.py的用户蓝图文件。在此用户蓝图中,我们开发了用户登录API接口。以下是关键代码实现:2.业务功能实现......#用户登录接口@user_blueprint.route('/login',methods=["POST"])deflogin():#返回信息result_msg={"code":"200","msg":"操作成功!"}#获取Json格式的请求,并解析JSONrequest_body=request.get_json()ifrequest.get_json()isNone:result_msg["code"]="404"result_msg["msg"]="参数错误"returnjsonify(result_msg)
3.3.开发用户登录API接口接上页代码:2.业务功能实现
#获取登录数据
uname=request_body.get("uname")#登录账号
upwd=request_body.get("upwd")#登录密码
#判断是否登录成功(默认账号为xiaobai的用户可以登录,后续项目将完善该接口)
ifuname=="xiaobai"andupwd=="123456":
result_msg["code"]="200"
result_msg["msg"]="操作成功!"
result_msg["token"]=""#后续开发中完善
else:
result_msg["code"]="400"
result_msg["msg"]="操作失败!"
#返回操作结果
returnjsonify(result_msg)......
在上述代码中,我们在用户蓝图中,开发了用户登录视图函数login()。该函数负责解析用户的登录请求,获取用户的登录信息,并判断登录是否成功。最后,它会将操作结果返回给客户端。
3.3.开发用户登录API接口(2)用户登录API接口测试
在进行接口测试之前,我们需根据接口说明文档来准备相应的测试数据。本次测试所参考的JSON数据如下:2.业务功能实现{"uname":"xiaobai","upwd":"123456"}
3.3.开发用户登录API接口(2)用户登录API接口测试
项目启动后,可以通过“:5000/api/user/login”进行访问登录API接口,测试结果如图所示。2.业务功能实现
3.4.开发身份验证和鉴权功能
在前后端分离的开发模式中,通信鉴权问题无疑是首先需要解决的关键问题。而目前,应用最广泛且高效的解决方案便是JWT(JSONWebToken)。
3.4.开发身份验证和鉴权功能1.需求描述
在项目中,我们计划将身份验证和鉴权功能集成到先前开发的用户登录API接口中。为实现这一功能,我们选用了Flask-JWT-Extended扩展库进行开发工作。
Flask-JWT-Extended是一个强大的Flask扩展,它提供了JSONWebToken(JWT)的全套功能,包括令牌的生成、验证以及刷新。该扩展库的常用方法见表所示。
Flask-JWT-Extended扩展库常用方法表常用方法描述create_access_token()用于创建令牌get_jwt_identity()用来根据令牌取得之前的identity信息jwt_required()一个装饰器,用来保护flask节点(
3.4.开发身份验证和鉴权功能2.业务功能实现(1)JWT参数配置
在项目的app/conf/目录下打开配置文件config.py,用于配置JWT参数。具体代码如下所示:#项目常用配置#------JWT配置------JWT_SECRET_KEY='jwt_xiaobai_168'#设置JWT的密钥#设置访问令牌的过期时间,默认15分钟JWT_ACCESS_TOKEN_EXPIRES=15在上述代码中,我们配置了JWT的密钥(JWT_SECRET_KEY)以及令牌的过期时间(JWT_ACCESS_TOKEN_EXPIRES)。
3.4.开发身份验证和鉴权功能2.业务功能实现(2)创建JWT管理器实例在项目的app/__init__.py文件中,导入Flask-JWT-Extended的相关模块及配置,并创建JWT管理器实例,其关键代码实现如下。......fromflask_jwt_extendedimportJWTManagerfromdatetimeimporttimedeltafromapp.conf.configimportJWT_SECRET_KEYfromapp.conf.configimportJWT_ACCESS_TOKEN_EXPIRES
3.4.开发身份验证和鉴权功能2.业务功能实现接上页代码jwt=JWTManager()#初始化JWTManager
defcreate_app():
.......
#设置JWT的密钥
app.config['JWT_SECRET_KEY']=JWT_SECRET_KEY
#设置访问令牌的过期时间
app.config['JWT_ACCESS_TOKEN_EXPIRES']=timedelta(minutes=JWT_ACCESS_TOKEN_EXPIRES)
jwt.init_app(app)#JWTManager初始化app
returnapp在上述代码中,我们首先导入了JWT的相关模块以及config.py中的配置信息。随后,通过JWTManager()方法成功创建了一个JWT管理器实例。紧接着,在create_app()函数中,我们配置了JWT的密钥以及令牌的过期时间,以确保Token的安全性和有效性。最后,通过调用JWT实例的init_app()方法,成功地对app进行了初始化。
3.4.开发身份验证和鉴权功能2.业务功能实现(3)创建认证端点我们需要创建一个认证端点来处理用户的登录请求,并生成Token。认证端点一般都是选择用户的登录API接口。在项目中,找到app/api/user_blueprint.py用户蓝图文件。在该文件的用户登录API接口中生成用户的Token,并返回给客户端。关键代码如下所示:fromflask_jwt_extendedimportcreate_access_token,jwt_required,get_jwt_identity......#用户登录接口@user_
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 智慧环卫信息管理平台建设方案
- 基于云计算技术的智慧环卫解决方案
- 展台搭建合同范本
- 税务系统纳税信用管理政策解读
- 重型柴油车远程在线监控系统项目 投标方案(技术方案)
- 三农村创业投资手册
- 企业供应链管理的数字化转型及优化策略研究
- 三农产品质量安全追溯系统建设手册
- 新零售技术应用与发展趋势分析报告
- 停车场车辆出入智能管理系统
- 眼科手术学基础
- 多晶硅大型还原炉装备项目可行性研究报告建议书
- 2025年高考作文备考之模拟试题:“自塑”与“他塑”
- (完整版)高考英语词汇3500词(精校版)
- 2024年常州机电职业技术学院高职单招语文历年参考题库含答案解析
- 2025年镇履职事项清单工作培训会会议记录
- 湘教版七年级数学下册第二章实数教学课件
- 电工基础知识培训课件
- 2024年全国职业院校技能大赛高职组(智慧物流赛项)考试题库(含答案)
- 《海洋平台的腐蚀及》课件
- 精神病个案管理
评论
0/150
提交评论