Flask学习笔记

Flask学习笔记

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

flask 路由

request 请求参数

html模板

flask数据库

表单

flask特性:

  1. 轻量级:Flask是一个轻量级的Web服务程序。
  2. Flask路由:Flask使用装饰器来处理路由,使URL与Python函数建立对应关系。
  3. Request 请求参数:Flask通过request对象来处理客户端请求,我们可以利用它来获取请求参数。
  4. HTML模板:Flask使用Jinja2模板引擎,我们可以在HTML文件中插入动态数据。
  5. Flask数据库:Flask可以通过SQLAlchemy等扩展与数据库进行交互。
  6. 表单: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是两种基本的请求方法,主要区别在于数据传输的方式和用途不同。

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

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

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

自定义转换器

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

自定义转换器需要继承自 werkzeug.routing.BaseConverter 类,并实现至少两个方法:to_pythonto_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_pythonto_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.labelform.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对象的titlecontent属性的值。

前端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()的用法示例:

  1. 创建带有自定义状态码和头部信息的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。

  2. 创建带有自定义状态码的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提供了很多有用的过滤器,例如capitalizeroundescape等等。我们可以根据需要在模板中使用这些过滤器。

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

@app.template_filter('reverse')
def reverse_filter(s):
    return s[::-1]

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

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

  1. safe:禁用自动转义。这可以用于输出HTML代码,例如:

    {{ html_content|safe }}
    
    

    在这个例子中,html_content变量的值不会被转义,因此可以包含HTML标签。

  2. capitalize:将字符串的第一个字符转换为大写,其他字符转换为小写。例如:

    {{ 'hello WORLD'|capitalize }}  <!-- 输出:'Hello world' -->
    
    
  3. length:返回一个字符串或者列表的长度。例如:

    {{ 'hello'|length }}  <!-- 输出:5 -->
    {{ [1, 2, 3]|length }}  <!-- 输出:3 -->
    
    
  4. round:将浮点数四舍五入到最接近的整数。也可以接受一个可选的参数来指定小数位数。例如:

    {{ 3.14159|round }}  <!-- 输出:3 -->
    {{ 3.14159|round(2) }}  <!-- 输出:3.14 -->
    
    
  5. trim:去掉字符串的首尾空格。例如:

    {{ '   hello world   '|trim }}  <!-- 输出:'hello world' -->
    
    
  6. list:将一个字符串转换为字符列表。例如:

    {{ 'hello'|list }}  <!-- 输出:['h', 'e', 'l', 'l', 'o'] -->
    
    

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

在 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)

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

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

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

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

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

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

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

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,我们可以大大简化数据库操作的代码,使其更易于理解和维护。

  • 13
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值