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。
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>
中不要有空格。
类似的转换的类型还有float
,string
。需要注意的是string
中不能包括/
,float
与int
都需正数。路由中的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表单
首先在当前项目下创建一个templates
python 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代码如下:
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 # 使用多线程处理请求
)
发布评论