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/<name>
时,它返回一个问候消息:
@app.route('/greet/<name>')
def greet(name):
return 'Hello, %s!' % name
在这个例子中,<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 可以标记为 <variable_name>,它将作为关键字参数传递到函数。例如,以下代码创建了一个名为 user
的路由变量:
@app.route('/user/<username>')
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/<int:post_id>')
def show_post(post_id):
# post_id 将会是整数类型
return 'Post %d' % post_id
float
:接受浮点数
@app.route('/price/<float:price>')
def show_price(price):
# price 将会是浮点数类型
return 'Price: %f' % price
path
:和默认的字符串类似,但也接受斜线
@app.route('/path/<path:subpath>')
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('/<three:code>')
def three_letter_code(code):
return 'Three-letter code: %s' % code
在这个路由规则中,<three: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('/<date:start_date>')
def start_date(start_date):
return 'Start date: %s' % start_date
在这个路由规则中,<date: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/<name>')
def hello(name):
return render_template('hello.html', name=name)
在这个例子中,我们在/hello/<name>
路由中使用了render_template
函数来渲染一个名为hello.html
的模板,并向模板传递了一个名为name
的变量。
在hello.html
模板中,我们可以使用{{ name }}
来获取并显示这个变量的值。例如:
<!DOCTYPE html>
<html>
<body>
<h1>Hello, {{ name }}!</h1>
</body>
</html>
在这个模板中,{{ name }}
会被替换为传递给模板的name
变量的值。
通过这种方式,我们可以动态地生成HTML页面,根据不同的数据显示不同的内容。
表单渲染
在 Flask 中,我们常常需要处理用户提交的表单数据。这通常包括两个步骤:渲染表单和处理表单数据。
首先,我们需要在模板中创建一个表单。例如,我们可以在 HTML 模板中创建一个简单的登录表单:
<form method="POST">
<label for="username">用户名:</label>
<input type="text" id="username" name="username">
<label for="password">密码:</label>
<input type="password" id="password" name="password">
<input type="submit" value="登录">
</form>
在这个表单中,我们有两个输入框分别用于输入用户名和密码,以及一个提交按钮。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 method="POST">
{{ form.hidden_tag() }}
{{ form.username.label }} {{ form.username() }}
{{ form.password.label }} {{ form.password() }}
{{ form.submit() }}
</form>
在这个模板中,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/<username>', 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/<id>', methods=['GET'])
def info(id):
# 在此处获取页面信息,例如从数据库中获取
# ...
page_info = get_page_info(id) # 假设是一个获取页面信息的函数
return render_template('info.html', info=page_info) # 渲染页面信息
HTML代码示例:
<!DOCTYPE html>
<html>
<head>
<title>页面信息</title>
</head>
<body>
<h1>{{ info.title }}</h1>
<p>{{ info.content }}</p>
</body>
</html>
在这个HTML代码示例中,{{ info.title }}
和{{ info.content }}
会被替换为传递给模板的info
对象的title
和content
属性的值。
前端HTML代码:
<!DOCTYPE html>
<html>
<head>
<title>表单提交</title>
</head>
<body>
<form action="/submit" method="POST">
<label for="username">用户名:</label>
<input type="text" id="username" name="username">
<label for="password">密码:</label>
<input type="password" id="password" name="password">
<input type="submit" value="提交">
</form>
</body>
</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/<username>')
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('<h1>This document carries a cookie!</h1>') 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('<h1>Resource not found!</h1>', 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 页面,你可以在 <head>
标签中添加以下元素来设置字符编码为 UTF-8,以确保前端正确地显示非 ASCII 字符:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>获取 API 数据</title>
</head>
<body>
<!-- 在此处使用 AJAX 或者其他方法来获取和显示 API 数据 -->
</body>
</html>
在 Flask 中,我们可以使用 abort()
函数来中止一个请求并返回一个 HTTP 错误代码。例如,如果用户请求了不存在的页面,我们可以返回一个 404 错误。
以下是一个例子:
from flask import Flask, abort
app = Flask(__name__)
@app.route('/user/<id>')
def get_user(id):
user = get_user_from_database(id) # 假设是一个从数据库获取用户的函数
if not user:
abort(404) # 如果用户不存在,返回 404 错误
return 'Hello, %s' % user.name
在这个例子中,当用户访问 /user/<id>
时,我们首先从数据库获取用户。如果用户不存在,我们使用 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
的变量:
<!DOCTYPE html>
<html>
<body>
<h1>Hello, {{ username }}!</h1>
</body>
</html>
在这个模板中,{{ username }}
是一个模板变量,它会被Flask替换为传递给模板的实际username
变量的值。
然后,我们可以在Flask路由中使用render_template
函数来渲染这个模板,并传递username
变量:
@app.route('/greet/<username>')
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 }} <!-- 输出:'Hello world' -->
-
length
:返回一个字符串或者列表的长度。例如:{{ 'hello'|length }} <!-- 输出:5 --> {{ [1, 2, 3]|length }} <!-- 输出:3 -->
-
round
:将浮点数四舍五入到最接近的整数。也可以接受一个可选的参数来指定小数位数。例如:{{ 3.14159|round }} <!-- 输出:3 --> {{ 3.14159|round(2) }} <!-- 输出:3.14 -->
-
trim
:去掉字符串的首尾空格。例如:{{ ' hello world '|trim }} <!-- 输出:'hello world' -->
-
list
:将一个字符串转换为字符列表。例如:{{ 'hello'|list }} <!-- 输出:['h', 'e', 'l', 'l', 'o'] -->
以上只是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 '<User %r>' % 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,我们可以大大简化数据库操作的代码,使其更易于理解和维护。