当前位置: 首页 > news >正文

flask基础配置详情

前言

一个简单的应用

app = Flask(__name__)
@app.route("/")
def hello_world():return "<p>Hello,World!"

运行Flask应用

#flask命令运行flask --app hello run#使用Python命令进行运行python -m flask # 作为一个捷径,如果文件名为 app.py 或者 wsgi.py ,那么您不 需要使用 --app 。

如何使外部网络IP可以被监听

flask run --host=0.0.0.0

开启调试模式

flask --app hello run --debug

flask run 命令不只可以启动开发服务器。如果您打开调试模式,那么服 务器会在修改应用代码之后自动重启,并且当请求过程中发生错误时还会在浏 览器中提供一个交互调试器。

调试器允许执行来自浏览器的任意 Python 代码。虽然它由一个 pin 保护, 但仍然存在巨大安全风险。不要在生产环境中运行开发服务器或调试器。

HTML 转义

当返回 HTML ( Flask 中的默认响应类型)时,为了防止注入攻击,所有用户 提供的值在输出渲染前必须被转义。使用 Jinja 渲染的 HTML 模板会自动执行此操作。

# 代码现在长这样from flask import Flask
from markupsafe import escapeapp = Flask(__name__)
@app.route("/")
def hello_world():return "<p>Hello,World!"@app.route("/<name>")
def hello(name):return f"Hello, {escape(name)}!"

路由

现代 web 应用都使用有意义的 URL ,这样有助于用户记忆,网页会更得到用 户的青睐,提高回头率。

使用 route() 装饰器来把函数绑定到 URL:

@app.route('/')
def index():return 'Index Page'@app.route('/hello')
def hello():return 'Hello, World'

但是能做的不仅仅是这些!您可以动态变化 URL 的某些部分, 还可以为一个函数指定多个规则。

变量规则

通过把 URL 的一部分标记为 <variable_name> 就可以在 URL 中添加变量。 标记的部分会作为关键字参数传递给函数。通过使用 <converter:variable_name> ,可以选择性的加上一个转换器,为变量指 定规则。请看下面的例子:

# 你现在的代码长这样from flask import Flask
from markupsafe import escapeapp = Flask(__name__)
@app.route("/")
def hello_world():return "<p>Hello,World!"@app.route("/<name>")
def hello(name):return f"Hello, {escape(name)}!"@app.route('/user/<username>')
def show_user_profile(username):# show the user profile for that userreturn f'User {escape(username)}'@app.route('/post/<int:post_id>')
def show_post(post_id):# show the post with the given id, the id is an integerreturn f'Post {post_id}'@app.route('/path/<path:subpath>')
def show_subpath(subpath):# show the subpath after /path/return f'Subpath {escape(subpath)}'

转换器类型:

string

(缺省值) 接受任何不包含斜杠的文本

int

接受正整数

float

接受正浮点数

path

类似 string ,但可以包含斜杠

uuid

接受 UUID 字符串

唯一的 URL / 重定向行为

以下两条规则的不同之处在于是否使用尾部的斜杠。:

@app.route('/projects/')
def projects():return 'The project page'@app.route('/about')
def about():return 'The about page'

projects 的 URL 是中规中矩的,尾部有一个斜杠,看起来就如同一个文 件夹。访问一个没有斜杠结尾的 URL ( /projects )时 Flask 会自动进 行重定向,帮您在尾部加上一个斜杠( /projects/ )。

about 的 URL 没有尾部斜杠,因此其行为表现与一个文件类似。如果访问 这个 URL 时添加了尾部斜杠( /about/ )就会得到一个 404 “未找到” 错误。这样可以保持 URL 唯一,并有助于搜索引擎重复索引同一 页面。

URL 构建

url_for() 函数用于构建指定函数的 URL。它把函数名称作为第 一个参数。它可以接受任意个关键字参数,每个关键字参数对应 URL 中的变量。 未知变量将添加到 URL 中作为查询参数。

为什么不在把 URL 写死在模板中,而要使用反转函数 url_for() 动态构建?

  1. 反转通常比硬编码 URL 的描述性更好。

  2. 您可以只在一个地方改变 URL ,而不用到处乱找。

  3. URL 创建会为您处理特殊字符的转义,比较直观。

  4. 生产的路径总是绝对路径,可以避免相对路径产生副作用。

  5. 如果您的应用是放在 URL 根路径之外的地方(如在 /myapplication 中,不在 / 中), url_for() 会为您妥善处理。

例如,这里我们使用 test_request_context() 方法来尝 试使用 url_for() 。 test_request_context() 告诉 Flask 正在处理一个请求, 而实际上也许我们正处在交互 Python shell 之中,并没有真正的请求。参见 本地环境 。

from flask import url_forapp = Flask(__name__)@app.route('/')
def index():return 'index'@app.route('/login')
def login():return 'login'@app.route('/user/<username>')
def profile(username):return f'{username}\'s profile'with app.test_request_context():print(url_for('index'))print(url_for('login'))print(url_for('login', next='/'))print(url_for('profile', username='John Doe'))

HTTP 方法

Web 应用使用不同的 HTTP 方法处理 URL 。当您使用 Flask 时,应当熟悉 HTTP 方法。缺省情况下,一个路由只回应 GET 请求。可以使用 route() 装饰器的 methods 参数来处理不同的 HTTP 方法。

from flask import request@app.route('/login', methods=['GET', 'POST'])
def login():if request.method == 'POST':return do_the_login()else:return show_the_login_form()

上例中把路由的所有方法都放在同一个函数中,当每个方法都使用一些共同的 数据时,这样是有用的。

你也可以把不同方法所对应的视图分别放在独立的函数中。 Flask 为每个常用 的 HTTP 方法提供了捷径,如 get() 、 post() 等等。

@app.get('/login')
def login_get():return show_the_login_form()@app.post('/login')
def login_post():return do_the_login()

如果当前使用了 GET 方法, Flask 会自动添加 HEAD 方法支持,并 且同时还会按照 HTTP RFC 来处理 HEAD 请求。同样, OPTIONS 也会自动实现。

静态文件

动态的 web 应用也需要静态文件,一般是 CSS 和 JavaScript 文件。理想情 况下您的服务器已经配置好了为您的提供静态文件的服务。但是在开发过程中, Flask 也能做好这项工作。只要在您的包或模块旁边创建一个名为 static 的文件夹就行了。静态文件位于应用的 /static 中。

使用特定的 'static' 端点就可以生成相应的 URL

url_for('static', filename='style.css')

这个静态文件在文件系统中的位置应该是 static/style.css 。

渲染模板

在 Python 内部生成 HTML 不好玩,且相当笨拙。因为您必须自己负责 HTML 转义,以确保应用的安全。因此, Flask 自动为您配置 Jinja2 模板引擎。

模板可被用于生成任何类型的文本文件。对于 web 应用来说,主要用于生成 HTML 页面,但是也可以生成 markdown 、用于电子邮件的纯文本等等。

HTML 、 CSS 和其他 web API ,请参阅 MDN Web 文档 。

使用 render_template() 方法可以渲染模板,您只要提供模板 名称和需要作为参数传递给模板的变量就行了。下面是一个简单的模板渲染例 子:

from flask import render_template@app.route('/hello/')
@app.route('/hello/<name>')
def hello(name=None):return render_template('hello.html', name=name)

Flask 会在 templates 文件夹内寻找模板。因此,如果您的应用是一 个模块,那么模板文件夹应该在模块旁边;如果是一个包,那么就应该在包里 面:

情形 1 : 一个模块:

/application.py
/templates/hello.html

情形 2 : 一个包:

/application/__init__.py/templates/hello.html

您可以充分使用 Jinja2 模板引擎的威力。更多内容,详见官方 Jinja2 模板文档 。

模板示例:

<!doctype html>
<title>Hello from Flask</title>
{% if name %}<h1>Hello {{ name }}!</h1>
{% else %}<h1>Hello, World!</h1>
{% endif %}

在模板内部可以像使用 url_for() 和 get_flashed_messages() 函数一样访问 config 、 request 、 session 和 g [1] 对象。

模板在继承使用的情况下尤其有用。其工作原理参见 模板继承 。简单的说,模板继承可以使每个页 面的特定元素(如页头、导航和页尾)保持一致。

自动转义默认开启。因此,如果 name 包含 HTML ,那么会被自动转义。 如果您可以信任某个变量,且知道它是安全的 HTML (例如变量来自一个把 wiki 标记转换为 HTML 的模块),那么可以使用 Markup 类把它标记为安全的,或者在模板中使用 |safe 过滤器。更多例子参见 Jinja 2 文档。

下面 Markup 类的基本使用方法:

>>> from markupsafe import Markup
>>> Markup('<strong>Hello %s!</strong>') % '<blink>hacker</blink>'
Markup('<strong>Hello &lt;blink&gt;hacker&lt;/blink&gt;!</strong>')
>>> Markup.escape('<blink>hacker</blink>')
Markup('&lt;blink&gt;hacker&lt;/blink&gt;')
>>> Markup('<em>Marked up</em> &raquo; HTML').striptags()
'Marked up » HTML'

Changelog

[1] 不确定 g 对象是什么?它是某个可以根据需要储存 信息的东西,详见 g 对象的文档和 使用 SQLite 3 。

操作请求数据

对于 web 应用来说对客户端向服务器发送的数据作出响应很重要。在 Flask 中由全局对象 request 来提供请求信息。如果您有一些 Python 基础,那么可能 会奇怪:既然这个对象是全局的,怎么还能保持线程 安全?答案是本地环境:

本地环境

内部信息

如果您想了解工作原理和如何使用本地环境进行测试,那么请阅读本节, 否则可以跳过本节。

某些对象在 Flask 中是全局对象,但不是通常意义

from flask import requestwith app.test_request_context('/hello', method='POST'):# now you can do something with the request until the# end of the with block, such as basic assertions:assert request.path == '/hello'assert request.method == 'POST'

下的全局对象。这些对象实 际上是特定环境下本地对象的代理。真拗口!但还是很容易理解的。

设想现在处于处理线程的环境中。一个请求进来了,服务器决定生成一个新线 程(或者叫其他什么名称的东西,这个下层的东西能够处理包括线程在内的并 发系统)。当 Flask 开始其内部请求处理时会把当前线程作为活动环境,并把 当前应

with app.request_context(environ):assert request.method == 'POST'

用和 WSGI 环境绑定到这个环境(线程)。它以一种聪明的方式使得一 个应用可以在不中断的情况下调用另一个应用。

这对您有什么用?基本上您可以完全不必理会。这个只有在做单元测试时才有 用。在测试时会遇到由于没有请求对象而导致依赖于请求的代码会突然崩溃的 情况。对策是自己创建一个请求对象并绑定到环境。最简单的单元测试解决方 案是使用 test_request_context() 环境管理器。通过使 用 with 语句可以绑定一个测试请求,以便于交互。例如:

 

另一种方式是把整个 WSGI 环境传递给 request_context() 方法:

请求对象

请求对象在 API 一节中有详细说明这里不细谈(参见 Request )。这里简略地谈一下最常见的操作。首先,您必 须从 flask 模块导入请求对象:

from flask import request

通过使用 method 属性可以操作当前请求方法,通过 使用 form 属性处理表单数据(在 POST 或者 PUT 请求中传输的数据)。以下是使用上述两个属性的例子:

@app.route('/login', methods=['POST', 'GET'])
def login():error = Noneif request.method == 'POST':if valid_login(request.form['username'],request.form['password']):return log_the_user_in(request.form['username'])else:error = 'Invalid username/password'# the code below is executed if the request method# was GET or the credentials were invalidreturn render_template('login.html', error=error)

当 form 属性中不存在这个键时会发生什么?会引发一个 KeyError 。如果您不像捕捉一个标准错误一样捕捉 KeyError , 那么会显示一个 HTTP 400 Bad Request 错误页面。因此,多数情况下您不必 处理这个问题。

要操作 URL (如 ?key=value )中提交的参数可以使用 args 属性:

searchword = request.args.get('key', '')

用户可能会改变 URL 导致出现一个 400 请求出错页面,这样降低了用户友好 度。因此,我们推荐使用 get 或通过捕捉 KeyError 来访问 URL 参数。

完整的请求对象方法和属性参见 Request 文档。

文件上传¶

用 Flask 处理文件上传很容易,只要确保不要忘记在您的 HTML 表单中设置 enctype="multipart/form-data" 属性就可以了。否则浏览器将不会传送 您的文件。

已上传的文件被储存在内存或文件系统的临时位置。您可以通过请求对象 files 属性来访问上传的文件。每个上传的文件都储 存在这个字典型属性中。这个属性基本和标准 Python file 对象一 样,另外多出一个用于把上传文件保存到服务器的文件系统中的 save() 方法。下例展示其如 何运作:

from flask import request@app.route('/upload', methods=['GET', 'POST'])
def upload_file():if request.method == 'POST':f = request.files['the_file']f.save('/var/www/uploads/uploaded_file.txt')...

如果想要知道文件上传之前其在客户端系统中的名称,可以使用 filename 属性。但是请牢 记这个值是可以伪造的,永远不要信任这个值。如果想要把客户端的文件名作 为服务器上的文件名,可以通过 Werkzeug 提供的 secure_filename() 函数:

from werkzeug.utils import secure_filename@app.route('/upload', methods=['GET', 'POST'])
def upload_file():if request.method == 'POST':file = request.files['the_file']file.save(f"/var/www/uploads/{secure_filename(file.filename)}")...

更好的例子参见 上传文件 。

Cookies

要访问 cookies ,可以使用 cookies 属性。可以使 用响应对象 的 set_cookie 方法来设置 cookies 。 请求对象的 cookies 属性是一个包含了客户端传输 的所有 cookies 的字典。在 Flask 中,如果使用 会话 ,那么就 不要直接使用 cookies ,因为 会话 比较安全一些。

读取 cookies:

from flask import request@app.route('/')
def index():username = request.cookies.get('username')# use cookies.get(key) instead of cookies[key] to not get a# KeyError if the cookie is missing.

储存 cookies:

from flask import make_response@app.route('/')
def index():resp = make_response(render_template(...))resp.set_cookie('username', 'the username')return resp

注意, cookies 设置在响应对象上。通常只是从视图函数返回字符串, Flask 会把它们转换为响应对象。如果您想显式地转换,那么可以使用 make_response() 函数,然后再修改它。

使用 doc:patterns/deferredcallbacks 方案可以在没有响应对象的情况下 设置一个 cookie 。

另见 关于响应 。

重定向和错误

使用 redirect() 函数可以重定向。使用 abort() 可以更早退出请求,并返回错误代码:

from flask import abort, redirect, url_for@app.route('/')
def index():return redirect(url_for('login'))@app.route('/login')
def login():abort(401)this_is_never_executed()

上例实际上是没有意义的,它让一个用户从索引页重定向到一个无法访问的页 面(401 表示禁止访问)。但是上例可以说明重定向和出错跳出是如何工作的。

缺省情况下每种出错代码都会对应显示一个黑白的出错页面。使用 errorhandler() 装饰器可以定制出错页面:

@app.errorhandler(404)
def page_not_found(error):return render_template('page_not_found.html'), 404

注意 render_template() 后面的 404 ,这表示页面对就的 出错代码是 404 ,即页面不存在。缺省情况下 200 表示:一切正常。

详见 应用错误处理 。

关于响应

视图函数的返回值会自动转换为一个响应对象。如果返回值是一个字符串,那 么会被转换为一个包含作为响应体的字符串、一个 200 OK 出错代码 和一 个 text/html 类型的响应对象。如果返回值是一个字典或者列表, 那么会调用 jsonify() 来产生一个响应。以下是转换的规则:

  1. 如果视图返回的是一个响应对象,那么就直接返回它。

  2. 如果返回的是一个字符串,那么根据这个字符串和缺省参数生成一个用于 返回的响应对象。

  3. 如果返回的是一个迭代器或者生成器,那么返回字符串或者字节,作为流 响应对待。

  4. 如果返回的是一个字典或者列表,那么使用 jsonify() 创建一个响应对象。

  5. 如果返回的是一个元组,那么元组中的项目可以提供额外的信息。元组中 必须至少包含一个项目,且项目应当由 (response, status) 、 (response, headers) 或者 (response, status, headers) 组 成。 status 的值会重载状态代码, headers 是一个由额外头部 值组成的列表或字典。

  6. 如果以上都不是,那么 Flask 会假定返回值是一个有效的 WSGI 应用并把 它转换为一个响应对象。

如果想要在视图内部掌控响应对象的结果,那么可以使用 make_response() 函数。

设想有如下视图:

@app.errorhandler(404)
def not_found(error):return render_template('error.html'), 404

可以使用 make_response() 包裹返回表达式,获得响应对象, 并对该对象进行修改,然后再返回:

@app.errorhandler(404)
def not_found(error):resp = make_response(render_template('error.html'), 404)resp.headers['X-Something'] = 'A value'return resp

JSON 格式的 API

JSON 格式的响应是常见的,用 Flask 写这样的 API 是很容易上手的。如果从 视图返回一个 dict 或者 list ,那么它会被转换为一个 JSON 响应。

@app.route("/me")
def me_api():user = get_current_user()return {"username": user.username,"theme": user.theme,"image": url_for("user_image", filename=user.image),}

如果 dict 还不能满足需求,还需要创建其他类型的 JSON 格式响应,可 以使用 jsonify() 函数。该函数会序列化任何支持的 JSON 数据类型。也可以研究研究 Flask 社区扩展,以支持更复杂的应用。

@app.route("/users")
def users_api():users = get_all_users()return [user.to_json() for user in users]

这是一个向 jsonify() 函数传递数据的捷径,可以序列化 任何支持的 JSON 数据类型。这也意味着在字典和列表中的所有数据必须可以 被序列化。

对于复杂的数据类型,如数据库模型,你需要使用序列化库先把数据转换为合 法的 JSON 类型。有许多库,以及社区维护的 Flask API 扩展可以处理复杂数 据类型,

JSON 格式的 API

JSON 格式的响应是常见的,用 Flask 写这样的 API 是很容易上手的。如果从 视图返回一个 dict 或者 list ,那么它会被转换为一个 JSON 响应。

@app.route("/me")
def me_api():user = get_current_user()return {"username": user.username,"theme": user.theme,"image": url_for("user_image", filename=user.image),}

如果 dict 还不能满足需求,还需要创建其他类型的 JSON 格式响应,可 以使用 jsonify() 函数。该函数会序列化任何支持的 JSON 数据类型。也可以研究研究 Flask 社区扩展,以支持更复杂的应用。

@app.route("/users")
def users_api():users = get_all_users()return [user.to_json() for user in users]

这是一个向 jsonify() 函数传递数据的捷径,可以序列化 任何支持的 JSON 数据类型。这也意味着在字典和列表中的所有数据必须可以 被序列化。

对于复杂的数据类型,如数据库模型,你需要使用序列化库先把数据转换为合 法的 JSON 类型。有许多库,以及社区维护的 Flask API 扩展可以处理复杂数 据类型,

会话

除了请求对象之外还有一种称为 session 的对象,允许您在 不同请求之间储存信息。这个对象相当于用密钥签名加密的 cookie ,即用户 可以查看您的 cookie ,但是如果没有密钥就无法修改它。

使用会话之前您必须设置一个密钥。举例说明:

from flask import session# Set the secret key to some random bytes. Keep this really secret!
app.secret_key = b'_5#y2L"F4Q8z\n\xec]/'@app.route('/')
def index():if 'username' in session:return f'Logged in as {session["username"]}'return 'You are not logged in'@app.route('/login', methods=['GET', 'POST'])
def login():if request.method == 'POST':session['username'] = request.form['username']return redirect(url_for('index'))return '''<form method="post"><p><input type=text name=username><p><input type=submit value=Login></form>'''@app.route('/logout')
def logout():# remove the username from the session if it's theresession.pop('username', None)return redirect(url_for('index'))

如何生成一个好的密钥

生成随机数的关键在于一个好的随机种子,因此一个好的密钥应当有足够 的随机性。操作系统可以有多种方式基于密码随机生成器来生成随机数据。 使用下面的命令可以快捷的为 Flask.secret_key ( 或者 SECRET_KEY )生成值:

$ python -c 'import secrets; print(secrets.token_hex())'
'192b9bdd22ab9ed4d12e236c78afcb9a393ec15f71bbf5dc987d54727823bcbf'

基于 cookie 的会话的说明: Flask 会取出会话对象中的值,把值序列化后储 存到 cookie 中。在打开 cookie 的情况下,如果需要查找某个值,但是这个 值在请求中没有持续储存的话,那么不会得到一个清晰的出错信息。请检查页 面响应中的 cookie 的大小是否与网络浏览器所支持的大小一致。

除了缺省的客户端会话之外,还有许多 Flask 扩展支持服务端会话。

消息闪现

一个好的应用和用户接口都有良好的反馈,否则到后来用户就会讨厌这个应用。 Flask 通过闪现系统来提供了一个易用的反馈方式。闪现系统的基本工作原理 是在请求结束时记录一个消息,提供且只提供给下一个请求使用。通常通过一 个布局模板来展现闪现的消息。

flash() 用于闪现一个消息。在模板中,使用 get_flashed_messages() 来操作消息。完整的例子参见 消息闪现 。

日志

Changelog

有时候可能会遇到数据出错需要纠正的情况。例如因为用户篡改了数据或客户 端代码出错而导致一个客户端代码向服务器发送了明显错误的 HTTP 请求。多 数时候在类似情况下返回 400 Bad Request 就没事了,但也有不会返回的 时候,而代码还得继续运行下去。

这时候就需要使用日志来记录这些不正常的东西了。自从 Flask 0.3 后就已经 为您配置好了一个日志工具。

以下是一些日志调用示例:

app.logger.debug('A value for debugging')
app.logger.warning('A warning occurred (%d apples)', 42)
app.logger.error('An error occurred')

logger 是一个标准的日志 Logger 类,更多信息详见官方的 logging 文档。

参见 应用错误处理 。

集成 WSGI 中间件

如果想要在应用中添加一个 WSGI 中间件,那么可以用应用的 wsgi_app 属性来包装。例如,假设需要在 Nginx 后面使用 ProxyFix 中间件,那么可以这样 做:

from werkzeug.middleware.proxy_fix import ProxyFix
app.wsgi_app = ProxyFix(app.wsgi_app)

用 app.wsgi_app 来包装,而不用 app 包装,意味着 app 仍旧 指向您的 Flask 应用,而不是指向中间件。这样可以继续直接使用和配置 app 。

使用 Flask 扩展

扩展是帮助完成公共任务的包。例如 Flask-SQLAlchemy 为在 Flask 中轻松使 用 SQLAlchemy 提供支持。

更多关于 Flask 扩展的内容请参阅 扩展 。

部署到网络服务器

已经准备好部署您的新 Flask 应用了?请移步 生产部署 。

相关文章:

flask基础配置详情

前言 一个简单的应用 app Flask(__name__) app.route("/") def hello_world():return "<p>Hello,World!"运行Flask应用 #flask命令运行flask --app hello run#使用Python命令进行运行python -m flask # 作为一个捷径&#xff0c;如果文件名为 app…...

单相整流-TI视频课笔记

目录 1、单相半波整流 1.1、单相半波----电容滤波---超轻负载 1.2、单相半波----电容滤波---轻负载 1.3、单相半波----电容滤波---重负载 2、全波整流 2.1、全波整流的仿真 2.2、半波与全波滤波的对比 3、全桥整流电路 3.1、全波和全桥整流对比 3.2、半波全波和全桥…...

用GPT 4o提高效率

**GPT-4o可以通过提高编程效率、优化工作流程、增强文档管理和知识分享等多方面帮助用户提升工作效率**。具体如下&#xff1a; 1. **代码生成与优化** - **快速原型开发**&#xff1a;程序员可以通过向GPT-4o描述需求或功能来生成初步的代码框架或关键函数&#xff0c;从而节省…...

20240711每日消息队列-------------MQ消息的积压的折磨

目标 解决MQ消息的积压 背景 菜馆系统----------- 系统读取消息&#xff0c;处理业务逻辑&#xff0c;持久化订单和菜品数据&#xff0c;然后将其显示在菜品管理客户端上。 最初我们的用户基数很小&#xff0c;上线后的一段时间内&#xff0c;MQ消息通信还算顺利。 随着用户…...

推荐一个比 Jenkins 使用更简单的项目构建和部署工具

最近发现了一个比 Jenkins 使用更简单的项目构建和部署工具&#xff0c;完全可以满足个人以及一些小企业的需求&#xff0c;分享一下。 项目介绍 Jpom 是一款 Java 开发的简单轻量的低侵入式在线构建、自动部署、日常运维、项目监控软件。 日常开发中&#xff0c;Jpom 可以解…...

java 在pdf中根据关键字位置插入图片(公章、签名等)

java 在pdf中根据关键字位置插入图片&#xff08;公章、签名等&#xff09; 1.使用依赖 <dependency><groupId>com.itextpdf</groupId><artifactId>itext7-core</artifactId><version>7.1.12</version><type>pom</type>…...

施耐德EOCR系列电机保护器全面升级后無端子型

一、施耐德数码型产品升级背景 施耐德电气作为一家全球领先的能源管理和自动化解决方案提供商&#xff0c;其产品线包括各种电动机保护器等数码型产品。随着技术的不断发展和市场需求的变化&#xff0c;施耐德会对其产品进行定期升级和优化。在升级过程中&#xff0c;产品的设…...

27.数码管的驱动,使用74HC595移位寄存器芯片

PS&#xff1a;升腾A7pro系列FPGA没有数码管外设&#xff0c;因此以AC620FPGA为例展开实验。 &#xff08;1&#xff09;共阳极数码管和共阴极数码管示意图&#xff1a; AC620中的数码管属于共阳极数码管&#xff0c;段选端口(dp,g,f,e,d,c,b,a)低电平即可点亮led。人眼的视觉…...

TCP/IP 原理、实现方式与优缺点

TCP/IP&#xff08;传输控制协议/网际协议&#xff09; 是互联网的核心协议套件&#xff0c;主要用于在不同计算机之间进行通信。它包括多个层次的协议&#xff0c;每层协议负责不同的功能。TCP/IP 的四个层次模型如下&#xff1a; 网络接口层&#xff1a;负责在特定的物理网络…...

利率债与信用债的区别及其与债券型基金的关系

利率债与信用债的定义及其区别 定义 利率债&#xff1a; 定义&#xff1a;利率债是指由主权或类主权主体&#xff08;如中华人民共和国财政部、国家开发银行等&#xff09;发行的债券。这些债券通常被认为没有信用风险&#xff0c;因为它们由国家信用背书。特点&#xff1a;由…...

linux下解压命令

在Linux下&#xff0c;解压缩文件通常涉及多种命令&#xff0c;具体取决于文件的压缩格式。以下是一些常用的解压缩命令&#xff1a; tar.gz / .tgz 如果文件扩展名为 .tar.gz 或 .tgz&#xff0c;你可以使用 tar 命令来解压缩&#xff1a; tar -xzf filename.tar.gz这里的 -x …...

Vulnhub靶场DC-3-2练习

目录 0x00 准备0x01 主机信息收集0x02 站点信息收集0x03 漏洞查找与利用1. joomla漏洞查找2. SQL注入漏洞3. 破解hash4. 上传一句话木马5. 蚁剑连接shell6. 反弹shell7. 提权 0x04 总结 0x00 准备 下载链接&#xff1a;https://download.vulnhub.com/dc/DC-3-2.zip 介绍&#…...

Swift入门笔记

Swift入门笔记 简单值控制流函数和闭包对象和类枚举和结构体并发协议和扩展错误处理泛型 简单值 // 声明变量 var myVariable 42 myVariable 50// 声明常量 let myConstant 42// 声明类型 let implicitInteger 70 let implicitDouble 70.0 let explicitDouble: Double 7…...

【提交ACM出版 | EIScopus检索稳定 | 高录用】第五届大数据与社会科学国际学术会议(ICBDSS 2024,8月16-18)

第五届大数据与社会科学国际学术会议&#xff08;ICBDSS 2024&#xff09;将于2024年08月16-18日在中国-上海隆重举行。 ICBDSS会议在各专家教授的支持下&#xff0c;去年已成功举办了四届会议。为了让更多的学者有机会参与会议分享交流经验。本次会议主要围绕“大数据”、“社…...

Postman与世界相连:集成第三方服务的全面指南

&#x1f50c; Postman与世界相连&#xff1a;集成第三方服务的全面指南 Postman不仅是API开发和测试的强大工具&#xff0c;还支持与多种第三方服务的集成&#xff0c;从而扩展其功能&#xff0c;提高开发和测试的效率。本文将深入探讨如何在Postman中集成第三方服务&#xf…...

Perl 语言开发(十四):数据库操作

目录 1. 数据库连接 2. 基本数据库操作 2.1 插入数据 2.2 查询数据 2.3 更新数据 2.4 删除数据 3. 高级查询 3.1 多表连接 3.2 子查询 3.3 聚合查询 4. 事务处理 5. 数据库连接池 6. 常见的数据库模块 7. 综合实例 结论 数据库操作是大多数软件系统的核心部分。…...

Qt+ESP32+SQLite 智能大棚

环境简介 硬件环境 ESP32、光照传感器、温湿度传感器、继电器、蜂鸣器 基本工作流程 上位机先运行&#xff0c;下位机启动后尝试连接上位机连接成功后定时上报传感器数据到上位机&#xff0c;上位机将信息进行处理展示判断下位机传感器数据&#xff0c;如果超过设置的阈值&a…...

Android Viewpager2 remove fragmen不生效解决方案

一、介绍 在如今的开发过程只&#xff0c;内容变化已多单一的fragment&#xff0c;变成连续的&#xff0c;特别是以短视频或者直播为主的场景很多。从早起的Viewpage只能横向滑动&#xff0c;到如今的viewpage2可以支持横向或者竖向滑动。由于viewpage2的adapter在设计时支持缓…...

桃园南路上的红绿灯c++

题目描述 XXX非常讨厌等红绿灯&#xff0c;于是他仔细观察了桃园南路与科技路交叉口的一个红绿灯的周期。 从七点半开始&#xff0c;这个红绿灯的每个周期会按照下面四个阶段变化&#xff1a; 先保持 x 分钟的红灯然后保持 y 分钟的黄灯然后保持 z 分钟的绿灯最后保持 y 分钟…...

有关去中心化算路大模型的一些误区:低带宽互连导致训练速度太慢;小容量设备无法生成基础规模的模型;去中心化总是会花费更多;虫群永远不够大

目录 有关去中心化算路大模型的一些误区 低带宽互连导致训练速度太慢 挑战与解决方案 展望 小容量设备无法生成基础规模的模型 1. 模型规模与设备内存 2. 解决方案 3. 效率挑战 FSDP(Fully Sharded Data Parallel) Zero-3 去中心化总是会花费更多 虫群永远不够大…...

RestClient

什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端&#xff0c;它允许HTTP与Elasticsearch 集群通信&#xff0c;而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级&#xff…...

遍历 Map 类型集合的方法汇总

1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...

【单片机期末】单片机系统设计

主要内容&#xff1a;系统状态机&#xff0c;系统时基&#xff0c;系统需求分析&#xff0c;系统构建&#xff0c;系统状态流图 一、题目要求 二、绘制系统状态流图 题目&#xff1a;根据上述描述绘制系统状态流图&#xff0c;注明状态转移条件及方向。 三、利用定时器产生时…...

leetcodeSQL解题:3564. 季节性销售分析

leetcodeSQL解题&#xff1a;3564. 季节性销售分析 题目&#xff1a; 表&#xff1a;sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...

浅谈不同二分算法的查找情况

二分算法原理比较简单&#xff0c;但是实际的算法模板却有很多&#xff0c;这一切都源于二分查找问题中的复杂情况和二分算法的边界处理&#xff0c;以下是博主对一些二分算法查找的情况分析。 需要说明的是&#xff0c;以下二分算法都是基于有序序列为升序有序的情况&#xf…...

如何在最短时间内提升打ctf(web)的水平?

刚刚刷完2遍 bugku 的 web 题&#xff0c;前来答题。 每个人对刷题理解是不同&#xff0c;有的人是看了writeup就等于刷了&#xff0c;有的人是收藏了writeup就等于刷了&#xff0c;有的人是跟着writeup做了一遍就等于刷了&#xff0c;还有的人是独立思考做了一遍就等于刷了。…...

鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南

1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发&#xff0c;使用DevEco Studio作为开发工具&#xff0c;采用Java语言实现&#xff0c;包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...

Xen Server服务器释放磁盘空间

disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...

LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》

这段 Python 代码是一个完整的 知识库数据库操作模块&#xff0c;用于对本地知识库系统中的知识库进行增删改查&#xff08;CRUD&#xff09;操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 &#x1f4d8; 一、整体功能概述 该模块…...

AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机

这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机&#xff0c;因为在使用过程中发现 Airsim 对外部监控相机的描述模糊&#xff0c;而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置&#xff0c;最后在源码示例中找到了&#xff0c;所以感…...