Веб-приложение - это программное обеспечение, которое работает в веб-браузере. Основные характеристики веб-приложений включают:
- Независимость от платформы
- Работа на любом устройстве, включая мобильные
- Зависимость от интернет-соединения (как минимум для начальной загрузки)
- Динамический контент с частыми обновлениями
Веб-приложения создаются с использованием различных технологий:
- Фронтенд: HTML, CSS и JavaScript
- Бэкенд: Node.js, Python (с Django или Flask), Java и другие
- Базы данных: SQL и NoSQL варианты (например, MongoDB, PostgreSQL)
Многие популярные сервисы, которые мы используем ежедневно, являются веб-приложениями:
- Gmail
- Google Документы
- Trello
- Slack
- Онлайн-банкинг
Веб-приложения имеют преимущество в виде встроенных функций безопасности, таких как HTTPS для шифрования передаваемых данных. Это освобождает разработчиков от необходимости создавать меры безопасности с нуля.
Типичное время загрузки веб-приложений:
- Первая загрузка: около 7-8 секунд
- Последующие загрузки: около 1 секунды (благодаря кэшированию)
Многие компании используют гибридный подход:
- Веб-сайт для презентации и продажи идеи (оптимизирован для SEO)
- Веб-приложение для основного продукта (оптимизировано для удобства пользователей)
Веб-приложения имеют ряд преимуществ, которые делают их важными в современном мире:
- Доступность с любого устройства с браузером
- Не требуют установки и обновления на устройстве пользователя
- Легко обновляются и поддерживаются разработчиками
- Обеспечивают единообразный пользовательский опыт на разных платформах
Источник: Python Hub - сборище Питонистов
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2
В этой статье мы рассмотрим, как можно эффективно интегрировать React с Django, не создавая полноценное SPA-приложение.
Многие статьи рекомендуют создавать полноценный React SPA и использовать Django только как REST API. Однако такой подход имеет ряд недостатков, особенно для небольших проектов:
- Дублирование кода (маршрутизация, аутентификация, авторизация)
- Необходимость создания отдельных страниц ошибок
- Дублирование состояний и моделей данных
Хотя для некоторых проектов это может быть приемлемым решением, для моего небольшого приложения такой подход кажется излишним.
Идея заключается в том, чтобы использовать React не как полноценный фронтенд-фреймворк, а как шаблонизатор для Django. Это позволит нам сохранить преимущества обоих инструментов.
1. Точки монтирования React
React имеет удобное свойство: он монтируется не просто в
body DOM или случайное место, а именно в указанный вами элемент. Мы можем использовать это для реализации маршрутизации, используя одну точку монтирования для каждой страницы:ReactDOM.render(
<h1>Страница 1!</h1>,
document.getElementById('page-1')
);
ReactDOM.render(
<h1>Страница 2!</h1>,
document.getElementById('page-2')
);
2. Маршрутизация на стороне Django
На стороне Django нам нужно только отрендерить
<div> с соответствующим идентификатором:{% extends "base.html" %}
{% load static %}
{% block content %}
<div id="{{ element_id }}"></div>
<script src="{% static 'index.js' %}"></script>
{% endblock %}3. Оптимизация размера пакета
Чтобы не загружать JavaScript для неиспользуемых страниц, мы можем использовать встроенную функцию React - Code Splitting:
let Page1 = React.lazy(() => import('./page1'))
let Page2 = React.lazy(() => import('./page2'))
ReactDOM.render(
<Suspense fallback={<></>}>
<Page1/>
</Suspense>,
document.getElementById('page-1')
);4. Передача контекстных данных
Для передачи данных из Django в React мы можем использовать встроенный в Django тег
json_script:{% extends "base.html" %}
{% load static %}
{% block content %}
<div id="{{ element_id }}"></div>
{{ page_context | json_script:'page-context' }}
<script src="{% static 'index.js' %}"></script>
{% endblock %}На стороне React мы можем получить эти данные с помощью пользовательского хука:
export let usePageContext = <T = any>() => {
let [pageContext, setPageContext] = useState<T | undefined>(undefined)
useEffect(() => {
let pageContext = document.getElementById('page-context').textContent
setPageContext(JSON.parse(pageContext))
}, [])
return pageContext as T
}
const TodosIndexPage = memo(() => {
let pageContext = usePageContext<{ todos: Todo[] }>()
let todos = pageContext?.todos
return <>
<h1>React todos page</h1>
<ul>
{todos?.map(todo => <li key={todo.id}>{todo.title}</li>)}
</ul>
</>
})Этот подход позволяет использовать React как шаблонизатор для Django, сохраняя при этом простоту разработки и избегая дублирования кода. Основные шаги для реализации:
- Создание отдельных точек монтирования для React
- Настройка разделения кода для оптимизации производительности
- Реализация маршрутизации на стороне Django
- Передача контекста страницы из Django в React
- Получение и использование контекста страницы на стороне React
Рабочий пример этого подхода можно найти на GitHub в репе этого парня:
https://github.com/kozlovzxc/djangoReactTemplates
Источник: Python Hub - сборище Питонистов
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3❤1
Добавление поддержки нескольких языков в Django может быть сложной задачей для новичков. В этой статье мы рассмотрим пошаговый процесс реализации многоязычности в вашем Django-проекте.
Если у вас еще нет готового проекта Django, вы можете создать новый, выполнив следующие шаги:
virtualenv .env
source .env/bin/activate
pip install django
django-admin startproject languages
cd languages
python manage.py migrate
Убедитесь, что в вашем файле [settings.py](http://settings.py) включены следующие настройки:
USE_I18N = True
USE_L10N = True
Для перевода текста в шаблонах используйте тег {% trans %}:
{% load i18n %}
{% trans "Hello world! This is an HTML5 Boilerplate." %}Для перевода текста в представлениях используйте функцию gettext:
from django.utils.translation import gettext as _
def index(request):
text = _("this is some random text")
return render(request, 'home.html', {'text': text})
Создайте каталог для хранения переводов и выполните команду для создания файлов перевода:
mkdir -p locale
django-admin makemessages --ignore="static" --ignore=".env" -l nl
Отредактируйте файл django.po в созданном каталоге locale, добавив переводы для каждой строки:
#: home/templates/home.html:19
msgid "Hello world! This is an HTML5 Boilerplate."
msgstr "Hallo wereld! Dit is een HTML5 Boilerplate."
После редактирования файлов перевода, скомпилируйте их:
django-admin compilemessages
Добавьте поле для выбора языка в модель пользователя:
LANGUAGE_CHOICES = (
('en-us', 'English'),
('nl', 'Dutch'),
)
language = models.CharField(default='en-us', choices=LANGUAGE_CHOICES, max_length=5)
В представлении активируйте язык на основе настроек пользователя:
from django.utils import translation
def index(request):
if request.user.is_authenticated:
translation.activate(request.user.language)
return render(request, 'home.html')
Следуя этим шагам, вы сможете добавить поддержку нескольких языков в ваш Django-проект. Не забывайте обновлять файлы перевода при добавлении нового текста и компилировать их после внесения изменений.
Оригинал статьи на английском
Источник: Python Hub - сборище Питонистов
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1👍1
Tkinter - это мощный модуль Python для создания графических пользовательских интерфейсов (GUI). Хотя он часто используется для создания стандартных элементов интерфейса, таких как кнопки и текстовые поля, Tkinter также предоставляет возможности для создания приложений для рисования, подобных Paint.
Основой для рисования в Tkinter является виджет Canvas (холст). Вот как можно создать простое окно с холстом:
from tkinter import *
class Application(Frame):
def __init__(self, master):
super().__init__(master)
self.master = master
self.pack()
self.create_widget()
def create_widget(self):
self.canvas = Canvas(self, width=200, height=200, bg='white')
self.canvas.pack()
self.canvas.bind('<B1-Motion>', self.draw)
def draw(self, event):
self.canvas.create_oval(event.x, event.y, event.x+1, event.y+1)
root = Tk()
root.geometry('200x200')
app = Application(root)
root.mainloop()
Ключевой метод для рисования - это функция
draw:def draw(self, event):
self.canvas.create_oval(event.x, event.y, event.x+1, event.y+1)
Этот метод создает маленький овал (фактически, точку) в позиции курсора мыши. Метод вызывается каждый раз, когда пользователь перемещает мышь с зажатой левой кнопкой (событие
<B1-Motion>).Вы можете легко изменить размер "кисти", увеличив размер создаваемого овала:
def draw(self, event):
brush_size = 5
x1, y1 = (event.x - brush_size), (event.y - brush_size)
x2, y2 = (event.x + brush_size), (event.y + brush_size)
self.canvas.create_oval(x1, y1, x2, y2, fill='black')
Вы можете расширить функциональность вашего приложения для рисования, добавив следующие возможности:
- Выбор цвета кисти
- Изменение размера кисти
- Очистка холста
- Сохранение рисунка
Источник: Python Hub - сборище Питонистов
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2❤1
Полиморфизм - ключевой принцип объектно-ориентированного программирования (ООП), позволяющий объектам различных классов иметь одинаковый интерфейс. Термин "полиморфизм" происходит от греческого слова, означающего "множество форм". В Python полиморфизм реализуется двумя основными способами: перегрузкой методов и их переопределением.
Перегрузка методов - это возможность класса иметь несколько методов с одинаковым именем, но разными параметрами. В Python прямая перегрузка методов не поддерживается, но похожего эффекта можно достичь с помощью параметров по умолчанию и аргументов переменной длины.
class MathOperations:
def add(self, a, b, c=0):
return a + b + c
math_op = MathOperations()
print(math_op.add(10, 20)) # Вывод: 30
print(math_op.add(10, 20, 30)) # Вывод: 60
В этом примере метод add() может принимать два или три аргумента, имитируя перегрузку метода.
Переопределение методов - это механизм, позволяющий подклассу предоставить свою реализацию метода, уже определенного в родительском классе. Это позволяет изменять или расширять поведение унаследованных методов.
## Пример переопределения метода
class Animal:
def sound(self):
return "Какой-то звук"
class Dog(Animal):
def sound(self):
return "Гав"
class Cat(Animal):
def sound(self):
return "Мяу"
dog = Dog()
cat = Cat()
print(dog.sound()) # Вывод: Гав
print(cat.sound()) # Вывод: Мяу
В этом примере классы Dog и Cat переопределяют метод sound(), унаследованный от класса Animal.
Рассмотрим пример использования полиморфизма в системе обработки платежей:
class Payment:
def process(self, amount):
raise NotImplementedError("Подклассы должны реализовать этот метод")
class CreditCardPayment(Payment):
def process(self, amount):
return f"Обработан платеж кредитной картой на сумму {amount}."
class PayPalPayment(Payment):
def process(self, amount):
return f"Обработан платеж через PayPal на сумму {amount}."
credit_card = CreditCardPayment()
paypal = PayPalPayment()
print(credit_card.process(100))
print(paypal.process(200))
Этот пример демонстрирует, как полиморфизм позволяет работать с разными типами платежей через единый интерфейс.
Полиморфизм в Python, реализуемый через переопределение методов и имитацию перегрузки, обеспечивает гибкость и возможность повторного использования кода. Эти концепции позволяют создавать более модульные, расширяемые и легко поддерживаемые программы. Эффективное использование полиморфизма - ключ к написанию чистого и элегантного кода на Python.
Источник: Python Hub - сборище Питонистов
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
👍4❤1👎1
Python Hub - сборище Питонистов
Photo
Разбор 👨💻
Метод возвращает индекс первого вхождения указанного символа или подстроки в строке. Если символ или подстрока не найдены, метод возвращает
Регистр тоже играет важную роль! Помни, что "a" - это не то же самое что "A"
find()find()-1Регистр тоже играет важную роль! Помни, что "a" - это не то же самое что "A"
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2❤1
Forwarded from Python Hub - сборище Питонистов
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2🤔1
+ допом хостинг
https://youtu.be/Pu40gtIaJmE
Please open Telegram to view this post
VIEW IN TELEGRAM
YouTube
ТЕЛЕГРАМ БОТ С ОПЛАТОЙ Telegram Stars на PYTHON | Оплата звездами AIOgram
В этом видео мы разберем, как добавить в вашего телеграм бота оплату телеграм звездами (старсами). Использовать будем язык программирования Python и библиотеку Aiogram. Далее загрузим бота на хостинг, чтобы он мог работать без остановки.
😎 Хостинг HOSTETSKI…
😎 Хостинг HOSTETSKI…
👨💻4👍2
message_effect_id - это уникальный идентификатор, используемый в Telegram Bot API для определения конкретного визуального эффекта, который можно применить к сообщению. Эти эффекты представляют собой анимированные реакции, которые пользователи могут добавлять к сообщениям.
Уникальность: Каждый эффект имеет свой уникальный числовой идентификатор.Формат: Идентификаторы представлены в виде строк, содержащих длинные числовые значения.Связь с эмодзи: Каждый message_effect_id соответствует определенному эмодзи, которое визуально представляет эффект.
{
'🔥': "5104841245755180586",
'👍': "5107584321108051014",
'👎': "5104858069142078462",
'❤️': "5044134455711629726",
'🎉': "5046509860389126442",
'💩': "5046589136895476101"
}Применение эффектов: Боты могут использовать эти идентификаторы для добавления анимированных реакций к сообщениям.Интерактивность: Позволяет создавать более динамичные и интерактивные взаимодействия в чатах.Кастомизация: Разработчики могут выбирать конкретные эффекты для различных сценариев использования бота.
Понимание и правильное использование message_effect_id позволяет разработчикам ботов создавать более привлекательные и интерактивные интерфейсы, улучшая пользовательский опыт в Telegram.
Источник: Python Hub - сборище Питонистов
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Итерируемый счетчик в Python - это объект, который можно использовать в цикле for и других итерационных контекстах. Он позволяет последовательно получать значения, обычно числовые, в заданном диапазоне или по определенному правилу.
Давайте рассмотрим пример реализации простого итерируемого счетчика:
class IterableCounter:
def __init__(self, start, end):
self.current = start
self.end = end
def __iter__(self):
return self
def __next__(self):
if self.current > self.end:
raise StopIteration
else:
self.current += 1
return self.current - 1
В этом примере:
- init инициализирует счетчик начальным и конечным значениями.
- iter возвращает сам объект, делая его итератором.
- next определяет логику получения следующего значения.
Теперь мы можем использовать наш счетчик в цикле for:
counter = IterableCounter(1, 5)
for num in counter:
print(num)
Этот код выведет числа от 1 до 5.
- Гибкость: можно легко изменить логику генерации значений.
- Экономия памяти: значения генерируются по мере необходимости.
- Интеграция с циклами: легко использовать в стандартных конструкциях Python.
В Python есть встроенные альтернативы для простых случаев:
- range(): для последовательностей целых чисел.
- enumerate(): для нумерации элементов итерируемого объекта.
Итерируемые счетчики в Python - мощный инструмент для создания пользовательских последовательностей. Они особенно полезны, когда стандартные функции не удовлетворяют специфическим требованиям вашей задачи.
Источник: Python Hub - сборище Питонистов
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Хэш-функции играют важную роль в компьютерных науках, особенно в структурах данных и криптографии. В этой статье мы рассмотрим различные типы хэш-функций, реализованные на Python, и проанализируем их характеристики.
Эта функция суммирует ASCII-значения символов входной строки и применяет операцию модуля. Она проста в реализации, но может привести к неравномерному распределению.
def simple_hash(input_str, table_size):
hash_value = 0
for char in input_str:
hash_value += ord(char)
return hash_value % table_size
Использует полиномиальное накопление ASCII-значений с простым числом, что позволяет придать больший вес символам в начале строки.
def polynomial_hash(input_str, table_size, prime=31):
hash_value = 0
for i, char in enumerate(input_str):
hash_value += ord(char) * (prime ** i)
return hash_value % table_size
32-битная версия FNV-1a хэша, известная своими хорошими характеристиками распределения.
def fnv1a_hash(key, table_size):
FNV_prime = 16777619
FNV_offset_basis = 2166136261
hash_value = FNV_offset_basis
for char in key:
hash_value ^= ord(char)
hash_value *= FNV_prime
hash_value &= 0xffffffff # Обеспечивает 32-битный хэш
return hash_value % table_size
Использует библиотеку xxhash для быстрого некриптографического хэширования, эффективного для больших объемов данных.
def xx_hash(input_str, table_size):
return xxhash.xxh32(input_str).intdigest() % table_size
Применяет HMAC с SHA-256 для повышенной безопасности, но может быть медленнее некриптографических хэшей.
def sip_hash(input_str, table_size, key=b'secretkey'):
hash_value = hmac.new(key, input_str.encode(), digestmod='sha256').hexdigest()
return int(hash_value, 16) % table_size
Быстрая некриптографическая хэш-функция, часто используемая в хэш-таблицах и фильтрах Блума.
def murmur_hash(input_str, table_size):
hash_value = mmh3.hash(input_str) % table_size
return hash_value
Для тестирования используется функция generate_random_strings, которая создает случайные строки заданной длины.
Функция test_distribution_and_collisions оценивает качество распределения элементов по хэш-таблице и подсчитывает количество коллизий.
Функция test_execution_time измеряет время, необходимое для хэширования набора элементов, что позволяет сравнить производительность разных хэш-функций.
Функция test_sensitivity проверяет, насколько хэш-функция чувствительна к небольшим изменениям во входных данных.
Выбор подходящей хэш-функции зависит от конкретных требований приложения. Простые хэш-функции могут быть достаточными для небольших наборов данных, в то время как для больших объемов данных или повышенных требований к безопасности могут потребоваться более сложные алгоритмы. Важно учитывать баланс между скоростью выполнения, качеством распределения и устойчивостью к коллизиям при выборе хэш-функции для конкретной задачи.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Куча
Реализация приоритетной очереди обычно предоставляет следующие методы:
- Вставить(H, x): вставить элемент x в приоритетную очередь H
- Find(H): вернуть элемент с наивысшим приоритетом в очереди H
- Delete(H): удалить элемент с наименьшим (или наибольшим) значением в очереди H
В этой статье мы сосредоточимся на реализации бинарной кучи (Binary Heap), где каждый узел может иметь максимум двух потомков. В min-heap родительский узел всегда имеет меньшее значение, чем его потомки, а в max-heap - большее.
Куча может быть представлена в виде массива, где позиции левого и правого потомков можно вычислить с помощью простых формул. Для элемента с индексом k:
- Индекс левого потомка: 2*k + 1
- Индекс правого потомка: 2*k + 2
- Индекс родителя: (k - 1) // 2
Кучи находят широкое применение в различных алгоритмах и реальных сценариях:
- Сортировка: пирамидальная сортировка (Heapsort) имеет временную сложность O(n log n) в худшем случае
- Алгоритмы поиска на графах: A* и алгоритм Дейкстры используют кучи для хранения пар приоритет-узел
- Кодирование Хаффмана: кучи применяются для хранения и извлечения деревьев с наименьшей частотой
В стандартной библиотеке Python API для работы с кучами находится в модуле heapq. Вот пример использования:
import heapq
unsorted_array = [100, 230, 44, 1, 74, 12013, 84]
heapq.heapify(unsorted_array)
print(unsorted_array)
# [1, 74, 44, 230, 100, 12013, 84]
sorted_array = []
for _ in range(len(unsorted_array)):
sorted_array.append(heapq.heappop(unsorted_array))
print(sorted_array)
# [1, 44, 74, 84, 100, 230, 12013]
Ниже представлена базовая структура класса MinHeap с основными методами:
class MinHeap:
def __init__(self):
self.nodes = []
def add(self, item):
self.nodes.append(item)
self.__heapify_up()
def poll(self):
if self.is_empty():
return None
removed_node = self.nodes[0]
self.nodes[0] = self.nodes[-1]
del self.nodes[-1]
self.__heapify_down()
return removed_node
def peek(self):
return self.nodes[0] if not self.is_empty() else None
def is_empty(self):
return len(self.nodes) == 0
def __heapify_up(self):
# Реализация метода подъема элемента
def __heapify_down(self):
# Реализация метода опускания элемента
Кучи - это мощная и эффективная структура данных, которая находит применение во многих алгоритмах и реальных задачах. Понимание принципов работы куч и умение их реализовывать - важный навык для каждого программиста.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Жадные алгоритмы полезны для решения задач оптимизации, делая ряд локально оптимальных выборов, которые приводят к глобально оптимальному решению. На каждом шаге они выбирают наилучший доступный вариант, не принимая во внимание последствия будущих выборов. Хотя они не гарантируют абсолютно наилучшего решения, они часто предоставляют быстрые и приемлемые решения.
def fractional_knapsack(items, capacity):
# Sort items by their value-to-weight ratio in descending order
items.sort(key=lambda x: x[1] / x[0], reverse=True)
total_value = 0
remaining_capacity = capacity
for item in items:
if remaining_capacity >= item[0]:
total_value += item[1]
remaining_capacity -= item[0]
else:
total_value += (remaining_capacity / item[0]) * item[1]
break
return total_value
# Example usage:
items = [(2, 10), (3, 5), (5, 15), (7, 7), (1, 6)]
knapsack_capacity = 10
max_value = fractional_knapsack(items, knapsack_capacity)
print(max_value)
В этом примере мы используем жадный алгоритм для решения задачи о дробном рюкзаке. Учитывая набор элементов с весами и значениями, цель состоит в том, чтобы выбрать элементы, чтобы максимизировать общую стоимость, не превышая при этом определенный предел веса (емкость рюкзака). Алгоритм сортирует элементы по соотношению их стоимости к весу и выбирает элементы жадно, максимизируя общую стоимость в пределах ограничения емкости.
Жадные алгоритмы особенно полезны, когда проблема демонстрирует свойство жадного выбора, что означает, что локально оптимальный выбор на каждом шаге приводит к глобально оптимальному решению. Однако важно отметить, что не все проблемы можно решить оптимально с помощью жадного подхода, поэтому требуется тщательный анализ, чтобы определить, когда целесообразно использовать этот метод.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3❤1
И все это за 5 минут и бесплатно? Вот решение!
https://youtu.be/4jxMhmVGFt0
Please open Telegram to view this post
VIEW IN TELEGRAM
YouTube
Бесплатный хостинг для сайта на Python | Flask и html
В этом видео мы напишем сайт на языке Python и загрузим его на бесплатный хостинг pythonanywhere. Использовать будем библиотеку Flask, а так же подключим к странице html файл, который будет отображаться на нашем хостинге.
🔥 Подписывайся на наш Телеграм-канал…
🔥 Подписывайся на наш Телеграм-канал…
👍2❤1