使用阿里云镜像仓库安装flask

pip install flask -i "http://mirrors.aliyun.com/pypi/simple" --trusted-host "mirrors.aliyun.com"

创建一个flask项目

from flask import Flask

#实例化一个Flask对象
app = Flask(__name__)

#路由
@app.route('/')
def hello_world():
    return 'Hello Flask!'

if __name__ == '__main__':
    #debug=True 开启Debug模式
    #port=7000	设置端口号
    #host='0.0.0.0' 监听所有网卡请求
    app.run(debug=True,port=7000,host='0.0.0.0')

使用Bootstrap样式

#安装bootstrap-flask
pip install bootstrap-flask
from flask_bootstrap import Bootstrap5

#实例化一个Bootstrap5对象并关联flask
bootstrap = Bootstrap5(app=app)

#本地加载bootstrap,默认使用CDN加载bootstrap
app.config['BOOTSTRAP_SERVE_LOCAL'] = True

#在base.html中导入bootstrap
{{ bootstrap.load_css() }}
{{ bootstrap.load_js() }}

响应类型

#返回字符串,可以包含html标签
@app.route('/')
def hello_world():
    return '<h1>Hello Flask!<h1/>'
    
#返回html页面
from flask import render_template
@app.route('/')
def hello_world():
    return render_template('index.html')
    
#返回json
from flask import jsonify
@app.route('/')
def hello_world():
	data = {'text':'Hello!'}
    return jsonify(data)

#返回文件
from flask import send_file
@app.route('/')
def hello_world():
    return send_file('filename')

接收参数

#path传参
@app.route('/data/<name>')
def hello_world(name):
    return 'hello'+name

#get传参
from flask import request
#url = 127.0.0.1/?name=mek&aeg=10
@app.route('/')
def hello_world():
    name = request.args.get('name')
    aeg = request.args.get('aeg')
    return name+aeg

#post传参
from flask import request
@app.route('/', methods=['GET', 'POST'])
def hello_world():
    if request.method == 'POST':
        name = request.from.get('name')
        passwd = request.from.get('passwd')
        return name                          

模板传参

from flask import render_template
@app.route('/')
def hello_world():
    return render_template('index.html', name='Mek')
    
#index.html
#继承父模板
{% extends 'Base.html' %}
#使用对象
{{ name }}

#遍历
{% for i in name %}
{{ i }}
{% endfor %}

#if判断
{% if name == 'Mek' %}
<h1>OK<h1/>
{% endif %}

#调用对象属性
{{ name.aeg }}

钩子函数

#请求前需要做什么操作
@app.before_request
def before_request():
    database.connect()

#请求完成后需要做什么操作
@app.after_request
def after_request(response):
    database.close()
    return response

使用Cookie

设置Cookie

在 Flask 中,您可以使用 set_cookie() 方法来设置 cookie。这个方法接受几个参数:

response.set_cookie(key, value='', max_age=None, expires=None, path='/', domain=None, secure=None, httponly=False, samesite=None)

下面是每个参数的含义:

  • key:cookie 的名称。
  • value:cookie 的值。
  • max_age:cookie 的最大年龄(以秒为单位)。
  • expires:cookie 过期的日期和时间(datetime 对象)。
  • path:cookie 的可用路径。
  • domain:cookie 的域名。
  • secure:如果为 True,则仅在 SSL/TLS 连接上发送 cookie。
  • httponly:如果为 True,则通过浏览器脚本无法访问 cookie。
  • samesite:指定 cookie 是否应该只在同一站点请求中发送。

以下是一个示例代码,展示如何在 Flask 中设置 cookie:

from flask import Flask, make_response

app = Flask(__name__)

@app.route('/')
def index():
    resp = make_response('Setting a cookie')
    resp.set_cookie('my_cookie', 'my_value')
    return resp

if __name__ == '__main__':
    app.run()

在这个示例中,我们定义了一个路由 /,它返回一个响应。我们使用 make_response() 函数创建响应对象,并使用 set_cookie() 方法设置了一个名为 my_cookie 的 cookie,它的值为 my_value

删除Cookie

在 Flask 中,您可以使用 delete_cookie() 方法来删除 cookie。这个方法接受一个参数:

response.delete_cookie(key, path='/', domain=None)

以下是每个参数的含义:

  • key:要删除的 cookie 的名称。
  • path:cookie 的可用路径。
  • domain:cookie 的域名。

以下是一个示例代码,展示如何在 Flask 中删除 cookie:

from flask import Flask, make_response

app = Flask(__name__)

@app.route('/')
def index():
    resp = make_response('Deleting a cookie')
    resp.delete_cookie('my_cookie')
    return resp

if __name__ == '__main__':
    app.run()

在这个示例中,我们定义了一个路由 /,它返回一个响应。我们使用 make_response() 函数创建响应对象,并使用 delete_cookie() 方法删除名为 my_cookie 的 cookie。

上下文全局变量

在 Flask 中,g 是一个应用上下文全局变量。它允许您在整个请求处理过程中共享数据。

当您设置 g 变量时,它会存储在应用上下文中,这意味着该变量在整个请求期间都是可用的,并且只能由当前请求的线程访问。如果您在同一请求中多次访问 g 变量,则将使用相同的对象(即 g 变量的生命周期与请求的生命周期相同)。

以下是一个示例代码,展示如何在 Flask 中使用 g

from flask import Flask, g

app = Flask(__name__)

@app.before_request
def before_request():
    g.my_data = 'Hello, World!'

@app.route('/')
def index():
    return g.my_data

if __name__ == '__main__':
    app.run()

在这个示例中,我们定义了一个 before_request 钩子函数,在每个请求之前都会调用它。在这个函数中,我们将一个字符串 'Hello, World!' 存储在 g.my_data 中。然后,我们定义了一个路由 /,它返回了 g.my_data 的值。当请求到达 / 路由时,Flask 将从 g 中获取 my_data 变量的值,并将其作为响应发送回客户端。

请注意,如果您使用多个线程或进程处理请求,则不能将 g 变量用作跨线程/进程共享数据的方法。

模板过滤器

在 Flask 中,您可以使用模板过滤器来对模板中的变量进行格式化或转换。模板过滤器是在变量后面使用 | 符号和过滤器名称组成的表达式。

以下是一个示例代码,展示如何在 Flask 中使用内置的模板过滤器:

<!DOCTYPE html>
<html>
<head>
    <title>{{ title }}</title>
</head>
<body>
    <h1>Hello, {{ name|capitalize }}!</h1>
    <p>Your age is {{ age|default(18) }}.</p>
    <ul>
        {% for item in items %}
            <li>{{ item|title }}</li>
        {% endfor %}
    </ul>
</body>
</html>

在这个示例中,我们定义了一个名为 title.html 的模板。它包含三个使用内置过滤器的变量:

  • name|capitalize:将 name 变量的值首字母大写。
  • age|default(18):如果 age 变量不存在,则使用默认值 18
  • item|title:将 item 变量的每个单词的首字母都大写。

除了内置过滤器之外,您还可以编写自己的模板过滤器。要创建自定义过滤器,请使用 app.template_filter() 装饰器,并将函数添加到应用程序的模板环境中。

以下是一个示例代码,展示如何在 Flask 中定义自定义模板过滤器:

from flask import Flask

app = Flask(__name__)

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

if __name__ == '__main__':
    app.run()

在这个示例中,我们定义了一个名为 reverse_filter 的函数,并使用 @app.template_filter() 装饰器将其注册为名为 reverse 的模板过滤器。该函数接受一个字符串参数 s,并返回该字符串的反转版本。

现在,在模板中,您可以使用 reverse 过滤器来反转字符串:

Copy Code<h1>{{ name|reverse }}</h1>
内置模板

在 Flask 中,有许多内置的模板过滤器可用于格式化和转换变量。以下是一些常用的内置模板过滤器及其用法:

  • capitalize:将字符串的第一个字符大写。
  • lower:将字符串转换为小写。
  • upper:将字符串转换为大写。
  • title:将字符串中每个单词的首字母大写。
  • safe:标记变量为“安全”,防止 Jinja2 将其转义。
  • escape:对变量进行 HTML 转义。
  • truncate:截断字符串到指定长度,并添加一个省略号替换被截断的部分。
  • length:返回列表、字典或字符串的长度。
  • default:如果变量不存在,则使用默认值。
  • join:将列表中的元素连接成单个字符串。
  • replace:将字符串中的所有出现的子字符串替换为另一个子字符串。

以下是一个示例代码,展示如何在 Flask 中使用内置过滤器:

<!DOCTYPE html>
<html>
<head>
    <title>{{ title }}</title>
</head>
<body>
    <h1>Hello, {{ name|capitalize }}!</h1>
    <p>Your age is {{ age|default(18) }}.</p>
    <ul>
        {% for item in items %}
            <li>{{ item|title }}</li>
        {% endfor %}
    </ul>
</body>
</html>

在这个示例中,我们使用了三个内置的过滤器来格式化变量:

  • name|capitalize:将 name 变量的值首字母大写。
  • age|default(18):如果 age 变量不存在,则使用默认值 18
  • item|title:将 item 变量的每个单词的首字母都大写。

您可以在 Flask 的官方文档中找到完整的模板过滤器列表和详细说明:https://flask.palletsprojects.com/en/2.1.x/templating/#standard-filters

重定向

在 Flask 中,您可以使用 redirect() 函数将请求重定向到另一个 URL。

以下是一个示例代码,展示如何在 Flask 中使用 redirect()

from flask import Flask, redirect, url_for

app = Flask(__name__)

@app.route('/')
def index():
    return 'This is the home page.'

@app.route('/about')
def about():
    return 'This is the about page.'

@app.route('/redirect')
def do_redirect():
    return redirect(url_for('about'))

if __name__ == '__main__':
    app.run()

在这个示例中,我们定义了三个路由://about/redirect。当用户访问根路径 / 时,它将返回字符串 'This is the home page.'。当用户访问路径 /about 时,它将返回字符串 'This is the about page.'

当用户访问路径 /redirect 时,它将调用 do_redirect() 函数,并将其重定向到路由名为 about 的 URL(即 /about)。我们使用 url_for() 函数来生成 URL,这样我们就不需要硬编码 URL。

请注意,如果您希望重定向到外部网站而不是内部路由,则可以直接传递完整的 URL 给 redirect() 函数。例如:

return redirect('https://www.example.com')

蓝图

在 Flask 中,蓝图(Blueprint)是一种组织视图和其他相关代码的方式。它允许您将应用程序分解为可重用、可扩展的组件,并使其易于管理和维护。

以下是一个示例代码,展示如何在 Flask 中使用蓝图:

from flask import Blueprint, render_template

bp = Blueprint('example', __name__)

@bp.route('/')
def index():
    return 'This is the example home page.'

@bp.route('/about')
def about():
    return 'This is the example about page.'

@bp.route('/hello/<name>')
def hello(name):
    return render_template('hello.html', name=name)

app = Flask(__name__)
app.register_blueprint(bp, url_prefix='/example')

if __name__ == '__main__':
    app.run()

在这个示例中,我们定义了一个名为 example 的蓝图,并将其注册到应用程序中。蓝图包含三个路由://about/hello/

当用户访问路径 / 时,它将调用 index() 函数并返回字符串 'This is the example home page.'。当用户访问路径 /about 时,它将调用 about() 函数并返回字符串 'This is the example about page.'。当用户访问路径 /hello/ 时,它将调用 hello() 函数,并使用模板 hello.html 渲染页面,将参数 name 传递给模板。

注意,我们将蓝图的 URL 前缀设置为 /example,这意味着所有与 example 蓝图相关的路由都将带有此前缀。

要使用蓝图,请在应用程序中调用 register_blueprint() 方法,并传递需要注册的蓝图对象和 URL 前缀。在本例中,我们使用以下代码将 example 蓝图注册到应用程序中:

app.register_blueprint(bp, url_prefix='/example')

现在,我们可以通过访问路径 /example//example/about/example/hello/ 来访问 example 蓝图中定义的路由了。