Web-фреймворк Flask (Python): от простого к сложному
Основы Flask
Flask – это микрофреймворк для создания веб-приложений на Python. Он не требует специальных инструментов или библиотек, предоставляя минимальный набор функций для маршрутизации, обработки запросов и работы с шаблонами. Основное преимущество – простота и гибкость.
Установка Flask выполняется через pip:
pip install flaskHtml css js python (интеграция python с html, css, javascript)
Создайте файл app.py с простейшим приложением:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def home():
return 'Hello, Flask!'
if __name__ == '__main__':
app.run(debug=True)создание сайтов python django (создание веб-сайтов на django с использованием python)
Запустите скрипт:
python app.py
Python web django (web-фреймворк django)
Приложение будет доступно по адресу http://127.0.0.1:5000.
Как организовать обработку разных URL?
Для добавления новых маршрутов используются декораторы @app.route. Например:
@app.route('/about')
def about():
return 'Это страница "О нас"'
@app.route('/user/<username>')
def user_profile(username):
return f'Профиль пользователя {username}'Python web flask (web-фреймворк flask)
Можно задать типы данных в URL:
@app.route('/post/<int:post_id>')
def show_post(post_id):
return f'Пост с ID {post_id}'Python web server (web-сервер на python)
Частая ошибка: забыть указать methods при обработке POST-запросов. По умолчанию Flask принимает только GET. Для POST нужно:
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
return 'Данные отправлены'
return 'Форма входа'Python 3 веб приложение (веб-приложение на python 3)
Как использовать HTML-шаблоны?
Flask использует шаблонизатор Jinja2. Создайте папку templates и файл index.html:
<!DOCTYPE html>
<html>
<head><title>Flask App</title></head>
<body>
<h1>{{ title }}</h1>
<p>Привет, {{ name }}!</p>
</body>
</html>Python веб сервисы (веб-сервисы на python)
В Python-коде:
from flask import render_template
@app.route('/hello/<name>')
def hello(name):
return render_template('index.html', title='Главная', name=name)примеры python веб (примеры веб-разработки на python)
Jinja2 поддерживает циклы и условия:
<ul>
{% for item in items %}
<li>{{ item }}</li>
{% endfor %}
</ul>
{% if user %}
<p>Пользователь {{ user }} авторизован</p>
{% endif %}создание сайта на python (создание сайта на python)
Ошибка TemplateNotFound возникает, если шаблон не найден в папке templates или указан неправильный путь. Проверьте наличие папки и регистр имени файла.
Также можно указать другую папку для шаблонов при создании приложения:
app = Flask(__name__, template_folder='templates')Django python создание приложения (создание веб-приложения на django)
Как подключить статические файлы (CSS, JS, изображения)?
Поместите файлы в папку static. В шаблоне используйте функцию url_for:
<link rel="stylesheet" href="{{ url_for('static', filename='style.css') }}">
<script src="{{ url_for('static', filename='script.js') }}"></script>библиотека django python (библиотека django для веб-разработки на python)
Можно создавать подпапки:
<img src="{{ url_for('static', filename='images/logo.png') }}" alt="Логотип">Python django практика (практика django на python)
Если файлы не загружаются, проверьте путь относительно папки static. Flask автоматически обслуживает статику по умолчанию, но при изменении папки нужно указать параметр static_folder.
Как обработать форму и получить данные от пользователя?
Используйте объект request. Пример формы в шаблоне form.html:
<form method="post" action="{{ url_for('login') }}">
<input type="text" name="username">
<input type="password" name="password">
<button type="submit">Войти</button>
</form>Python index html (работа с index.html в python)
Обработчик:
from flask import request, redirect, url_for
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
username = request.form.get('username')
password = request.form.get('password')
# проверка данных
if username == 'admin' and password == 'secret':
return redirect(url_for('dashboard'))
else:
return 'Неверные данные', 401
return render_template('form.html')
Если данные не передаются, убедитесь, что в форме установлен метод POST и атрибут name у полей. Для получения параметров из URL используйте request.args.get().
Как структурировать большое приложение с помощью Blueprints?
Blueprints позволяют разделить приложение на модули. Создайте файл auth.py:
from flask import Blueprint, render_template
auth = Blueprint('auth', __name__, template_folder='templates')
@auth.route('/login')
def login():
return render_template('login.html')
@auth.route('/logout')
def logout():
return 'Вы вышли'
В главном файле зарегистрируйте blueprint:
from auth import auth
app.register_blueprint(auth, url_prefix='/auth')
Теперь маршруты доступны по /auth/login и /auth/logout.
При импорте blueprint возможны циклические зависимости, если blueprint импортирует app. Решение: использовать фабрику приложений или вынести создание app в отдельную функцию.
Расширенные примеры с Flask
Ниже приведены детальные примеры кода с пояснениями и результатами.
1. Работа с базой данных SQLite через Flask-SQLAlchemy
Установите расширение:
pip install flask-sqlalchemy
Пример модели и CRUD-операций (файл app.py):
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///mydatabase.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)
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 f'<User {self.username}>'
# Создание таблиц в контексте приложения
with app.app_context():
db.create_all()
@app.route('/add')
def add_user():
new_user = User(username='john', email='john@example.com')
db.session.add(new_user)
db.session.commit()
return f'Добавлен пользователь {new_user.username}'
@app.route('/users')
def list_users():
users = User.query.all()
return '<br>'.join([u.username for u in users])
if __name__ == '__main__':
app.run(debug=True)
Результат: При переходе на /add создается пользователь, на /users выводится список имен.
Добавлен пользователь john john alice
2. Обработка ошибок (404, 500)
Создайте кастомные страницы ошибок:
@app.errorhandler(404)
def not_found(error):
return '<h1>Страница не найдена</h1>', 404
@app.errorhandler(500)
def internal_error(error):
return '<h1>Ошибка сервера</h1>', 500
Можно использовать шаблоны:
@app.errorhandler(404)
def not_found(error):
return render_template('404.html'), 404
Также можно настроить обработку общих исключений:
@app.errorhandler(Exception)
def handle_exception(e):
# запись в лог
app.logger.error(f'Unhandled exception: {e}')
return 'Что-то пошло не так', 500
3. Использование сессий для хранения данных пользователя
Flask предоставляет объект session для хранения данных между запросами. Установите секретный ключ (обязательно):
app.secret_key = 'supersecretkey'
@app.route('/login')
def login():
session['username'] = 'admin'
return 'Вы вошли как admin'
@app.route('/profile')
def profile():
if 'username' in session:
return f'Привет, {session["username"]}'
return 'Пожалуйста, войдите'
@app.route('/logout')
def logout():
session.pop('username', None)
return 'Вы вышли'
Сессии по умолчанию хранятся на стороне клиента (в cookie). Для безопасности используйте надежный секретный ключ.
Результат: После входа на /login, при обращении к /profile отображается имя пользователя.
4. Создание REST API с Flask
Возвращайте JSON с помощью jsonify:
from flask import jsonify, request
@app.route('/api/items', methods=['GET'])
def get_items():
items = ['item1', 'item2']
return jsonify({'items': items})
@app.route('/api/items', methods=['POST'])
def create_item():
data = request.get_json()
if not data:
return jsonify({'error': 'No JSON provided'}), 400
# обработка
return jsonify({'message': 'Item created', 'data': data}), 201
Для тестирования используйте curl или Postman:
$ curl http://127.0.0.1:5000/api/items
{"items":["item1","item2"]}
$ curl -X POST -H "Content-Type: application/json" -d '{"name":"new"}' http://127.0.0.1:5000/api/items
{"message":"Item created","data":{"name":"new"}}
5. Использование Flask-Migrate для управления миграциями БД
Установите пакет:
pip install flask-migrate
Пример настройки:
from flask_migrate import Migrate
migrate = Migrate(app, db)
# в терминале:
# flask db init
# flask db migrate -m "Initial migration"
# flask db upgrade
Теперь при изменении моделей можно автоматически обновлять схему базы данных.
6. Обработка загрузки файлов
Форма для загрузки:
<form method="post" enctype="multipart/form-data">
<input type="file" name="file">
<button type="submit">Загрузить</button>
</form>
Обработчик:
import os
from flask import request, redirect, url_for
from werkzeug.utils import secure_filename
UPLOAD_FOLDER = 'uploads'
ALLOWED_EXTENSIONS = {'txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif'}
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
def allowed_file(filename):
return '.' in filename and \
filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS
@app.route('/upload', methods=['GET', 'POST'])
def upload_file():
if request.method == 'POST':
if 'file' not in request.files:
return 'Нет файла'
file = request.files['file']
if file.filename == '':
return 'Файл не выбран'
if file and allowed_file(file.filename):
filename = secure_filename(file.filename)
file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
return 'Файл загружен'
return render_template('upload.html')
Важно: функция secure_filename защищает от path traversal-атак.