Flask API служебных функций и классов
Flask предоставляет набор глобально доступных функций для типичных операций, таких как генерация URL, завершение запросов и построение ответов.
Все пройденоfrom flask import ...Импорт.
Глобальный прокси-объект
| Object | Type | Описание |
|---|---|---|
| current_app | Прокси → Flask | Указывает на текущий активный экземпляр приложения Flask. Доступен в контексте приложения. |
URL и перенаправления.
| Функция | Сигнатура | Описание |
|---|---|---|
| url_for | (endpoint, *, _anchor, _method, _scheme, _external, **values) | Сгенерировать URL на основе имени функции представления. _external=True генерирует абсолютный URL. |
| redirect | (location, code=303, Response=None) | Создать ответ перенаправления. Код по умолчанию — 303 (See Other). |
Завершение запроса и построение ответа.
| Функция | Сигнатура | Описание |
|---|---|---|
| abort | (code, *args, **kwargs) | Немедленно завершить запрос и вернуть ошибку HTTP. code — код состояния, description — описание. |
| make_response | (*) | Преобразовать возвращаемое значение представления в объект Response. Если аргументов несколько, они обрабатываются как кортеж. |
| after_this_request | (func) | Регистрирует функцию, которая будет выполнена только один раз после текущего запроса. Используется для динамического добавления after_request. |
Проверка контекста
| Функция | Описание |
|---|---|
| has_request_context() | Возвращает True, если имеется активный контекст запроса. |
| has_app_context() | Возвращает True, если имеется активный контекст приложения. |
| copy_current_request_context(func) | Декоратор. Копирует текущий контекст запроса, чтобы декорированная функция могла по-прежнему обращаться к request, g и т. д. при выполнении вне контекста. |
Отправка файлов
| Функция | Сигнатура | Описание |
|---|---|---|
| send_file | (path_or_file, mimetype, as_attachment, download_name, conditional, etag, last_modified, max_age) | Отправляет содержимое файла. as_attachment=True запускает скачивание. Поддерживает условные запросы и ETag. |
| send_from_directory | (directory, path, **kwargs) | Безопасно отправляет файлы из указанного каталога. Использует safe_join для предотвращения атак с обходом пути. |
Примеры кода
Пример
from flask import (Flask, current_app, url_for, redirect,
abort, make_response, after_this_request,
has_request_context, send_file, send_from_directory)
app = Flask(__name__)
@app.route("/")
def index():
# url_for генерирует URL
login_url = url_for("login")
# Генерирует абсолютный URL (включая доменное имя)
full_url = url_for("profile", username="example", _external=True)
return f'<a href="{login_url}">Вход</a>'
@app.route("/redirect-me")
def redirect_me():
# Перенаправление на главную страницу
return redirect(url_for("index"))
@app.route("/profile/<username>")
def profile(username):
return f"Профиль: {username}"
@app.route("/admin")
def admin():
# Неавторизованный доступ, возвращает 403
abort(403, description="Доступ запрещён")
@app.route("/download")
def download():
# Отправить файл (запустить скачивание в браузере)
return send_from_directory("uploads", "report.pdf",
as_attachment=True,
download_name="example_report.pdf")
@app.route("/custom-response")
def custom_response():
# Вручную создать объект ответа
resp = make_response("<h1>Пользовательский</h1>")
resp.headers["X-Powered-By"] = "EXAMPLE"
@after_this_request
def log_response(response):
app.logger.info(f"Запрос к {request.path} завершён, статус={response.status_code}")
return response
return resp
abort, make_response, after_this_request,
has_request_context, send_file, send_from_directory)
app = Flask(__name__)
@app.route("/")
def index():
# url_for генерирует URL
login_url = url_for("login")
# Генерирует абсолютный URL (включая доменное имя)
full_url = url_for("profile", username="example", _external=True)
return f'<a href="{login_url}">Вход</a>'
@app.route("/redirect-me")
def redirect_me():
# Перенаправление на главную страницу
return redirect(url_for("index"))
@app.route("/profile/<username>")
def profile(username):
return f"Профиль: {username}"
@app.route("/admin")
def admin():
# Неавторизованный доступ, возвращает 403
abort(403, description="Доступ запрещён")
@app.route("/download")
def download():
# Отправить файл (запустить скачивание в браузере)
return send_from_directory("uploads", "report.pdf",
as_attachment=True,
download_name="example_report.pdf")
@app.route("/custom-response")
def custom_response():
# Вручную создать объект ответа
resp = make_response("<h1>Пользовательский</h1>")
resp.headers["X-Powered-By"] = "EXAMPLE"
@after_this_request
def log_response(response):
app.logger.info(f"Запрос к {request.path} завершён, статус={response.status_code}")
return response
return resp