怀念夏天 发表于 2024-11-21 15:43:14

flask与数据库的学习

目录

1.认识flask与flask的基本操作
1.1 认识flask
1.1.1 界说与特点:
1.1.2 核心组件:
1.1.3 优势与应用
1.2 flask的基本操作
1.2.1 弁言
1.2.2 methods
 1.2.3 重名题目
1.2.4 变量规则
1.2.5 渲染form表单
1.2.6 request对象
1.2.7 重定向(redirect)
 1.2.8 返回json数据给前端
 1.2.9 abort()函数
1.2.10 模板的基本使用
 1.2.11 过滤器
 2. 数据库以及用Flask操作MySQL数据库
2.1 MySQL数据库以及其操作
2.1.1 MySQL数据库
MySQL数据库能做什么?
2.1.2 基本操作
2.2 通过Flask来操作数据库
2.2.1 通过flask来配置情况
2.2.2 创建模子类及flask数据表
2.2.3 flask数据库的查询(增编削查)方法

1.认识flask与flask的基本操作

1.1 认识flask

1.1.1 界说与特点:



[*]Flask是一个使用Python编写的轻量级Web应用框架。
[*]它以简洁、易用和可扩展为设计原则,没有默认使用的数据库和窗体验证工具,但具有很强的定制性。
[*]Flask通常被称为“microframework”,由于它使用简朴的核心,并通过extension增加其他功能。
1.1.2 核心组件:



[*]Werkzeug:Flask的WSGI工具箱,负责业务处置惩罚。WSGI是Web服务器和Web应用程序之间的通用接口规范,界说了Web应用程序怎样与服务器进行通信。
[*]Jinja2:Flask的模板引擎,负责安全方面的功能。Jinja2是Python的一个流行的模板引擎,能够将模板与特定命据源组合以呈现动态网页。
1.1.3 优势与应用



[*]Flask较其他同范例框架更为机动、轻便、安全且轻易上手。
[*]它可以很好地结合MVC模式进行开辟,适合小型团队在短时间内完成功能丰富的中小型网站或Web服务的实现。
[*]Flask的插件库丰富,用户可以根据自己的需求来添加相应的功能,实现个性化的网站定制。
   简朴一点介绍flask:可以把Flask想象成一个工具箱,里面包罗了构建Web应用所需的各种基本工具和组件。使用这个工具箱,你可以快速地搭建出具有动态交互功能的网站或Web服务。
1.2 flask的基本操作

1.2.1 弁言

        我们可以直接先看一段关于flask 的代码:
#首先导入flask
from flask import Flask
app=Flask(__name__)    #实例化对象

@app.route('/hello')      #装饰器 route根目录
#定义函数
def hello():
    return 'hello world'


@app.route('/hi')
def hi():
    return 'hi hi'


#启动flask函数
if __name__ =='__main__':
    app.run()         我们接下来逐行分析代码:
        起首,
   from flask import Flask
        导入所必要的包
        下一串
   app=Flask(__name__)
        此处我们可以ctrl+鼠标左键点击“Flask”,我们在pycharm中会看到如下代码:
   https://i-blog.csdnimg.cn/direct/8347e77a48544daf9c9fa9126ae71c78.png   图1            代码及其之长,大伙自行英译中
        此时看到‘class Flask(App)’就知道Flask其实是一个类,其中有‘init’的参数,即一定要传入一个指定参数,由代码可知,传入‘__name__’,最后我们就必要实例化一个对象。

        继承下一行
   @app.route('/hello')
def hello():
        return 'hello world'
        起首映入眼帘的是一个函数的装饰器(此处并不表明此高级语法),而route则是界说路由,而route自己就是一个装饰器,用于将一个函数绑定到URL上


[*]URL:(Uniform Resource Locator,同一资源定位符)
        是一个用于标识互联网上资源位置的字符串。它提供了一种尺度化的方式,让我们能够定位并访问网页、图片、视频、文件等各种网络资源。
        URL通常由多个部门构成,每个部门都有其特定的含义。以下是一个典范的URL布局:
           协议://主机名:端口号/路径?查询字符串#片段标识符
        以上各种名词在此处不作表明,好奇的各位看官可以自行查阅干系资料。
        接下来将用稍微简朴的语言描述一下:
        可以把URL想象成互联网上的一个“地址”,就像你在实际生活中有一个家的地址一样。这个地址告诉浏览器或其他网络工具去哪里找到你想要的东西,比如一个网页、一张图片或一个文件。
        通常看起来像如许:
   https://www.example.com/path/to/page
        当你在浏览器中输入一个URL时,你可以想象成你正在告诉浏览器:“嘿,我想去这个特定的网站,找到这个位置上的资源。” 然后,浏览器就会按照你的指示去做了。



[*]路由:(Routing)
        指将Web哀求映射随处置惩罚这些哀求的Python函数的过程。每个路由由一个URL规则和一个与之关联的视图函数构成。当用户访问一个特定的URL时,Flask会根据这个URL找到对应的视图函数,并执行该函数来生成响应。



[*]视图函数:
界说:视图函数是平常的Python函数,但它们被特殊设计来处置惩罚Web哀求。
与路由的结合:通过Flask的装饰器(如@app.route),视图函数与特定的URL模式干系联。当客户端哀求匹配该URL时,相应的视图函数就会被调用。
接收哀求数据:视图函数可以使用Flask的request对象来获取客户端发送的数据,包括URL参数、表单数据、查询字符串、哀求头等。
返反响应:视图函数可以返回多种范例的响应,包括字符串、HTML内容、JSON数据或自界说的响应对象。这些响应会被发送给客户端。
        在上述代码中可明白为:
   def hello():
        return 'hello world'
        即为与前一行代码绑定的视图函数


[*]route()
        我们还可以发现route里面已经写了一个‘/hello’,其实就是根路径的意思,稍微演示一下下
      https://i-blog.csdnimg.cn/direct/2167c2c7ecc14e03957b8aa4bb03467c.png       图2               当我们运行代码之后会出现一堆东西,然后有个路径,在路径背面加上‘/hello’,用网页打开,就能看到我们函数的返回值。
        好了,说了那么多,终于简朴表明了一下那几行代码,那么接下来这行代码也是一样的道理
   @app.route('/hi')
def hi():
        return 'hi hi'

        效果如下:
      https://i-blog.csdnimg.cn/direct/1d8c1e8595164a41aa495804b80f0629.png       图3      
        那么到了最后一行代码:
   if name='__main__':
        app.run()
        这一块表明起来并不轻易,初学者可以简朴的记着每次应用flask都要写这行代码即可
        那么使用这种布局有如下原因(资料源于网络):

[*] 模块重用性:当你创建一个Flask应用时,你可能会将应用逻辑组织在一个或多个Python文件中。这些文件既可以作为脚本直接运行(例如,启动开辟服务器),也可以被其他模块导入以复用其中的函数、类等。通过使用if __name__ == '__main__':,你可以确保只有在文件被直接运行时,Flask应用才会启动服务器。假如被导入,则不会执行这部门代码,从而避免不必要的服务器启动和匿伏的冲突。
[*] 开辟服务器启动:app.run()是Flask提供的一个方便的方法,用于在当地启动一个开辟服务器。这个服务器主要用于开辟和测试,并不适合生产情况。通过将其放在if __name__ == '__main__':块中,你可以通过运行Python脚原来启动服务器,而无需创建额外的启动脚本。
[*] 代码组织:使用if __name__ == '__main__':还可以资助你将应用的创建和配置代码与应用的实际运行逻辑分开。这使得代码更加清晰,易于维护。
        想更深入挖掘的看官可以自行搜索资料,以上仅仅做个笼统而抽象的介绍。

        至此,代码部门全部讲完,我们在pycharm中运行一次:
      https://i-blog.csdnimg.cn/direct/ebfc6ccab32a4566a74792ede4e00d9d.png       图4               效果让我们复制一串URL,我们可以在网页中尝试,注意别忘记加上“/hello”或“/hi”,如许子才可以呈现出图2与图3的效果

1.2.2 methods

        起首我们会引入HTTP方法:
        HTTP协议界说了几种哀求方法(也称为“动作”或“下令”),用于指定客户端(如浏览器)渴望服务器对哀求的资源执行的操作。在Web开辟中,最常用的HTTP方法包括:


[*]GET:哀求从指定的资源获取数据。GET哀求应该只被用于读取数据,而不应该产生任何副作用(即,不应该修改服务器上的任何数据)。
[*]POST:向指定的资源提交数据以进行处置惩罚(例如,提交表单数据以进行存储)。POST哀求通常用于创建或更新服务器上的资源。
[*]PUT:向指定资源位置上传其最新内容(全部内容,而不但仅是修改的部门)。
[*]DELETE:哀求服务器删除指定的资源。
        再用简朴的语言表明一下GET和POST,


[*]GET:从服务器获取数据,不改变任何数据。
        想象你走进一家图书馆,你想找一本特定的书。你走到服务台,告诉图书管理员你想要的书名(这就是你的“哀求”)。图书管理员找到那本书,把它拿给你(这就是“响应”)。在这个过程中,你没有改变图书馆里的任何东西,你只是获取了一些信息。
        在Web开辟中,GET方法就像如许。当你使用GET方法哀求一个网页或API时,你只是在哀求获取一些信息,比如一个网页的内容或一个数据库里的数据。服务器会返回这些信息给你,但不会改变任何数据。


[*]POST:向服务器发送数据,可能会改变数据。
        现在,想象你走进同一家图书馆,但这次你不是来借书,而是想捐一本新书给他们。你把书递给图书管理员,并填写了一张卡片,上面写着书的信息(这就是你的“哀求”,包罗了一些要发送的数据)。图书管理员担当你的书,把它放在书架上,并更新图书馆的目录(这就是“响应”,而且在这个过程中,数据被改变了)。
        在Web开辟中,POST方法就像如许。当你使用POST方法时,你通常是在发送一些数据给服务器,比如一个表单的输入。服务器会担当这些数据,可能会存储它们(比如在数据库中),然后返回一个响应,告诉你数据已经被成功处置惩罚。
        说了一大堆,可以来看看以下代码:
from flask import Flask
app=Flask(__name__)

@app.route('/hello',methods=['GET','POST'])
def hello():
    return 'hello world'

@app.route('/hi',methods=['POST'])
def hi():
    return 'hi hi'

if __name__ =='__main__':
    app.run()         我们在路由里添加了methods,得出来效果如下:
      https://i-blog.csdnimg.cn/direct/7b9527d7a7e34949a598095b229e3a2b.png       图5            https://i-blog.csdnimg.cn/direct/09ab26772a0746d58b3aafc95df02bae.png       图6               由以上图5和图6是不是豁然开朗了呢,代码块中'/hi'并没有担当GET方法,故无法获取URL。
 1.2.3 重名题目

        假如我们写的路由与相应的函数重名了怎么办,大部门情况下我们都不建议起重复的名字,接下来演示一下:
from flask import Flask
app=Flask(__name__)
@app.route('/hello',methods=['GET','POST'])
def hello():
    return 'hello world'
#此处用一样的根目录
@app.route('/hello',methods=['GET','POST'])
def hi():
    return 'hi hi'
if __name__ =='__main__':
    app.run()         运行一下:
      https://i-blog.csdnimg.cn/direct/1872d136b8964431b586d74623f0fd74.png       图7​​​​​               将代码位置互换:
from flask import Flask
app=Flask(__name__)
@app.route('/hello',methods=['GET','POST'])
def hi():
    return 'hi hi'
@app.route('/hello',methods=['GET','POST'])
def hello():
    return 'hello world'
if __name__ =='__main__':
    app.run()

      https://i-blog.csdnimg.cn/direct/e1d5a4b10d8849c6bd601e62ec5a5004.png       图8               是不是窥见端倪了,在函数名不一样的情况下,根目录一样,则按顺序执行
        假如函数名一样呢? (此处不以代码展示)
        在函数名一样而根目录不一样的情况下,网页会出现“NOT FOUND”的情况
        以是各位尽量避免函数名和根目录的重复
1.2.4 变量规则



[*]路由参数:
        是界说在路由URL中的一部门,它答应你的应用程序动态地响应不同的URL哀求。在Flask中,路由参数通常被放在尖括号<>中,而且可以是任何有效的标识符。当Flask接收到一个匹配该路由的哀求时,它会从URL中提取出这些参数的值,并将它们作为关键字参数传递给视图函数。


[*]视图函数:
        在Flask应用程序中界说的函数,它们负责处置惩罚特定的URL哀求。当Flask接收到一个哀求时,它会检察哀求的URL,并尝试找到一个匹配的路由。一旦找到匹配的路由,Flask就会调用与该路由关联的视图函数,并将任何路由参数的值作为参数传递给该函数。
        视图函数可以执行任何必要的逻辑来处置惩罚哀求,比如查询数据库、执行计算、渲染模板等。然后,它们会返回一个响应对象或一个可以自动转换为响应对象的值(比如一个字符串、一个字典或一个元组)。这个响应会被发送给客户端(比如浏览器)。
        讲了那么多,不如直接上手代码试试:
from flask import Flask
app=Flask(__name__)
#路由参数
@app.route('/user/<id>')
#视图函数参数
def func(id):
    if id=='1':
      return '1'
    if id==str(2):
      return '2'
    if int(id)==3:
      return '3'
    return 'hello world'

if __name__ =='__main__':
    app.run()         注意参数仅接收字符串参数,代码运行效果如下(仅展示一部门):
      https://i-blog.csdnimg.cn/direct/059fd36c76f845eca83f61433a7bf7b2.png       图9      

[*] 指定参数:
        其实就是指定路由参数,如在上示代码中的“<id>”前面加上范例,如:“int:<id>”即可,相当于一个转换器,如许子在接下来的视图函数中就不一定要接收字符串范例的参数了。
   string:担当不包罗任何斜杠的文本
int:担当正整数
float:担当正浮点数
path:担当包罗斜杠的文本
1.2.5 渲染form表单

        Form表单:(Form,全称HTML Form)
        HTML(超文本标志语言)中用于收集用户输入数据的一种元素。它答应用户通过输入文本、选择选项、上传文件等方式与网页进行交互,并将这些数据发送到服务器进行进一步处置惩罚。Form表单通常由多个表单控件(如输入框、选择框、按钮等)构成,而且包罗用于指定命据提交方式、目标地址等属性的标签。
        这里会用到一点点前端的知识,各位看官假如直接看觉得有点难度,可以去学习部门前端知识。当然,这里用到的非常简朴,也可耐烦看完。
        起首,我们必要在pycharm中的项目文件夹中新建一个python文件,注意此文件与后端(也就是写flask的代码)同级。
        然后,在python文件下面新建一个html文件,然后输入一些部门代码如下图:
      https://i-blog.csdnimg.cn/direct/4c50eb64b23b469d8411f8399cf11849.png       图10               以上是已经编辑好的前端代码,必要的看官可以自己编辑一下试试(“test”应为“text”)(小错误)。
        接下来是后端处置惩罚代码:
from flask import Flask,render_template #就是渲染模板的意思
app=Flask(__name__)
@app.route('/try')
def practice():
    return render_template('practice.html') #注意返回到相应文件名
if __name__ =='__main__':
    app.run()          注意要复制以下html文件的绝对路径到网页中打开
        运行代码如下:
      https://i-blog.csdnimg.cn/direct/ce54b829798d4391a1e93fce33728d5b.png       图11               怎么样?是不是有点feel了,到这里你也许已经小有成就感。
        不着急,在看看写的后端代码,当我们渲染form表单的时候,我们必要导入render_template来渲染这个HTML模板。(当然直接死记硬背下来也行)
   def practice():
        return render_template('practice.html')
        这行代码是practice函数的主体。它调用render_template函数,并传入一个字符串参数'practice.html'。render_template函数会加载并渲染名为practice.html的HTML模板文件,然后返回渲染后的HTML内容作为HTTP响应的主体。这意味着当访问 /try 路由时,用户会看到practice.html模板渲染后的页面。
1.2.6 request对象


[*]方法(Method):

[*]request.method: 获取哀求方法(GET, POST等)。

[*]路径和URL:

[*]request.path: 获取哀求的路径部门(不包罗域名和查询字符串)。
[*]request.full_path: 获取完整的哀求URL,包括查询字符串。
[*]request.url: 获取完整的哀求URL,包括域名、路径和查询字符串。
[*]request.base_url: 获取哀求的URL,但不包括查询字符串。
[*]request.url_root: 获取应用的基础URL,即应用的根URL。
[*]request.host_url: 获取应用的主机URL(包括端口号,假如有的话)。
[*]request.script_root: 获取应用的脚本根URL。

[*]查询字符串参数:

[*]request.args: 获取URL中的查询字符串参数,返回的是一个MultiDict对象,类似于字典,但答应一个键对应多个值。

[*]表单数据:

[*]request.form: 获取POST哀求中的表单数据,同样返回的是一个MultiDict对象。
[*]request.values: 结合了request.args和request.form中的数据,按照优先级(表单数据优先于查询字符串参数)进行归并。

[*]JSON数据:

[*]request.get_json(): 尝试从哀求体中剖析JSON数据,假如哀求体中包罗JSON数据,则返回剖析后的Python对象。

[*]Cookies:

[*]request.cookies: 获取哀求中的Cookies,返回的是一个字典对象。

[*]Headers:

[*]request.headers: 获取哀求头信息,返回的是一个Headers对象,类似于字典,但提供了更多用于操作哀求头的方法。

[*]Files:

[*]request.files: 获取上传的文件,返回的是一个MultiDict对象,其中包罗了所有上传的文件。

[*]远程地址:

[*]request.remote_addr: 获取发起哀求的客户端的IP地址。

[*]用户代理:

[*]request.user_agent: 获取发起哀求的客户端的用户代理字符串,这对于识别客户端范例(如浏览器、手机等)非常有效。

        讲了那么多,知道初学者还一知半解,其实常用的没有几个,接下来上个简朴的实例让大家相识一个这个request,老例子,献上代码:
from flask import Flask,render_template,request
app=Flask(__name__)
@app.route('/try',methods=['GET','POST'])
def practice():
    if request.method=='GET':
      return render_template('practice.html')
    if request.method=='POST':
      name=request.form.get('name')
      password=request.form.get('password')
      print(name,password)
      return 'this is post'

if __name__ =='__main__':
    app.run()         起首,要导入request块;
        接着是用request接收GET和POST哀求,此处用if语句进行演示,注意要在html中填上post语句,如下图:
      https://i-blog.csdnimg.cn/direct/05a8c184065d49bc8b77b037055d5990.png       图12                添加了之后就可以运行后端代码了,会表现同样的页面;
        最后恣意输入数字,然后会出现如下图所示:
      https://i-blog.csdnimg.cn/direct/b971b51deb8541f0885735e9bf56208c.png       图13            https://i-blog.csdnimg.cn/direct/0b824217760f49f58cf90aaa9693ff5a.png       图14      
        怎么样?假如你自己成功执行一边之后,你应该会很有feel吧,其实当我们输入账号和密码之后,后端就会读取我们的数据(如图14),然后网页跳转(图13),简直是magic! 
1.2.7 重定向(redirect)

        重定向是一种HTTP响应,用于将用户从当前URL引导到另一个URL。这通常用于表单提交后的页面跳转、登录后的页面跳转、大概当用户尝试访问必要权限的资源时被重定向到登录页面等场景。
        别的不说,照旧代码先行:
from flask import Flask,url_for,redirect
app=Flask(__name__)
@app.route('/index')
def index():
    return redirect('https://www.baidu.com')
if __name__ =='__main__':
    app.run()         起首,我们要导入redirect重定向的包;
        接着,在index函数中重定向去了“百度”网页;
        最后看看效果:
      https://i-blog.csdnimg.cn/direct/36f5c7475a344d06bf33c894da4e831b.png       图15               怎么样?假如你能精确运行你的程序,到这里你也已经有所感觉了,这里是重定向的第一个方法。
        接下来看看另一组代码:
from flask import Flask,url_for,redirect
app=Flask(__name__)

@app.route('/index')
def index():
    return redirect(url_for('find'))

@app.route('/find')
def find():
    return 'this is find!'

if __name__ =='__main__':
    app.run()         此处用url_for的方法重定向到“/find”路由,终极效果如下(注意,此处我们搜索的是“/index”,然后跳转出“/find”的路由):
      https://i-blog.csdnimg.cn/direct/728b7b4953124e448bb512e562a78728.png       图16         

[*]url_for函数:
   url_for()是Flask提供的一个非常有效的函数,它可以根据视图函数的名称和参数动态生成URL。如许做的好处是,纵然你的路由URL布局发生变革,只要视图函数名称稳定,使用url_for()生成的URL也会自动更新,从而避免了硬编码URL的题目。 
 1.2.8 返回json数据给前端



[*]JSON(JavaScript Object Notation,JavaScript 对象表示法)
        一种轻量级的数据互换格式。它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全独立于语言的文本格式来存储和表示数据。
        简朴说,JSON 是一种数据格式,不是一种编程语言,但它具有通用的布局,可以很轻易被多种编程语言剖析和生成。
        本末节将学习怎样将json数据传给前端,一样平常会有两种方法。
        第一种:
 
from flask import Flask,make_response,json,jsonify
app=Flask(__name__)

@app.route('/index')
def index():
    data={'name':'张三'}
    response=make_response(json.dumps(data,ensure_ascii=False))
    response.mimetype='application/json'
    return response

if __name__ =='__main__':
    app.run()          我们主要来分析一下视图函数的主体部门:
        


[*]data = {'name': '张三'}:创建了一个包罗用户数据的字典。
[*]response = make_response(json.dumps(data, ensure_ascii=False)):使用 json.dumps 将字典转换为 JSON 字符串,并通过 make_response 创建一个响应对象。ensure_ascii=False 确保中文字符不会被转义为 ASCII 字符。
[*]response.mimetype = 'application/json':设置响应的 MIME 范例为 application/json,告诉客户端这是一个 JSON 格式的响应。(此处的范例需记忆)
[*]return response:返反响应对象。
        终极效果给我们呈现如下图:
      https://i-blog.csdnimg.cn/direct/7dcb1f0a4e4548e89dc9883f6f643cd7.png       图17                如许子我们就可以将后端数据返回给前端了;
        接下来看第二种方法:
from flask import Flask,make_response,json,jsonify
app=Flask(__name__)

app.config['JSON_AS_ASCII']=False

@app.route('/index')
def index():
    data={'name':'张三'}
    return jsonify(data)

if __name__ =='__main__':
    app.run()         稍稍表明一波:


[*]app.config['JSON_AS_ASCII'] = False:这行代码配置了 Flask 应用,使其在返回 JSON 响应时不将非 ASCII 字符转义为 ASCII(例如,中文字符不会被转义为 \uXXXX 形式的 Unicode 转义序列)。这是处置惩罚包罗中文或其他非 ASCII 字符的 JSON 数据时非常有效的配置。
[*]return jsonify(data):使用 jsonify 函数将字典转换为 JSON 响应,并返回给客户端。由于之前配置了 JSON_AS_ASCII=False,中文字符 张三 会被精确包罗在 JSON 响应中,而不会被转义。
        最子女码运行的效果也如图17所示。
 1.2.9 abort()函数

        是一个用于立刻停止哀求并返回错误响应的便捷工具。这个函数通常用于处置惩罚错误情况或当哀求不满足某些条件时,立刻中断处置惩罚流程,并向客户端返回一个尺度的 HTTP 状态码。
  abort 函数担当一个 HTTP 状态码作为参数,并可选地担当一个描述错误的消息。当调用 abort 时,Flask 会立刻制止处置惩罚当前的哀求,并生成一个包罗指定状态码和错误消息的响应对象。这个响应对象随后会被发送给客户端。
        简朴来说,就是直接给你报错。
        代码演示:
from flask import Flask,make_response,abort,request,render_template
app=Flask(__name__)

@app.route('/index',methods=['GET','POST'])
def index():
    if request.method=='GET':
      return render_template('practice.html')
    if request.method=='POST':
      name=request.form.get('name')
      password=request.form.get('password')
      if name=='zhansan' and password=='123':
            return 'login success'
      else:
            abort(404)
            return None

if __name__ =='__main__':
    app.run()         大部门代码我们都已经讲过了,这里就是用判断语句来获取name和password实现不同页面的跳转。
        在函数index主体部门的最后用了abort函数,来表现报错,在本代码中是想说明用户输入信息错误。
        详细运行效果如下:
      https://i-blog.csdnimg.cn/direct/4cfed58461514218a051feb844fb2d47.png       图18               假如我们输入的是精确的信息:zhansan,123    则会跳转到如下页面:
      https://i-blog.csdnimg.cn/direct/ddda159e354440b9b3d675d0eee0be61.png       图19                否则出现如下情况:
      https://i-blog.csdnimg.cn/direct/4d86d447cf744a9ba23f61294395f715.png       图20                这就是abort函数的基本用法。
        接下来说一下自界说异常:
        抛下代码:
from flask import Flask,make_response,abort,request,render_template
app=Flask(__name__)

@app.route('/index',methods=['GET','POST'])
def index():
    if request.method=='GET':
      return render_template('practice.html')
    if request.method=='POST':
      name=request.form.get('name')
      password=request.form.get('password')
      if name=='zhansan' and password=='123':
            return 'login success'
      else:
            abort(404)
            return None

@app.errorhandler(404)
def handle_404_error(err):
    return '404 error 错误信息%s'%err

if __name__ =='__main__':
    app.run()         最后一部门的代码界说了一个错误处置惩罚函数,用于捕获 404 错误(即未找到资源)。当 Flask 抛出一个 404 错误时(例如,通过调用 abort(404)),这个函数会被调用,并返回一个自界说的错误消息。不外,由于 abort(404) 直接抛出了异常,这个错误处置惩罚函数实际上会接管并生成终极的响应,而不是简朴地打印错误信息或返回 None。
        运行效果如下:
      https://i-blog.csdnimg.cn/direct/da362ac6f9b14242abf60d84212c476a.png       图21               如愿以偿得到我们想要的报错信息,其实我们还能自界说报错画面,必要一点点前端的知识,此处不作拓展,感兴趣的看官可自行搜索。
1.2.10 模板的基本使用

        这里稍稍用到前端的知识,先抛出后端代码:
from flask import Flask,make_response,abort,request,render_template
app=Flask(__name__)

@app.route('/index')
def index():
    data={'name':'张三','age':18,'mylist':}
    return render_template('practice2.html',data=data)

if __name__ =='__main__':
    app.run()         这行代码调用render_template函数,渲染一个名为practice2.html的模板文件,并将data字典作为上下文传递给模板。模板文件应该位于Flask应用的templates文件夹中。在模板中,可以使用Jinja2模板引擎的语法访问传递的数据,例如,可以使用{{ data.name }}访问name的值。
        抛出前端代码,各位可以模拟地敲一下(和之前一样,应该在后端代码的同一级位置)
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
hello world
<br>
{{data}}
<br>
{{data.name}}
<br>
mylist:{{data.mylist}}
<br>
mylist:{{data.mylist}}
<br>
count:{{data.mylist+data.mylist}}
</body>
</html>         终极得到效果如下:
      https://i-blog.csdnimg.cn/direct/b69c43b35f3b4b1bb61785cc024eb5e7.png       图22        1.2.11 过滤器

        起首是在前端处置惩罚的一些手段:
      https://i-blog.csdnimg.cn/direct/5683862a1c6b401190e6630da6a4d7e9.png       图23               然后得到页面中的效果:
      https://i-blog.csdnimg.cn/direct/17fab715a4a44c58bc2a262a659e5417.png       图24                一览无余过滤器的作用,这里仅仅只作简朴的小介绍。其实还有其他很多jinjia2模板的过滤器,可以自行搜索并使用。
        我们同时也可以自界说一些过滤器,如取列表中的偶数项......之类的一些特殊过滤器,我们就可以自界说函数去书写了。
        举个简朴例子:(给上前后端代码)
from flask import Flask,make_response,abort,request,render_template
app=Flask(__name__)

@app.route('/index')
def index():
    data={'name':'张三','age':18,'mylist':}
    return render_template('practice2.html',data=data)

def list_step(k):
    return k[::2]

#自定义一个过滤器,第一个值写自定义函数的名字,第二个值写你给它起的名字
app.add_template_filter(list_step,'k2')

if __name__ =='__main__':
    app.run() <!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
hello world
<br>
{{data}}
<br>
{{data.name}}
<br>
mylist:{{data.mylist}}
<br>
mylist:{{data.mylist}}
<br>
count:{{data.mylist+data.mylist}}
<br>
{{'hello world'|upper}}
<br>
mylist:{{data.mylist |k2}}
</body>
</html>         在最后一部门我们用了“k2”的自界说过滤器,得出来效果如下:
      https://i-blog.csdnimg.cn/direct/f696f6c3a6ff468eb1b75b9922e448b7.png       图25               以上就是jinjia2模板引擎过滤器的使用了。



 2. 数据库以及用Flask操作MySQL数据库

        总之,我们接下来就要学习一下数据库的知识了,前面的Flask的基本操作来为操作数据库做足了铺垫,接下来让我们继承学习(战术喝水)
2.1 MySQL数据库以及其操作

2.1.1 MySQL数据库

        我们这里暂且不提供MySQL的数据库操作,详细可见文档(不是本人写的)2024 年 MySQL 8.0 安装 配置 教程 最简易(保姆级)_mysql安装-CSDN博客文章浏览阅读10w+次,点赞2.2k次,收藏6.7k次。起首去官网下一个MySQLMySQL :: Download MySQL Installer这里没有看到64位的安装包, 不要着急, 这只是一个安装器, 安装包里有64位的MySQL Server8.0这时候假如直接安装你会发现: 默认装到 C:\Program Files\MySQL , 而且不给你路径选择我们知道, 假如是msi安装包安装, 会安装到C盘且没有路径选择. 假如是压缩包安装, 就是在下令行里调试, 可以解压安装到指定的路径.但是, 下令行安装有致命..._mysql安装https://g.csdnimg.cn/static/logo/favicon32.icohttps://blog.csdn.net/m0_52559040/article/details/121843945
MySQL:
        MySQL是一个关系型数据库管理系统(RDBMS),由瑞典MySQL AB公司开辟,后归属于Oracle公司。它是最流行的关系型数据库之一,尤其在WEB应用方面,MySQL被视为最佳的RDBMS应用软件之一。
        MySQL将数据保存在不同的表中,而不是将所有数据会合存储,这种方式提高了数据访问的速度和机动性。MySQL使用SQL(Structured Query Language)语言进行数据库操作,这是一种尺度化的数据库访问语言。
        更简朴的语言:MySQL就像一个超级智能的仓库管理员,它负责管理和存储大量的信息或数据。这些信息被整齐地分类存放在不同的“盒子”(我们称之为“表”)里,每个“盒子”里又有很多小格子(我们称之为“列”),每个小格子里可以放一种范例的信息(比如名字、年龄等)。
MySQL数据库能做什么?


[*] 存储信息:你可以把各种信息,比如用户的个人信息、产物的详细信息、订单信息等,都存放在MySQL里。
[*] 快速查找:当你必要查找某个信息时,MySQL能敏捷帮你定位到它所在的“盒子”和“小格子”。
[*] 保护数据安全:MySQL能确保你的数据不被随意检察或修改,除非你答应。
[*] 多人协作:多个“仓库管理员”(即多个用户)可以同时使用MySQL,互不干扰。

2.1.2 基本操作


[*] 数据库的基本操作

[*]创建数据库:使用“CREATE DATABASE 数据库名;”语句创建新的数据库。
[*]检察数据库:使用“SHOW DATABASES;”语句检察所有数据库。
[*]选择数据库:使用“USE 数据库名;”语句选择要进行操作的数据库。
[*]删除数据库:使用“DROP DATABASE 数据库名;”语句删除数据库。

[*] 数据表的基本操作

[*]创建表:使用“CREATE TABLE 表名 (列名 数据范例 [约束], ...);”语句创建表。
[*]检察表:使用“SHOW TABLES;”语句检察当前数据库中的所有表。
[*]检察表布局:使用“DESCRIBE 表名;”或“SHOW COLUMNS FROM 表名;”语句检察表的布局。
[*]删除表:使用“DROP TABLE 表名;”语句删除表。

[*] 数据的基本操作

[*]插入数据:使用“INSERT INTO 表名 (列名1, 列名2, ...) VALUES (值1, 值2, ...);”语句插入数据。
[*]查询数据:使用“SELECT 列名1, 列名2, ... FROM 表名 ;”语句查询数据。可以使用“*”取代列名表示查询所有列。
[*]更新数据:使用“UPDATE 表名 SET 列名1 = 值1, 列名2 = 值2, ... ;”语句更新数据。
[*]删除数据:使用“DELETE FROM 表名 ;”语句删除数据。假如不加WHERE条件,将删除表中的所有数据。

        讲了那么多,其实各位不用特意纠结数据库怎么用,我们本文章重点照旧使用Flask来操作数据库,以是上面除了安装MySQL数据库,其他内容可以不看。

2.2 通过Flask来操作数据库

2.2.1 通过flask来配置情况

        对于新手来说,这一步恐怕是比力难的,那我们详细介绍一下该环节。
        第一步:
        我们必要在pycharm中导入PyMySQL库:
        
      https://i-blog.csdnimg.cn/direct/b00ae60275db41589e332e4dab77af85.png       图26               起首我们打开pycharm后,在右下角会出现这些东西,(图26)然后我们点击“Python 3.12”,再点击“表明器设置”,就会出现以下页面:
      
      https://i-blog.csdnimg.cn/direct/8ec28baeef4a43fab17144bb5d47bdef.png       图27               然后点击左上角“+”,搜索“PyMySQL”,然后安装软件包就行了。
        接着win+R,输入cmd,回车进入下令行窗口,再输入my -u root -p,然后输入你的密码,然后回车:(如图28)
      https://i-blog.csdnimg.cn/direct/5adddd37dfe44e82abf173eb6ade4f5a.png       图28               接着创建一个新的数据库:(如图29)
      https://i-blog.csdnimg.cn/direct/729a3350cfb748a1a0266ea28bc7a826.png       图29               其中“data_base2”是自界说的数据库名字,你也可以改成别的名字。(其他照着抄就好了)
        接下来回到pycharm中输入以下代码完成配置:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app=Flask(__name__)


app.config['SQLALCHEMY_DATABASE_URI']='mysql+pymysql://root:password@127.0.0.1/data_base2'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS']=False

db=SQLAlchemy(app)    注意:以下代码中的“password”换成你的数据库密码
app.config['SQLALCHEMY_DATABASE_URI']='mysql+pymysql://root:password@127.0.0.1/data_base2'
         如许子就完成flask的情况配置了,完成了最繁琐的一步。
2.2.2 创建模子类及flask数据表

        不多说,抛下代码:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app=Flask(__name__)


app.config['SQLALCHEMY_DATABASE_URI']='mysql+pymysql://root:Zwh119811@127.0.0.1/data_base2'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS']=False

db=SQLAlchemy(app)


class Role(db.Model):
    '''角色表'''
    __tablename__='role'
    id=db.Column(db.Integer,primary_key=True)#数字即int类型
    name=db.Column(db.String(32),unique=True)

class User(db.Model):
    '''用户表'''
    __tablename__='user'
    id=db.Column(db.Integer,primary_key=True)#默认自增长
    name = db.Column(db.String(128), unique=True)
    password=db.Column(db.String(128))
    #表关系外键ForeignKey 用来关联到另外一张表
    role_id=db.Column(db.Integer,db.ForeignKey('role.id'))

if __name__ =='__main__':
    with app.app_context():
      #清楚所有表
      db.drop_all()
      #创建所有表
      db.create_all()

      #创建对象,插入数据
      role1=Role(name='admin')
      # session记录到对象任务中
      db.session.add(role1)
      #提交任务
      db.session.commit()

      role2=Role(name='admin2')
      db.session.add(role2)
      db.session.commit()

      use1=User(name='zhansan',password='123',role_id=role1.id)
      use2=User(name='lisi',password='321',role_id=role1.id)
      use3=User(name='wangwu',password='321',role_id=role2.id) #关联到第二个角色
      db.session.add_all()
      db.session.commit()         代码很长,慢慢看。
   在第一个类中:


[*] class Role(db.Model): 这行代码界说了一个名为 Role 的类,它继承自 db.Model。db.Model 是 SQLAlchemy 提供的一个基类,用于界说数据库模子。
[*] __tablename__ = 'role': 这是一个类属性,用于指定这个模子类在数据库中对应的表名。在这个例子中,表名被设置为 'role'。
[*] id = db.Column(db.Integer, primary_key=True): 这行代码界说了一个名为 id 的列,其数据范例为整数(db.Integer),而且这个列被指定为主键(primary_key=True)。主键是表中每条纪录的唯一标识符。
[*] name = db.Column(db.String(32), unique=True): 这行代码界说了一个名为 name 的列,其数据范例为长度不超过32个字符的字符串(db.String(32))。unique=True 参数表示这个列的值在表中必须是唯一的,即不答应有两条纪录具有雷同的 name 值。
    在第二个类中:


[*] class User(db.Model): 界说了一个名为 User 的类,它继承自 db.Model,表示这是一个数据库模子。
[*] __tablename__ = 'user': 指定这个模子类在数据库中对应的表名为 'user'。
[*] id = db.Column(db.Integer, primary_key=True): 界说了一个主键列 id,其数据范例为整数。注意,这里更正了原代码中的 db.Interger 为 db.Integer。
[*] name = db.Column(db.String(128), unique=True): 界说了一个名为 name 的列,其数据范例为长度不超过128的字符串,而且这个列的值在表中必须是唯一的。
[*] password = db.Column(db.String(128)): 界说了一个名为 password 的列,用于存储用户的密码,数据范例为长度不超过128的字符串。
[*] role_id = db.Column(db.Integer, db.ForeignKey('role.id')): 界说了一个名为 role_id 的列,其数据范例为整数,而且这个列被设置为外键,引用 role 表中的 id 列。这表示每个用户都与一个角色干系联,通过 role_id 来建立这种关系。同样,这里更正了原代码中的 db.Interger 为 db.Integer。
     在最后一段:
if __name__ == '__main__':# 删除数据库中所有的表db.drop_all()# 创建数据库中所有的表db.create_all()# 创建一个角色实例,名称为 'admin'role1 = Role(name='admin')# 将角色实例添加到数据库会话中,但此时并未真正写入数据库db.session.add(role1)# 提交数据库会话,将更改写入数据库db.session.commit()# 创建一个角色实例,名称为 'admin2'role2 = Role(name='admin2')# 注意:这里有一个拼写错误,应该是 db.session 而不是 db.seesiondb.session.add(role2)db.session.commit()# 创建三个用户实例use1 = User(name='zhangsan', password='123', role_id=role1.id)use2 = User(name='lisi', password='321', role_id=role1.id)use3 = User(name='wangwu', password='321', role_id=role2.id)# 注意:这里应该使用 add_all 方法一次性添加多个实例到数据库会话中db.session.add_all()# 提交数据库会话,将更改写入数据库db.session.commit()         一口吻说了那么多,再执行代码后,在下令行窗口输入指定下令可得下图:
      https://i-blog.csdnimg.cn/direct/8919e690897e4c5094e6434c28c06424.png       图30            https://i-blog.csdnimg.cn/direct/fd1aada56b7c4fb8950d3ebb958d5bad.png       图30                这就是数据表的一些使用
2.2.3 flask数据库的查询(增编削查)方法

        起首抛下代码:
with app.app_context():
    db.drop_all() #删除所有数据库
    db.create_all() #建立数据库         这句话一定要写,原理各位看官可以问AI了。
        接下来是“增编削查”的演示代码:

class User(db.Model): #映射进入数据库内部
    __tablename__ = "user_1"#表名
    id = db.Column(db.Integer, primary_key=True, autoincrement=True) #设置字段,且为主键,自主增长
    #string在数据库中为varchar
    username = db.Column(db.String(100), nullable=False) #设置用户名字段,为字符串类型,可设置长度,设置不可为空
    password = db.Column(db.String(100), nullable=False) #设置密码字段,参数同上
   
@app.route('/user/add') #增添数据
def user_add():
    # 创建ORM对象,设计一条数据,包含数据库内的字段
    user1 = User(username="admin", password="123")
    user2 = User(username="admin", password="12345")
    user3 = User(username="张三", password="abc")   

    #使用add_all(),方法一次性添加多个对象 但首先需要将它们放入一个列表中
    # 如果只有一个,那就db.session.add(user1)
    users_to_add =    
    db.session.add_all(users_to_add)   #将ORM对象添加到db.session中
      
    #将db.session中的改变同步到数据库中,每一步对数据库进行操作都要有这个。
    db.session.commit()
    return "用户创建成功"

@app.route('/user/query') #查找数据
def query():
# 1.get查找,根据主键查找
    #user = User.query.get(1)   查找到主键值为1的User对象(就是一行的数据
    #print(f"{user.id}:{user.username}:{user.password}")   
    #return "数据查找成功"
   
# 2.filter.by查找
    users = User.query.filter_by(username="admin")
    #通过用户名来查找,查找所有为admin的用户,但不支持模糊搜索
   
    for user in users:
      print(user.username,user.password)   # 可以调用user内的全部字段
    return "数据查找成功"
   
# User.query.all() 获取表中的全部的User数据,返回数据为列表类型   
# .exists() 判断数据是否存在

@app.route('/user/update')
def update():
    #查找得到其中的数据
    user = User.query.filter_by(username="张三").first()
    # 不加first返回的是一个对象而不是一个实例
    # 但所有删改都智能对某一个特定实例进行,所以必须要将实例从对象中取出
   
    user.password = "aaaaa"# 更改user的数据

    db.session.commit()#同步到数据库
    return "数据修改成功!"

@app.route('/user/delete')
def delete():
    # 查找到对应的数据
    user = User.query.filter_by(username="张三").first()
    # db.session中删除对应数据
    db.session.delete(user)
    # 同步到数据库
    db.session.commit()
    return "数据删除成功!" PS:代码来自:https://bbs.csdn.net/topics/619386272https://csdnimg.cn/release/blog_editor_html/release2.3.7/ckeditor/plugins/CsdnLink/icons/icon-default.png?t=O83Ahttps://bbs.csdn.net/topics/619386272
        增编削查的方法可熟读以上代码,至此不作赘述了。(写累了) 

至此,我们学习了flask的基本操作,及利用flask简朴地操作数据库,渴望对各位提供到资助~~

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: flask与数据库的学习