使用阿里云镜像仓库安装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
蓝图中定义的路由了。