Сообщения

Показаны сообщения с ярлыком "python"

Python requests ошибка SSL соединения

Изображение
У некоторых сайтов с неправильно настроенным SSL сервером могут возникать проблемы соединеня. В моем случае было странно то что я мог посетить веб сайт через браузер и никаких ошибок не вознкало, но когда я пытался отправить запрос через командную строку curl или скриптом питона то возникала ошибка SSL соединения. Я изучил в чем была проблема, оказалось что в браузерах есть встроенная система востановления недостающих SSL сертификатов. В моем случае была проблема в том что сервер не отдавал промежуточный сертификат. Браузер искал его по своей внутренней базе данных и смог восстановить его. Но у небраузеров такой функции небыло. Вы можете проверить тожесамое посетив сайт https://incomplete-chain.badssl.com . Если вы попробуете послать на него запрос через curl то получите ошибку. Чтобы исправить эту ошибку посылайте запрос с verify=False .

Django генерирование рандомных имён загруженным файлам FileField

В одном из моих проектов мне потребовалось реализовать загрузку пользовательских файлов через форму. Я использовал обычный FileField как советуют во всех туториалах, с стандартной конфигурацией. Пользователи загружали файлы, и все работало хорошо. Но затем я заметил проблему - делов в том что имя файла на сервере совпадало с именем файла которое загрузил пользователь. То есть, например если пользователь загружает картинку 1.png, то его картинка будет доступна по ссылке /uploads/1.png. Проблема этого подхода в том что в таких случаях имя файла можно будет просто перебрать и находить чужие файлы. Например, собрать огромный список стандартных названий файлов, и перебирать их в целях найти чужие файлы. Чтобы исправить эту проблему нужно просто использовать случайные имена файлов. Но дело в том что по умолчанию FileField нигде не сохраняет оригинальное имя файла. Оригинальное имя файла придётся сохранять отдельным полем в моделях. @csrf_exempt @login_required def upload_file (request, s

Как получить информацию о youtube видео через питон по ссылке на видео

Не многие знают, но пакет youtube-dl можно использовать не только как утилиту в пользовательских целях, но и интегрировать в питон код. Тк youtube-dl это python модуль, то это очень просто. Нужно установить pypi пакет: pip install youtube-dl Данные в своем коде можно получать так: from youtube_dl import YoutubeDL video = "http://www.youtube.com/watch?v=BaW_jenozKc" with YoutubeDL({ 'quiet' : True }) as ydl: info_dict = ydl.extract_info(video, download = False ) video_url = info_dict.get( "url" , None ) video_id = info_dict.get( "id" , None ) video_title = info_dict.get( 'title' , None ) Нужно понимать что могут происходить ошибки из-за сети итд, поэтому стоит обрабатывать ошибки сети итд: from youtube_dl import YoutubeDL from youtube_dl.utils import YoutubeDLError try : video = "http://www.youtube.com/watch?v=BaW_jenozKc" with YoutubeDL({ 'quiet' : True }) as ydl: info_dict

walrus оператор в питоне

В питоне 3.8 существует walrus operator, который позволяет присваивать переменные доступные в теле, внутри выражений. Walrus operator получил такое название из-за своего сходства с мордой моржа. Этот синтаксис позволяет избегать повторения самого себя, например: a = [ 1 , 2 , 3 , 4 ] if (n := len (a)) > 10 : print ( f "List is too long ( { n } elements, expected <= 10)" ) Если не новый синтаксис, то вы бы не смогли назначить переменную внутри выражения. Вам пришлось бы создать переменную выше, что усложнит чтение кода: a = [ 1 , 2 , 3 , 4 ] n = len (a) if (n > 10 ): print ( f "List is too long ( { n } elements, expected <= 10)" ) Так-же Walrus operator помогает в регулярных выражениях: discount = 0.0 if (mo := re.search( r ' ( \d + ) % discount' , advertisement)): discount = float (mo.group( 1 )) / 100.0 Вам нужно было получить доступ к переменной в теле if, поэтому этот оператор очень полезен. Так же этот оператор полезен при чт

В Python все данные - объекты

Краткий ответ: Объекты Все данные в Python - это объекты. Каждый объект имеет свой  идентификатор, тип, и значение . Для получения идентификатора объекта есть функция  id("привет")  # Выводит адрес в котором хранится объект Для получения типа объекта: type("привет")  # Выводит тип, в этом случае str Объекты делятся на два типа:  Изменяемые и неизменяемые . Значение изменяемых объектов может изменится. Неизменяемые объекты не могут изменить свое значение после создания. Способность объекта к изменяемости зависит от его типа. Например  цифры, строки, кортежи  - неизменяемые .  А списки, словари, множества - изменяемые .  Поскольку списки изменяемые, каждый новый инстанс списка имеет свое уникальное значение: a = [1] id(a) # 140435239681096 b = a id(b) # 140435239681096 print(a) # [1] Если вы попробуете присвоить новый список для  b , то переменная  b  будет ссылатся на новый список, но переменная  a  останется неизменной. В объектах так же есть счетчик ссылок, когда н

Python как создать двухфакторную авторизацию

В этом туториале вы научитесь использовать Pyotp для генерации 2FA кодов. 3 года назад я написал мини туториал про то как использовать pyotp для создания кодов. Но туториал получился не полным тк я не показал как все работает. Обычно пользователи используют приложения авторизации вроде Authenticator для двух факторной авторизации. Такие приложения обычно поддерживают два протокола otp: TOTP, и HOTP. Подробнее как они работают мы разбирать не будем, просто нужно понимать что TOTP генерирует какую-то последовательность цифр на основе случайно сгенерированного ключа, и unixtime времени. Новый ключ появляется каждые 30 секунд. Простые действия над PyOTP Чтобы установить PyOTP нужно: pip install pyotp Чтобы использовать нам нужно, импортировать pyotp, и придумать секретный ключ, например "pythonforbeginers". Этот ключ потом пользователь будет вводить в Authenticator: import pyotp totp = pyotp.TOTP('base32secret3232') totp.now() Функция

Как загружать объекты на AWS S3 прямо из браузера без посредников.

Изображение
В этом туториале мы будем использовать Minio, но вместо минио вы можете использовать любой сервер поддерживающий S3 протокол. Обычно для загрузки пользовательских объектов используют AWS lambda в которую через POST запрос пользователи отправляют файлы, и на лямбде происходит авторизация запроса, и лямбда уже сама загружает пользовательский файл на AWS S3. Но такой подход очень неэфективный вить мы тратим много трафика для получения файла на лямбду, и иеще и на загрузку в S3.  Чтобы исправить эту проблему придумали presigned urls. Presigned urls это "подписанные ссылки", которые подписывает бекенд и отдаёт браузеру который может POST запросом загрузить файл который будет доступен в S3 хранилище. Сделано это было чтобы каждый человек из интернета не мог просто загрузить любой файл, а лишь только с разрешения вашего бекенда. Presigned urls очень схожи с JWT, они тоже подписываются через криптографические функции. Но чтобы работать с Presigned urls вам не обязательно полностью по