Flask学习笔记

Flask是一个用Python编写的轻量级Web应用框架。它的设计目标是易于使用,同时保持开发人员的灵活性。Flask提供了路由、模板引擎和Wsgi支持等核心Web服务功能,同时还支持插件扩展,例如数据库交互、表单验证等。

flask 路由

request 请求参数

html模板

flask数据库

表单

flask特性:

轻量级:Flask是一个轻量级的Web服务程序。Flask路由:Flask使用装饰器来处理路由,使URL与Python函数建立对应关系。Request 请求参数:Flask通过request对象来处理客户端请求,我们可以利用它来获取请求参数。HTML模板:Flask使用Jinja2模板引擎,我们可以在HTML文件中插入动态数据。Flask数据库:Flask可以通过SQLAlchemy等扩展与数据库进行交互。表单:Flask通过WTForms库来处理表单,便于数据的验证和提交。

Flask “Hello World” 示例

下面是一个基本的 Flask “Hello World” 应用的代码示例:

from flask import Flask

#创建一个app对象

app = Flask(__name__)

#路由

@app.route('/')

def hello_world():

return 'Hello, World!'

if __name__ == '__main__':

app.run()

在这个示例中,我们首先从flask模块中导入了Flask类。然后,我们创建了一个Flask web服务器实例。@app.route('/')是一个装饰器,它告诉Flask哪些URL能触发我们的函数。在这种情况下,我们的函数返回了字符串"Hello, World!",这将作为网页的内容返回给用户。

路由

Flask路由是Flask框架处理URL的机制。在Flask中,我们使用装饰器@app.route()来定义路由。装饰器的参数是URL规则,它将URL与Python函数关联起来。当用户访问指定的URL时,关联的函数就会被执行,其返回值将作为HTTP回应发送给客户端。

例如,以下代码定义了一个基本的路由:

@app.route('/')

def home():

return 'Hello, World!'

在这个例子中,当用户访问应用的根URL(例如:http://localhost:5000/)时,home函数将被执行,并返回字符串"Hello, World!"。

除了根URL,你也可以定义其他的URL规则。例如,你可以创建一个名为greet的路由,当用户访问/greet/时,它返回一个问候消息:

@app.route('/greet/')

def greet(name):

return 'Hello, %s!' % name

在这个例子中,是一个变量,它将从URL中获取。所以,如果你访问http://localhost:5000/greet/John,它将返回Hello, John!。

请求方法

在 Flask 中,我们可以通过在路由装饰器中添加 methods 参数来指定 HTTP 请求方法。默认情况下,Flask 的路由只会响应 GET 请求,但我们可以通过 methods 参数来指定路由应该响应的 HTTP 方法,例如 GET、POST、PUT、DELETE 等。

HTTP协议中的GET和POST是两种基本的请求方法,主要区别在于数据传输的方式和用途不同。

数据传输方式:GET请求的数据会附加在URL之后(就是把数据放置在HTTP协议头中),以?分割URL和传输数据,多个参数用&连接。POST方法是把提交的数据放置在是HTTP包的包体中。数据大小:由于GET方法的数据是放在HTTP头中的,因此受到HTTP协议的限制,数据不能太大,一般不能大于2KB。POST方法没有限制,理论上数据的大小可以达到无限大。数据安全性:POST的数据因为在包体中,所以有一定的安全性。而GET将所有数据放在URL中,用户输入的数据都在URL中明文显示,所以安全性较低。用途:GET方法一般用于获取/查询资源信息,而POST方法一般用于更新资源信息。

以下是一个示例,展示了如何在 Flask 中处理 POST 请求:

@app.route('/login', methods=['POST'])

def login():

if request.method == 'POST':

user = request.form['username']

return 'Hello, %s!' % user

在这个示例中,我们首先定义了一个新的路由 ‘/login’,并通过 methods 参数指定这个路由只接受 POST 请求。然后在路由关联的函数中,我们检查了请求方法是否为 POST(尽管在这个例子中可能不需要,因为我们已经指定了这个路由只接受 POST 请求)。如果请求方法为 POST,我们就从表单数据中获取用户名,并返回一个问候消息。

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

def data():

if request.method == 'POST':

# POST请求通常用于提交表单数据

# 数据在请求体中,不会显示在URL中

data = request.form['data']

return 'Received the data: %s' % data

else:

# GET请求通常用于获取数据

# 请求的数据显示在URL中

return 'This is a GET request'

在这个例子中,/data路由可以同时处理GET和POST请求。如果请求方法是POST,我们从表单数据中获取数据,并返回接收到的数据。如果请求方法是GET(也就是说,不是POST),我们返回一个表示这是GET请求的消息。这个例子清楚地展示了POST和GET请求的主要区别:POST请求通常用于提交数据,数据在请求体中,不会显示在URL中;而GET请求通常用于获取数据,请求的数据显示在URL中。

路由变量规则

在 Flask 中,我们可以在路由规则中使用变量部分。特定部分的 URL 可以标记为 ,它将作为关键字参数传递到函数。例如,以下代码创建了一个名为 user 的路由变量:

@app.route('/user/')

def show_user_profile(username):

# 用户名将作为字符串传递给 show_user_profile

return 'User %s' % username

在这个例子中,当用户访问如 http://localhost:5000/user/John 的 URL 时,show_user_profile 函数将被调用,且其参数 username 的值将会是 John。

你也可以使用类型转换器在变量规则中指定变量的类型,例如 int、float、path 等。以下是一些例子:

int:接受整数

@app.route('/post/')

def show_post(post_id):

# post_id 将会是整数类型

return 'Post %d' % post_id

float:接受浮点数

@app.route('/price/')

def show_price(price):

# price 将会是浮点数类型

return 'Price: %f' % price

path:和默认的字符串类似,但也接受斜线

@app.route('/path/')

def show_subpath(subpath):

# subpath 将会是字符串类型,可以包含斜线

return 'Subpath %s' % subpath

这样,我们就可以在 Flask 中灵活地处理各种类型的 URL 了。

在Flask的路由变量规则中,string和path都可以接收字符串类型的变量。但是,两者的主要区别在于,string不能接收包含斜线(/)的字符串,而path可以。这意味着,如果你在URL中需要传递包含斜线的字符串,应当使用path类型。

自定义转换器

除了 Flask 提供的内建转换器,我们还可以自定义转换器,以满足特定的 URL 规则需求。

自定义转换器需要继承自 werkzeug.routing.BaseConverter 类,并实现至少两个方法:to_python 和 to_url。

to_python 方法用于将 URL 中的字符串转换为 Python 对象;to_url 方法用于将 Python 对象转换回字符串。

以下是一个自定义转换器的例子,它接受三个字母的字符串:

from werkzeug.routing import BaseConverter

class ThreeLetterConverter(BaseConverter):

def to_python(self, value):

if len(value) != 3:

raise ValueError('Must be three letters.')

return value

def to_url(self, value):

if len(value) != 3:

raise ValueError('Must be three letters.')

return value

app.url_map.converters['three'] = ThreeLetterConverter

在这个例子中,我们首先从 werkzeug.routing 导入了 BaseConverter 类,然后创建了一个新的转换器类 ThreeLetterConverter,该类继承自 BaseConverter。在 ThreeLetterConverter 类中,我们实现了 to_python 和 to_url 方法,这两个方法都要求输入的值必须是三个字母的字符串。

最后,我们将新的转换器添加到 Flask 应用的 URL 映射转换器字典中,键是转换器的名字(在这个例子中是 ‘three’),值是转换器类。

现在,我们就可以在路由规则中使用新的转换器了:

@app.route('/')

def three_letter_code(code):

return 'Three-letter code: %s' % code

在这个路由规则中, 表示 code 必须是一个三个字母的字符串。如果 code 不符合这个条件,Flask 将会返回一个 404 错误。

通过自定义转换器,我们可以更灵活地处理各种复杂的 URL 规则。

常用自定义转换器用法示例

自定义转换器可以满足更复杂的URL规则需求,比如我们需要处理的URL中包含了日期信息,格式为yyyy-mm-dd,我们就可以自定义一个日期转换器。

from werkzeug.routing import BaseConverter

from datetime import datetime

class DateConverter(BaseConverter):

def to_python(self, value):

return datetime.strptime(value, '%Y-%m-%d')

def to_url(self, value):

return value.strftime('%Y-%m-%d')

app.url_map.converters['date'] = DateConverter

在这个例子中,我们定义了一个名为DateConverter的转换器,该转换器将URL中的字符串转换为datetime对象,反过来,将datetime对象转换为字符串。然后,我们将这个转换器添加到Flask应用的URL映射转换器字典中。

现在,我们就可以在路由规则中使用这个新的转换器:

@app.route('/')

def start_date(start_date):

return 'Start date: %s' % start_date

在这个路由规则中,表示start_date必须是一个符合yyyy-mm-dd格式的日期字符串。如果start_date不符合这个条件,Flask将会返回一个404错误。使用这种方式,我们可以方便的处理URL中包含日期等复杂数据的情况。

网页渲染

Flask使用模板引擎来生成HTML,这个过程叫做网页渲染。Flask默认使用的模板引擎是Jinja2。

首先,我们需要在Flask应用的目录下创建一个名为templates的文件夹,在这个文件夹中,我们可以放置所有的HTML模板文件。

然后,我们可以使用render_template函数来渲染模板。render_template函数的第一个参数是模板的文件名(相对于templates文件夹的路径),后面的参数都是传递给模板的变量。

以下是一个例子:

from flask import Flask, render_template

app = Flask(__name__)

@app.route('/hello/')

def hello(name):

return render_template('hello.html', name=name)

在这个例子中,我们在/hello/路由中使用了render_template函数来渲染一个名为hello.html的模板,并向模板传递了一个名为name的变量。

在hello.html模板中,我们可以使用{{ name }}来获取并显示这个变量的值。例如:

Hello, {{ name }}!

在这个模板中,{{ name }}会被替换为传递给模板的name变量的值。

通过这种方式,我们可以动态地生成HTML页面,根据不同的数据显示不同的内容。

表单渲染

在 Flask 中,我们常常需要处理用户提交的表单数据。这通常包括两个步骤:渲染表单和处理表单数据。

首先,我们需要在模板中创建一个表单。例如,我们可以在 HTML 模板中创建一个简单的登录表单:

在这个表单中,我们有两个输入框分别用于输入用户名和密码,以及一个提交按钮。method="POST"表示这个表单会通过 POST 请求提交数据。

然后,我们可以在 Flask 路由中使用 request.form 来获取表单数据。例如:

@app.route('/login', methods=['POST'])

def login():

username = request.form['username']

password = request.form['password']

# 处理用户名和密码...

return '登录成功'

在这个路由中,我们首先通过 request.form 获取了用户名和密码,然后进行了一些处理(例如,验证用户名和密码是否正确),最后返回了一个消息。

除了手动创建表单和处理表单数据,我们也可以使用 Flask-WTF 扩展来简化这个过程。Flask-WTF 提供了一种简单的方式来处理表单数据和表单验证。

首先,我们需要定义一个表单类,这个类继承自 flask_wtf.FlaskForm,并定义了表单的字段:

from flask_wtf import FlaskForm

from wtforms import StringField, PasswordField, SubmitField

from wtforms.validators import DataRequired

class LoginForm(FlaskForm):

username = StringField('用户名', validators=[DataRequired()])

password = PasswordField('密码', validators=[DataRequired()])

submit = SubmitField('登录')

然后,我们可以在路由中创建一个表单实例,并使用 render_template 函数将表单渲染到模板中:

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

def login():

form = LoginForm()

if form.validate_on_submit():

username = form.username.data

password = form.password.data

# 处理用户名和密码...

return '登录成功'

return render_template('login.html', form=form)

最后,我们可以在模板中使用 form 变量来渲染表单:

{{ form.hidden_tag() }}

{{ form.username.label }} {{ form.username() }}

{{ form.password.label }} {{ form.password() }}

{{ form.submit() }}

在这个模板中,form.hidden_tag() 用于生成一个隐藏的 CSRF 令牌,这对于防止跨站请求伪造攻击是必要的。form.username.label 和 form.username() 分别用于生成用户名字段的标签和输入框,其他字段类似。

通过这种方式,我们可以更方便地处理表单数据和表单验证,而不需要手动处理每个表单字段。

POST请求页面渲染示例:

在Flask中,处理POST请求常见的场景是用户填写表单并提交数据,例如用户登录的场景。以下是一个用户登录的例子,包含了处理POST请求和页面渲染:

from flask import Flask, render_template, request

app = Flask(__name__)

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

def login():

if request.method == 'POST':

username = request.form['username']

password = request.form['password']

# 在此处处理用户名和密码,例如查看是否匹配、记录登录状态等

# ...

return render_template('welcome.html', username=username) # 渲染欢迎页面

else:

return render_template('login.html') # 渲染登录页面

在这个例子中,当用户首次访问登录页面时,因为是GET请求,所以会渲染并返回’login.html’页面。当用户填写完表单点击提交后,会发送POST请求,此时读取表单中的’username’和’password’,处理后再渲染并返回’welcome.html’页面。

GET请求页面渲染示例:

在Flask中,处理GET请求常见的场景是用户请求查看一些信息,例如用户查看个人资料的页面。以下是一个用户查看个人资料的例子:

from flask import Flask, render_template

app = Flask(__name__)

@app.route('/profile/', methods=['GET'])

def profile(username):

# 在此处获取用户资料,例如从数据库中获取

# ...

user_profile = get_user_profile(username) # 假设是一个获取用户资料的函数

return render_template('profile.html', profile=user_profile) # 渲染个人资料页面

在这个例子中,当用户访问个人资料页面时,例如’/profile/john’,会发送GET请求,服务器会根据用户名’john’获取相应的用户资料,然后渲染并返回’profile.html’页面,页面中会展示用户的资料。

后端代码示例:

from flask import Flask, render_template

app = Flask(__name__)

@app.route('/info/', methods=['GET'])

def info(id):

# 在此处获取页面信息,例如从数据库中获取

# ...

page_info = get_page_info(id) # 假设是一个获取页面信息的函数

return render_template('info.html', info=page_info) # 渲染页面信息

HTML代码示例:

页面信息

{{ info.title }}

{{ info.content }}

在这个HTML代码示例中,{{ info.title }}和{{ info.content }}会被替换为传递给模板的info对象的title和content属性的值。

前端HTML代码:

表单提交

后端Flask代码:

from flask import Flask, request

app = Flask(__name__)

@app.route('/submit', methods=['POST'])

def submit():

username = request.form['username']

password = request.form['password']

# 在此处处理用户名和密码,例如验证用户名和密码,记录登录状态等

# ...

return '表单提交成功,用户名:%s,密码:%s' % (username, password)

重定向

在 Flask 中,我们可以使用 redirect() 函数来重定向用户到另一个端点。redirect() 函数的参数是新的 URL。

重定向通常用于用户提交表单或执行操作后,让用户返回到另一个页面。例如,用户登录后,我们可以将用户重定向到主页。

以下是一个重定向的例子:

from flask import Flask, redirect, url_for

app = Flask(__name__)

@app.route('/')

def index():

return redirect(url_for('login'))

@app.route('/login')

def login():

return 'This is the login page.'

在这个例子中,当用户访问首页(‘/’)时,他们会被重定向到登录页面。

url_for() 函数用于生成一个 URL,它接受端点名称(函数名)作为参数。在这个例子中,url_for('login') 会生成 ‘/login’。

我们也可以给 url_for() 函数传递更多的参数来生成更复杂的 URL。例如,url_for('user', name='John') 会生成 ‘/user/John’。

重定向是一个非常有用的功能,我们可以用它来引导用户完成特定的工作流程,或者在用户完成某些操作后将他们引导到不同的页面。

url_for()函数用于生成URL,其参数是端点名称(通常是视图函数名)。我们可以使用这个函数生成URL,然后通过redirect()函数来重定向到这个URL。

例如,我们有一个名为profile的视图,该视图接受一个参数username:

@app.route('/user/')

def profile(username):

pass

我们可以使用url_for()函数生成这个视图的URL:

url_for('profile', username='John') # 输出:'/user/John'

然后,我们可以使用redirect()函数将用户重定向到这个URL:

from flask import redirect, url_for

@app.route('/login')

def login():

# 用户登录成功后,重定向到他们的个人资料页面

return redirect(url_for('profile', username='John'))

在这个例子中,当用户访问/login并成功登录后,他们会被重定向到/user/John。

我们还可以给url_for()函数传递更多的参数来生成更复杂的URL。这些参数将被转化为URL中的查询参数。例如:

url_for('search', q='flask tutorial') # 输出:'/search?q=flask+tutorial'

使用url_for()和redirect()函数,我们可以方便地在Flask应用中进行URL重定向。

make_response()函数在Flask中用于生成HTTP响应。您可以使用它来创建自定义的HTTP响应,包括设置HTTP头部信息、设置cookie等。

以下是一些make_response()的用法示例:

创建带有自定义状态码和头部信息的HTTP响应: from flask import Flask, make_response

app = Flask(__name__)

@app.route('/')

def index():

response = make_response('

This document carries a cookie!

')

response.set_cookie('answer', '42')

return response

在这个示例中,make_response()函数创建了一个新的HTTP响应,包含一个HTML文本。然后,我们使用set_cookie方法在响应中设置了一个cookie。 创建带有自定义状态码的HTTP响应: from flask import Flask, make_response

app = Flask(__name__)

@app.route('/')

def index():

response = make_response('

Resource not found!

', 404)

return response

在这个示例中,make_response()函数创建了一个新的HTTP响应,包含一个HTML文本和一个自定义的状态码404。

通过make_response()函数,我们可以灵活地创建各种自定义的HTTP响应。

在 Flask 中,我们可以使用 jsonify() 函数将字典或者列表转换为 JSON 格式,并返回给前端。以下是一个例子:

from flask import Flask, jsonify

app = Flask(__name__)

@app.route('/api/data')

def get_data():

data = {'name': 'John', 'age': 30, 'city': 'New York'}

return jsonify(data)

在这个例子中,我们定义了一个名为 /api/data 的 API 路由。当前端访问这个路由时,服务器会返回一个 JSON 数据。前端可以使用 AJAX 或者其他方法来获取并处理这个数据。

jsonify() 函数在内部使用了 json.dumps() 函数将 Python 对象转换为 JSON 格式。它还设置了 HTTP 响应的 MIME 类型为 application/json,这样前端就知道返回的数据是 JSON 格式。

注意:jsonify() 函数不能直接处理复杂的 Python 对象,例如自定义类的实例。如果你需要将这些对象转换为 JSON,你需要先将它们转换为可以序列化的基本数据类型,例如字典或者列表。

当然,以下是一个完整的 Flask 应用示例,它定义了一个 API 路由来返回 JSON 数据,并将 JSON_AS_ASCII 配置项设置为 False:

from flask import Flask, jsonify

app = Flask(__name__)

app.config['JSON_AS_ASCII'] = False # 设置 JSON_AS_ASCII 为 False

@app.route('/api/data')

def get_data():

data = {'name': '张三', 'age': 30, 'city': '北京'}

return jsonify(data)

if __name__ == '__main__':

app.run()

在这个例子中,我们定义了一个名为 /api/data 的 API 路由。当前端访问这个路由时,服务器会返回一个 JSON 数据。由于我们将 JSON_AS_ASCII 配置项设置为 False,所以返回的 JSON 数据中的非 ASCII 字符(例如中文字符)不会被转换为 Unicode 转义序列,从而避免了乱码问题。

前端可以使用 AJAX 或者其他方法来获取并处理这个数据。如果你的前端是 HTML 页面,你可以在 标签中添加以下元素来设置字符编码为 UTF-8,以确保前端正确地显示非 ASCII 字符:

获取 API 数据

在 Flask 中,我们可以使用 abort() 函数来中止一个请求并返回一个 HTTP 错误代码。例如,如果用户请求了不存在的页面,我们可以返回一个 404 错误。

以下是一个例子:

from flask import Flask, abort

app = Flask(__name__)

@app.route('/user/')

def get_user(id):

user = get_user_from_database(id) # 假设是一个从数据库获取用户的函数

if not user:

abort(404) # 如果用户不存在,返回 404 错误

return 'Hello, %s' % user.name

在这个例子中,当用户访问 /user/ 时,我们首先从数据库获取用户。如果用户不存在,我们使用 abort(404) 来中止请求并返回一个 404 错误。

abort() 函数也接受一个可选的第二个参数,这个参数是一个错误消息。如果提供了这个参数,它将会被添加到 HTTP 错误页面中。

除了 404 错误,还有许多其他的 HTTP 错误代码,例如 400(Bad Request),401(Unauthorized),403(Forbidden),500(Internal Server Error)等。我们可以根据需要使用 abort() 函数来返回这些错误。

注意:虽然 abort() 函数可以帮助我们方便地处理错误,但我们应该尽可能地避免在代码中直接硬编码 HTTP 错误代码。在大多数情况下,我们应该定义自己的错误处理函数或者错误处理器,来处理应用中可能发生的各种错误。

Flask通过使用Jinja2模板引擎,允许我们在HTML模板中使用后端的变量。我们可以通过传递变量到render_template函数来实现这一点。

例如,假设我们有一个名为greet.html的模板,我们想在其中使用一个名为username的变量:

Hello, {{ username }}!

在这个模板中,{{ username }}是一个模板变量,它会被Flask替换为传递给模板的实际username变量的值。

然后,我们可以在Flask路由中使用render_template函数来渲染这个模板,并传递username变量:

@app.route('/greet/')

def greet(username):

return render_template('greet.html', username=username)

在这个路由中,username参数是从URL中获取的,然后被传递给greet.html模板。因此,当我们访问像/greet/John这样的URL时,我们会看到一个显示"Hello, John!"的页面。

这就是Flask如何使用HTML模板,并在模板中使用后端的变量。

Jinja2模板引擎在Flask中提供了多种过滤器,可以用来修改和过滤模板变量。在模板中,我们可以使用管道符(|)来应用过滤器。

例如,{{ name|lower }}会将name变量的值转换为小写。{{ list|length }}会返回list变量的长度。{{ text|trim }}会去掉text变量的首尾空格。

我们也可以将多个过滤器链式使用。例如,{{ text|trim|lower }}会先去掉text变量的首尾空格,然后将结果转换为小写。

Jinja2提供了很多有用的过滤器,例如capitalize、round、escape等等。我们可以根据需要在模板中使用这些过滤器。

此外,我们还可以自定义过滤器。要定义一个过滤器,我们可以编写一个函数,然后通过app.template_filter()装饰器将这个函数注册为过滤器。例如:

@app.template_filter('reverse')

def reverse_filter(s):

return s[::-1]

在这个例子中,我们定义了一个名为reverse的过滤器,这个过滤器将字符串反转。然后,我们可以在模板中使用这个过滤器,例如{{ name|reverse }}。

例如,以下是一些Jinja2过滤器的使用例子:

safe:禁用自动转义。这可以用于输出HTML代码,例如: {{ html_content|safe }}

在这个例子中,html_content变量的值不会被转义,因此可以包含HTML标签。 capitalize:将字符串的第一个字符转换为大写,其他字符转换为小写。例如: {{ 'hello WORLD'|capitalize }}

length:返回一个字符串或者列表的长度。例如: {{ 'hello'|length }}

{{ [1, 2, 3]|length }}

round:将浮点数四舍五入到最接近的整数。也可以接受一个可选的参数来指定小数位数。例如: {{ 3.14159|round }}

{{ 3.14159|round(2) }}

trim:去掉字符串的首尾空格。例如: {{ ' hello world '|trim }}

list:将一个字符串转换为字符列表。例如: {{ 'hello'|list }}

以上只是Jinja2过滤器的一部分,还有许多其他的过滤器,例如upper、lower、title、escape等等。您可以根据需要使用这些过滤器来处理模板变量。

在 Flask 中,我们经常需要与数据库进行交互。无论是从数据库中读取数据,还是将数据保存到数据库中,我们都可以使用 Flask-SQLAlchemy 扩展来简化这个过程。

首先,我们需要创建一个 SQLAlchemy 实例:

from flask import Flask

from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)

app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:tmp/test.db' # SQLite 数据库文件路径

db = SQLAlchemy(app)

数据库文件路径应按照以下格式填写:

对于 SQLite,格式为:'sqlite:absolute/path/to/database'。例如,如果你的数据库文件名为 mydb.db 并且位于 /tmp 目录下,那么你应该填写 'sqlite:tmp/mydb.db'。对于 MySQL,格式为:'mysql://username:password@localhost/db_name'。其中,username 和 password 是你的 MySQL 用户名和密码,db_name 是数据库名。对于 PostgreSQL,格式为:'postgresql://username:password@localhost/db_name'。其中,username 和 password 是你的 PostgreSQL 用户名和密码,db_name 是数据库名。

注意,以上路径中的 localhost 表示数据库服务器在本地机器上,如果数据库服务器在其他机器上,你需要将其替换为相应的 IP 地址或主机名。

SQLite 和 MySQL 是两种非常流行的开源数据库系统,都被广泛应用于网站和应用的开发。下面是它们的一些主要差异和特色:

SQLite 是一个无服务器的数据库,它将整个数据库(包括数据、表结构和索引等)存储在一个单独的文件中,非常适合于小型应用,如桌面应用和小型网站。而 MySQL 是一个完整的数据库管理系统,适合于大型应用和高并发的网站。SQLite 的安装和配置非常简单,只需要一个库文件即可运行。而 MySQL 的安装和配置需要更多的步骤和知识。SQLite 支持的 SQL 功能较少,例如它不支持存储过程和视图。而 MySQL 支持更多的 SQL 功能和标准。SQLite 在并发写入时的性能较差,因为它使用文件级的锁来控制并发。而 MySQL 使用更复杂的锁机制,可以支持更高的并发写入。SQLite 的内存占用非常小,适合于资源受限的环境。而 MySQL 的内存占用较大,但它提供了更多的缓存和优化选项。SQLite 对于嵌入式应用和移动应用非常友好,因为它不需要一个单独的数据库服务器。而 MySQL 通常需要一个单独的数据库服务器,但它可以在网络上提供服务,支持远程访问。

SQLAlchemy是Python编程语言的一个开源项目,提供了一整套高效且高度灵活的数据库抽象层表达式,包括关系对象映射(ORM)和SQL操作。它为应用程序员提供了全面的工具,以在简单和复杂场景中进行有效的SQL操作。SQLAlchemy的主要目标是实现宽松的SQL数据库的完全抽象化,而且它在此过程中几乎不牺牲性能。

然后,我们可以定义一个模型类来表示数据库中的表:

class User(db.Model):

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 '' % self.username

在这个模型类中,我们定义了三个字段:id、username和email。id字段是主键,每个用户都有一个唯一的id。username和email字段都是字符串类型,并且不允许为空。

然后,我们可以使用这个模型类来操作数据库。例如,我们可以创建一个新的用户并将其保存到数据库中:

user = User(username='John', email='john@example.com')

db.session.add(user)

db.session.commit()

我们也可以从数据库中查询用户:

user = User.query.filter_by(username='John').first()

Flask-SQLAlchemy 提供了丰富的功能来操作数据库,包括基本的 CRUD 操作、事务管理、模型关系等。通过使用 Flask-SQLAlchemy,我们可以大大简化数据库操作的代码,使其更易于理解和维护。

推荐链接

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。