flask构建AI网站(后端基础)

前后端分离,用python语言构建网页及后端功能。

环境构建

在自己的虚拟环境py38中安装了flask框架:

在本机文件存放位置:E:\git\FLASK\_FILE

flask示例

最简单的一个flask项目,创建一个py文件后,输入以下内容

代码语言:python代码运行次数:0运行复制
from flask import Flask



app = Flask(\_\_name\_\_)



@app.route('/')

def hello\_world():

    return 'Hello, World!'

if \_\_name\_\_ == '\_\_main\_\_':

    app.run()

相对的,可以使用前端的内容改进一下:

代码语言:python代码运行次数:0运行复制
from flask import Flask



app = Flask(\_\_name\_\_)



@app.route('/')

def hello\_world():

    return '<h1>Hello, World!</h1>'

if \_\_name\_\_ == '\_\_main\_\_':

    app.run()
注:在上面项目中,如果你修改flask项目文件,发现网页内容不随之变化,是因为浏览器的缓存机制,导致无法实时更新界面。可以通过flask的debug模式,来让网页实时更新。
代码语言:python代码运行次数:0运行复制
from flask import Flask



app = Flask(\_\_name\_\_)

app.debug = True  # 开启调试模式,方便网页内容实时更新



@app.route('/')

def hello\_world():

    return '<h1>Hello, World!</h1>'

if \_\_name\_\_ == '\_\_main\_\_':

    app.run()

但需要注意,在实际的项目开发中,使用debug是十分危险的。会有以下的问题:

1、会泄露当前报错页面的源码,可供审计挖掘其他漏洞

2、会泄露Web应用的绝对路径,及Python解释器的路径(可以配合写文件漏洞向指定目录的文件内写入构造好的恶意代码,利用方式可以参考安全客的这篇文章:文件解压之过 Python中的代码执行)

3、debug页面中包含Python的交互式shell,可以执行任意Python代码

所以在实际运用过程中,不要开启debug,调试代码每次修改后再运行。这里因为是练习,为了方便才开启debug。

参考博客

flask中的路由

Flask 路由是 Web 应用程序中将 URL 映射到 Python 函数的机制。

定义路由:使用 @app.route('/path') 装饰器定义 URL 和视图函数的映射。

路由参数:通过动态部分在 URL 中传递参数。

路由规则:使用类型转换器指定 URL 参数的类型。

请求方法:指定允许的 HTTP 请求方法。

路由函数返回:视图函数可以返回不同类型的响应。

静态文件和模板:管理静态文件和动态渲染 HTML 模板。

路由优先级:确保路由顺序正确,以避免意外的匹配结果。

以上述的程序为例,@app.route('/'):装饰器,用于定义路由。/ 表示根 URL。def hello_world()表示视图函数,当访问根路由时,执行该函数,返回'Hello, World!'。

子路由及动态路由

代码语言:python代码运行次数:0运行复制
from flask import Flask



app = Flask(\_\_name\_\_)

app.debug = True  # 开启调试模式,方便网页内容实时更新



@app.route('/')

def hello\_world():

    return '<h1>Hello, World!</h1>'



@app.route('/user')  # 路由,添加user

def user():

    return '<h1>Hello, user</h1>'



@app.route('/user/<name>')  # 动态路由

def user\_name(name):

    return '<h1>Hello, %s</h1>' % name

if \_\_name\_\_ == '\_\_main\_\_':

    app.run()

method,限制路由访问方法

代码语言:python代码运行次数:0运行复制
from flask import Flask



app = Flask(\_\_name\_\_)

app.debug = True  # 开启调试模式,方便网页内容实时更新



@app.route('/', methods = ['GET', 'POST'])  # 访问根目录只能是get或者post方法

def hello\_world():

    return '<h1>Hello, World!</h1>'



@app.route('/user', methods = ['post'])  # 访问/user只能是post方法

def user():

    return '<h1>Hello, user</h1>'



@app.route('/user/<name>')  # 动态路由

def user\_name(name):

    return '<h1>Hello, %s</h1>' % name

if \_\_name\_\_ == '\_\_main\_\_':

    app.run()

不是用指定的方式访问会返回Method Not Allowed

变量规则

现在有个要求,要求网页显示内容要根据网址后的参数变化而变化。比如网址http://127.0.0.1:5000/后1返回python,2返回java,3返回php。

代码语言:bash复制
http://127.0.0.1:5000/1 python

http://127.0.0.1:5000/2 java

http://127.0.0.1:5000/3 php

代码如下:

代码语言:python代码运行次数:0运行复制
from flask import Flask



app = Flask(\_\_name\_\_)

app.debug = True  # 开启调试模式,方便网页内容实时更新



@app.route('/user/<name>')  # 动态路由

def user\_name(name):

    if name == '1':  # 因为输入的时候,参数类型为str

        return '<h1>python</h1>'

    elif name == '2':

        return '<h1>java</h1>'

    elif name == '3':

        return '<h1>php</h1>'

    else:

        return '<h1>请输入1、2、3</h1>'

if \_\_name\_\_ == '\_\_main\_\_':

    app.run()

改进

想让参数传递进去的时候就是整数,可以使用<int: >的方法

上面代码改进如下:

代码语言:python代码运行次数:0运行复制
from flask import Flask



app = Flask(\_\_name\_\_)

app.debug = True  # 开启调试模式,方便网页内容实时更新



@app.route('/user/<int:name>')  # 动态路由

def user\_name(name):

    if name == 1:  # 因为输入的时候,参数类型为str

        return '<h1>python</h1>'

    elif name == 2:

        return '<h1>java</h1>'

    elif name == 3:

        return '<h1>php</h1>'

    else:

        return '<h1>请输入1、2、3</h1>'

if \_\_name\_\_ == '\_\_main\_\_':

    app.run()

显示的内容依然跟原来的代码相同,但需要注意的是<int:name>中不要有空格。

类似的转换的类型还有floatstring。需要注意的是string中不能包括/,floatint都需正数。路由中的path是可以包括/

自定义转换器

由于上面提到的默认转换器有诸多限制,有时可能需要自己自定义转换器,需要重写父类,代码如下:

代码语言:python代码运行次数:0运行复制
from flask import Flask

from werkzeug.routing import BaseConverter  # 导入所有转换器的基类BaseConverter



app = Flask(\_\_name\_\_)

app.debug = True  # 开启调试模式,方便网页内容实时更新



class RegexConverter(BaseConverter):  # 自定义转换器

    # 重写构造方法传入url\_map,regex

    def \_\_init\_\_(self, url\_map, regex):

        super().\_\_init\_\_(map=url\_map)

        self.regex = regex  # 将正则表达式保存到regex中



# 将定义的 RegexConverter 添加到 Flask 应用的 URL 转换器字典中,并为其分配了一个键 're'。可以在路由中使用 re:<pattern> 来使用这个转换器。

app.url\_map.converters['re'] = RegexConverter





# re中传入正则表达式 校验手机号格式是11位

@app.route("/index/<re(r'\d{11}'):mobile>")

def index1(mobile):

    print(mobile)

    return "Index"





if \_\_name\_\_ == "\_\_main\_\_":



    app.run()  # 启动flask应用

渲染form表单

首先在当前项目下创建一个templatespython package。

然后在templates中新建一个html文件。

创建的html页面如下:

接下来将原来templates文件夹设置为jinjia2

后面跳转页面选择jinjia2,html即可(jinjia2就是一个渲染库)。

python文件写的内容如下:

代码语言:python代码运行次数:0运行复制
# -\*- coding:utf-8 -\*-

# @author:Ye Zhoubing

# @datetime:2025/3/17 20:28

# @software: PyCharm

from flask import Flask,render\_template  # 导入渲染模板



app = Flask(\_\_name\_\_)

app.debug = True  # 开启调试模式,方便网页内容实时更新





# re中传入正则表达式 校验手机号格式是11位

@app.route("/index")

def index():

    return render\_template('index.html')





if \_\_name\_\_ == "\_\_main\_\_":

    app.run()  # 启动flask应用

这样跳转的页面就会渲染出html的内容。

request对象

html文件

代码语言:html复制
<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <title>Title</title>

</head>

<body>

<form action="" method="post">  %定义为post方法

    <input type="text" name="name" placeholder="Name">

    <br>

    <input type="text" name="email" placeholder="Email">

    <br>

    <input type="text" name="phone" placeholder="Phone">

    <input type="submit" value="Submit">

</form>

</body>

</html>

python文件:

代码语言:python代码运行次数:0运行复制
# -\*- coding:utf-8 -\*-

# @author:Ye Zhoubing

# @datetime:2025/3/17 20:28

# @software: PyCharm

from flask import Flask,render\_template,request  # 导入渲染模板



app = Flask(\_\_name\_\_)

app.debug = True  # 开启调试模式,方便网页内容实时更新





# re中传入正则表达式 校验手机号格式是11位

@app.route("/index", methods=['GET', 'POST'])

def index():

    if request.method == 'POST':

        username = request.form.get('name')

        password = request.form.get('email')

        if username == 'test' and password == '123456':  # 判断name和email是否为指定值

            return '登录成功'

        else:

            return '登录失败'

    elif request.method == 'GET':

        return render\_template('index.html')





if \_\_name\_\_ == "\_\_main\_\_":

    app.run()  # 启动flask应用

输入test与123456,点击submit后会显示登录成功。

重定向

有时我们访问某个网站时,会发现网络状态码返回301或者302。此时已经触发重定向,一般就是当前网站网址发生了变化,重定向到了其他网址。其中301为永久重定向,302为临时重定向。具体区别及应用如下:

| 网络状态码 | 用途 |

| --- | --- |

| 301 | 常见于网站永久域名更换,对应浏览器监测到该状态码后,书签中的网址也会进行更新 |

| 302 | 临时重定向,常见于登录页面后,跳转到主页面 |

在flask中,想要实现重定向,分为以下两种:

跳转到指定页面

比如访问自己的网址,重定向到B站,代码如下:

代码语言:python代码运行次数:0运行复制
from flask import Flask,redirect # redirect重定向



app = Flask(\_\_name\_\_)

app.debug = True  # 开启调试模式,方便网页内容实时更新





# re中传入正则表达式 校验手机号格式是11位

@app.route("/index")

def index():

    # 重定向到B站

    return redirect(";)





if \_\_name\_\_ == "\_\_main\_\_":

    app.run()  # 启动flask应用

跳转到自定义页面

现在对原来的代码进行修改,要求访问index页面跳转到自己设计的index2页面(对应方法是hello)。代码如下:

代码语言:python代码运行次数:0运行复制
from flask import Flask,redirect # redirect重定向



app = Flask(\_\_name\_\_)

app.debug = True  # 开启调试模式,方便网页内容实时更新





# re中传入正则表达式 校验手机号格式是11位

@app.route("/index")

def index():

    # 重定向到hello页面

    return redirect("/index2")



@app.route("/index2")

def hello():

    return "hello world"



if \_\_name\_\_ == "\_\_main\_\_":

    app.run()  # 启动flask应用

上面这种就是类似第一种的跳转到指定页面,只是指定的页面换成了自己设计的。

还有第二种:

代码语言:python代码运行次数:0运行复制
from flask import Flask,redirect,url\_for # redirect重定向



app = Flask(\_\_name\_\_)

app.debug = True  # 开启调试模式,方便网页内容实时更新





# re中传入正则表达式 校验手机号格式是11位

@app.route("/index")

def index():

    # 重定向到hello页面

    return redirect(url\_for("hello"))



@app.route("/index2")

def hello():

    return "hello world"



if \_\_name\_\_ == "\_\_main\_\_":

    app.run()  # 启动flask应用

效果与上面的代码相同,但这个是通过跳转函数的方法(hello)。

返回json数据给前端

有以下两种方式:

jsonify()方法

代码语言:python代码运行次数:0运行复制
from flask import Flask,jsonify # jsonify将字典转换为json字符串



app = Flask(\_\_name\_\_)

app.debug = True  # 开启调试模式,方便网页内容实时更新





# re中传入正则表达式 校验手机号格式是11位

@app.route("/index")

def index():

    # 重定向到hello页面

    data = {

        "name": "张三",

        "age": 18

    }

    return jsonify(data)





if \_\_name\_\_ == "\_\_main\_\_":

    app.config['JSON\_AS\_ASCII'] = False  # 解决中文乱码问题

    app.run()  # 启动flask应用

需要勾选美观输出才正常,后面再勾不勾就无所谓了。

json.dumps()方法

代码语言:python代码运行次数:0运行复制
from flask import Flask,json,Response



app = Flask(\_\_name\_\_)

app.debug = True  # 开启调试模式,方便网页内容实时更新





# re中传入正则表达式 校验手机号格式是11位

@app.route("/index")

def index():

    # 重定向到hello页面

    data = {

        "name": "张三",

        "age": 18

    }

    return Response(json.dumps(data,ensure\_ascii=False), mimetype='application/json')





if \_\_name\_\_ == "\_\_main\_\_":

    app.run()  # 启动flask应用

这样没有上面那个第一次不显示中文的问题。

abort函数

错误处理,主动触发http错误,函数里面写网络状态码。例如以之前的index.html为例,如果输入的内容与自定义的内容不同,返回404页面,代码如下:

代码语言:python代码运行次数:0运行复制
from flask import Flask,render\_template,request,abort  # 导入渲染模板



app = Flask(\_\_name\_\_)

app.debug = True  # 开启调试模式,方便网页内容实时更新





# re中传入正则表达式 校验手机号格式是11位

@app.route("/index", methods=['GET', 'POST'])

def index():

    if request.method == 'POST':

        username = request.form.get('name')

        password = request.form.get('email')

        if username == 'test' and password == '123456':  # 判断name和email是否为指定值

            return '登录成功'

        else:

            return abort(404)

    elif request.method == 'GET':

        return render\_template('index.html')





if \_\_name\_\_ == "\_\_main\_\_":

    app.run()  # 启动flask应用

自定义异常

上述的abort返回的值,是指定的页面,如果想要返回自定义页面,可以按下面的写法:

代码语言:python代码运行次数:0运行复制
from flask import Flask,render\_template,request,abort  # 导入渲染模板



app = Flask(\_\_name\_\_)

app.debug = True  # 开启调试模式,方便网页内容实时更新





# re中传入正则表达式 校验手机号格式是11位

@app.route("/index", methods=['GET', 'POST'])

def index():

    if request.method == 'POST':

        username = request.form.get('name')

        password = request.form.get('email')

        if username == 'test' and password == '123456':  # 判断name和email是否为指定值

            return '登录成功'

        else:

            return abort(404)

    elif request.method == 'GET':

        return render\_template('index.html')



# 跳转到异常指定html文件

@app.errorhandler(404)

def page\_not\_found(error):

    return render\_template('404.html'), 404



if \_\_name\_\_ == "\_\_main\_\_":

    app.run()  # 启动flask应用

404.html文件内容如下:

代码语言:html复制
<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <title>Title</title>

</head>

<body>

<h1>404</h1>

</body>

</html>
注:图片等资源需要放在static文件夹中,还有css,js等文件都是保存再该文件夹中。

模板的使用

指的是jinja2模板,在html文件中,可以通过{{}}的方式在html显示变量。python代码如下:

代码语言:python代码运行次数:0运行复制
from flask import Flask,render\_template



app = Flask(\_\_name\_\_)

app.debug = True  # 开启调试模式,方便网页内容实时更新





# re中传入正则表达式 校验手机号格式是11位

@app.route("/index")

def index():

    # 重定向到hello页面

    data = {

        "name": "张三",

        "age": 18,

        "list": [1, 2, 3, 4, 5]

    }

    return render\_template('index2.html',data=data)





if \_\_name\_\_ == "\_\_main\_\_":

    app.run()  # 启动flask应用

index2.html内容如下:

代码语言:html复制
<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <title>Title</title>

</head>

<body>

<h1>test</h1>

数据为: {{ data }}  {#使用变量的方法{{  }}#}

<br>

名称为:{{ data['name'] }}  {#提取里面某个变量名#}

<br>

年龄为:{{ data.age }}  {#也可以用这种写法#}

<br>

列表第一个元素为:{{ data.list.0 }}  {#提取列表元素#}

<br>

列表第二个元素为:{{ data.list[1] }}  {#也可以用这种写法#}

<br>

列表第一个元素加上第二个元素为:{{ data.list[0] + data.list[1] }}  {#进行运算#}

</body>

</html>

过滤器

本质上是python函数,将变量进行处理后返回新的值。这里用的是jinja2的内置过滤器,参考文档,例如下面将hello world转换成大写

index2.html

代码语言:html复制
<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <title>Title</title>

</head>

<body>

<h1>test</h1>

数据为: {{ data }}  {#使用变量的方法{{  }}#}

<br>

名称为:{{ data['name'] }}  {#提取里面某个变量名#}

<br>

年龄为:{{ data.age }}  {#也可以用这种写法#}

<br>

列表第一个元素为:{{ data.list.0 }}  {#提取列表元素#}

<br>

列表第二个元素为:{{ data.list[1] }}  {#也可以用这种写法#}

<br>

列表第一个元素加上第二个元素为:{{ data.list[0] + data.list[1] }}  {#进行运算#}

<br>

{{ 'hello world' | upper }}  {#将字符串转换为大写#}

</body>

</html>

自定义字符串

比如我想取奇数位置的列表元素,但可能自带的过滤器无法满足我们的需求,此时就需要我们自定义过滤器了。

py文件如下:

代码语言:python代码运行次数:0运行复制
from flask import Flask,render\_template



app = Flask(\_\_name\_\_)

app.debug = True  # 开启调试模式,方便网页内容实时更新





# re中传入正则表达式 校验手机号格式是11位

@app.route("/index")

def index():

    # 重定向到hello页面

    data = {

        "name": "张三",

        "age": 18,

        "list": [1, 2, 3, 4, 5]

    }

    return render\_template('index2.html',data=data)



def list\_step(li):

    """

    自定义过滤器

    """

    return li[::2]  # 返回列表的奇数位元素



# 注册过滤器

app.add\_template\_filter(list\_step,'li2')  # 第一个参数是过滤器函数,第二个参数是过滤器名字



if \_\_name\_\_ == "\_\_main\_\_":

    app.run()  # 启动flask应用

index2.html文件如下:

代码语言:html复制
<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <title>Title</title>

</head>

<body>

<h1>test</h1>

数据为: {{ data }}  {#使用变量的方法{{  }}#}

<br>

名称为:{{ data['name'] }}  {#提取里面某个变量名#}

<br>

年龄为:{{ data.age }}  {#也可以用这种写法#}

<br>

列表第一个元素为:{{ data.list.0 }}  {#提取列表元素#}

<br>

列表第二个元素为:{{ data.list[1] }}  {#也可以用这种写法#}

<br>

列表第一个元素加上第二个元素为:{{ data.list[0] + data.list[1] }}  {#进行运算#}

<br>

{{ 'hello world' | upper }}  {#将字符串转换为大写#}

<br>

列表奇数位置元素为:{{ data.list | li2 }}  {#使用自定义过滤器提取奇数位置元素#}

</body>

</html>

flask表单

前面使用表单是在前端html文件中使用form标签,现在使用flask中自带的WTForms方法来实现form表单。

安装WTForms

首先需要安装flask-wtf,wtforms是里面一个扩展

代码语言:bash复制
 pip install flask-wtf 

具体py代码如下:

代码语言:python代码运行次数:0运行复制
# -\*- coding:utf-8 -\*-

# @author:Ye Zhoubing

# @datetime:2025/3/17 20:28

# @software: PyCharm

# flask表单

from flask import Flask,render\_template,request

from flask\_wtf import FlaskForm  # 导入flask表单类

from wtforms import Form,StringField,PasswordField,SubmitField  # 导入对应类型

from wtforms.validators import DataRequired, Length,EqualTo  # 导入验证器类型



app = Flask(\_\_name\_\_)

app.debug = True  # 开启调试模式,方便网页内容实时更新



app.config["SECRET\_KEY"] = "fjdkfkdjfdk"  # 设置一个密钥,用于加密,防止CSRF攻击,值是自己随意设置的



class LoginForm(FlaskForm):

    # message是验证失败时的提示信息

    username = StringField(label="用户名",validators=[DataRequired("用户名不能为空"),Length(6,12,message="用户名长度必须在6-12位")])  # 定义一个用户名字段

    password1 = PasswordField(label="密码",validators=[DataRequired("密码不能为空"),Length(6,12,message="密码长度必须在6-12位")])  # 定义一个密码字段

    password2 = PasswordField(label="请再次输入密码",validators=[DataRequired("密码不能为空"),Length(6,12,message="密码长度必须在6-12位"),EqualTo("password1","两次密码需要一致")])  # 定义第二个密码字段,要求第二个密码字段与第一个密码字段一致

    submit = SubmitField(label="提交")



# re中传入正则表达式 校验手机号格式是11位

@app.route("/index",methods=["GET","POST"])

def index():

    form\_data = LoginForm()

    if request.method == "GET":

        return render\_template("index3.html",form=form\_data)

    elif request.method == "POST":

        if form\_data.validate\_on\_submit():  # 验证表单是否满足验证条件,满足则通过

            print(request.form.get("username"))

            # print(form\_data.username.data)  # 也可以这么写

            print(request.form.get("password1"))

            print(request.form.get("password2"))

            return "注册成功"

        else:

            print("验证失败")

            # print(request.form.get("username"))

            print(form\_data.username.data)  # 也可以这么写

            # print(request.form.get("password1"))

            print(form\_data.password1.data)  # 也可以这么写

            # print(request.form.get("password2"))

            print(form\_data.password2.data)  # 也可以这么写

            return render\_template("index3.html", form=form\_data)





if \_\_name\_\_ == "\_\_main\_\_":

    app.run()  # 启动flask应用

index3.html文件

代码语言:html复制
<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <title>Title</title>

</head>

<body>

<form action="" method="post">  {#定义为post方法#}

    {{ form.username.label }}  {#显示表单的标签#}

    {{ form.username }}  {#显示表单的输入框#}

    <br>

    {{ form.password1.label }}  {#显示表单的标签#}

    {{ form.password1 }}  {#显示表单的输入框#}

    <br>

    {{ form.password2.label }}  {#显示表单的标签#}

    {{ form.password2 }}  {#显示表单的输入框#}

    <br>

    {{ form.csrf\_token }}  {#显示表单的csrf\_token#}

    {{ form.submit }}  {#显示表单的提交按钮#}

</form>

</body>

</html>

其中,获取数据除了之前用到的print(request.form.get("username")),也可以print(form\_data.username.data)

使用validate\_on\_submit()来验证是否满足验证器。

代码中对应的类型及解释如下:

| 字段类 | 功能 | 对应html表示 |

| --- | --- | --- |

| StringField | 文本字段 | <input type="text"> |

| PasswordField | 密码字段 | <input type="password"> |

| SubmitField | 提交按钮 | <input type="submit"> |

在示例中的label表示实例化的字段类,这个相当于html中的label标签。

wtforms.validators验证器类,用到的有以下两种:

| 验证器 | 功能 |

| --- | --- |

| EqualTo(filedname,message=None) | 验证两个字段是否相同 |

| LengthRange(min=-1,max=None,message=None) | 验证输入值长度是否在给定范围内 |

| DataRequired(message=None) | 验证数据是否有效 |

注:

一定要在html文件中加上{{ form.csrf\_token }},否则validate\_on\_submit()验证会一直不通过

参考博客

flask数据库

以下内容由于电脑未安装数据库,所以使用该网站在线数据库进行测试

相关信息如下:

代码语言:bash复制
!!!注意保密

数据库名称:flaskdb

数据库用户:anyiyzb

数据库密码:o7Yh9owL7L6GlCE1

数据库地址端口:mysql.sqlpub:3306

注册邮箱:3264937157@qq

falsk数据库连接

先安装以下内容库:

代码语言:bash复制
pip install flask-sqlalchemy

pip install flask-mysqldb  #如果flask-mysqldb安装不上,安装pymysql

pip install pymysql

pip install mysqlclient
注:安装mysqlclient很大概率会失败,建议去官网下载whl文件安装,点击不同版本的release history后,点击download files就能找到你需要的版本的whl包了。

flask可以连接mysql,sqllite等数据库。

代码语言:python代码运行次数:0运行复制
app.config['SQLALCHEMY\_DATABASE\_URI'] = 'mysql://anyiyzb:o7Yh9owL7L6GlCE1@mysql.sqlpub:3306/flaskdb'

app.config['SQLALCHEMY\_TRACK\_MODIFICATIONS'] = False

db = SQLAlchemy(app)  # 创建数据库对象

创建模型

在Flask-SQLAlchemy中,模型是数据库表的Python类,每个模型类代表数据库中的一张表。例如:

代码语言:python代码运行次数:0运行复制
class User(db.Model):

    \_\_tablename\_\_ = 'users'  # 表名为user

    id = db.Column(db.Integer, primary\_key=True)

    username = db.Column(db.String(80), unique=True, nullable=False)

    email = db.Column(db.String(120), unique=True, nullable=False)

 

    def \_\_repr\_\_(self):

        return f'<User {self.username}>'

这里定义了一个用户模型,对应数据库中的用户信息表,属性包括:id、用户名和email,对应的mysql表如下:

代码语言:python代码运行次数:0运行复制
CREATE TABLE `users` (

  `id` INT NOT NULL AUTO\_INCREMENT,

  `username` VARCHAR(80) NOT NULL,

  `email` VARCHAR(120) NOT NULL,

  PRIMARY KEY (`id`),

  UNIQUE INDEX `username\_unique` (`username` ASC),

  UNIQUE INDEX `email\_unique` (`email` ASC)

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4\_unicode\_ci;

代码示例:

代码语言:python代码运行次数:0运行复制
from flask import Flask,render\_template,request

from flask\_sqlalchemy import SQLAlchemy



app = Flask(\_\_name\_\_)

app.debug = True  # 开启调试模式,方便网页内容实时更新



# 配置数据库

app.config['SQLALCHEMY\_DATABASE\_URI'] = 'mysql://anyiyzb:o7Yh9owL7L6GlCE1@mysql.sqlpub:3306/flaskdb'

app.config['SQLALCHEMY\_TRACK\_MODIFICATIONS'] = False

db = SQLAlchemy(app)  # 创建数据库对象



# 定义模型类

class User(db.Model):

    \_\_tablename\_\_ = 'users'  # 定义users表名

    id = db.Column(db.Integer, primary\_key=True)

    username = db.Column(db.String(80), unique=True, nullable=False)

    email = db.Column(db.String(120), unique=True, nullable=False)





if \_\_name\_\_ == "\_\_main\_\_":

    with app.app\_context():

    # 操作的内容,需要在app上下文中执行,否则会报错

        db.drop\_all()  # 清除所有表

        db.create\_all()  # 创建所有表

        db.session.add(User(username='zhangsan',email='123@qq'))  # 添加数据

        db.session.add\_all([User(username='lisi',email='456@qq'),User(username='wangwu',email='123@163')])  # 一次添加多条数据

        db.sessionmit()  # 提交数据

数据库结果:

参考博客

flask数据库增删改查

代码语言:bash复制
User.query.all()  # 查询所有用户

 User.query.get(user\_id)  # 查询指定用户

对内容进行修改时吗,要记得`

db.sessionmit()`提交,这样才能对内容进行修改。

参考博客

pycharm创建Flask项目

flask让其他地址访问

flask运行的程序默认只能本机访问,如果需要让其他地址访问,需要在运行时加上--host=0.0.0.0

示例:

代码语言:python代码运行次数:0运行复制
if \_\_name\_\_ == '\_\_main\_\_':

    app.run(

        host='0.0.0.0',  # 允许外部访问

        port=5000,       # 指定端口号

        debug=True,      # 启用调试模式

        use\_reloader=True,  # 自动重载代码更改

        threaded=True    # 使用多线程处理请求

    )