Научете как можете да създадете Flask REST API, който може да извлича мемове и цитати от Reddit

Като Front-End разработчик, ако навлизате в тънкостите на Backend Development и просто сте объркани относно опциите, които имате, започването с Python би било най-добрият вариант за вас тук. Python е интерпретиран език, който е намерил своето приложение при уеб разработчици, специалисти по данни, разработчици на приложения и др. С доста нежна крива на обучение и лесен за разбиране синтаксис, това би било най-добрият вариант за вас да започнете с вашето пътешествие за разработка на бекенд по доста бърз начин.

Подобно на всеки друг език, Python разполага с много рамки за разработване на Backend интерфейси. Някои от най-популярните са Django, Flask, Web2Py и др. Те се използват за настройка на нещата доста бързо и ви помагат да започнете с бизнес логиката на вашето приложение и взаимодействието с вашия слой база данни. В тази статия ще разгледаме основно Flask и как можете да разработите интерфейс за програмиране на приложения (API) с Flask доста бързо, който може да ви извлече мемове и цитати.

Какво е Flask

Flask е микро уеб рамка, която се използва за разработване на бекенд интерфейс за вашето приложение. Това е лека рамка, която има малък отпечатък и може да се използва за настройка на нещата доста бързо, с просто, но разширяемо ядро. Докато говорим за Backend, трябва да разберем, че това е услугата, която изпраща данни от сървъра до потребител, който присъства от страната на клиента.

С нарастването на сложните приложения, които разчитат на архитектурни модели за мащабиране, услугите сега се разбиват на компоненти, които се управляват от представителен API. С API всяка услуга може да бъде разгърната независимо и предлага подобрено изолиране на грешки. Тези API могат да бъдат свързани с отделни задачи и могат също така да се използват за комуникация помежду си за предаване на данни.

Тези API могат да се използват за завършване на операциите и следователно се използват широко за разработване на Backend интерфейси и да ги накарат да комуникират с интерфейса от страна на клиента. Един от най-разпространените API шаблони, които се използват днес, е REST API, където REST означава Representational State Transfer. Те използват протокола за прехвърляне на хипертекст (HTTP) и могат да бъдат комуникирани чрез HTTP заявка, която указва операцията, която трябва да бъде извършена.

Flask може да се използва за разработване на тези REST API, където могат да се използват прости HTTP методи за комуникация между интерфейсите от страна на клиента и от страна на сървъра. Всяка заявка за API се състои от четири части: Крайна точка, Метод, ЗаглавкаиТяло.

Крайната точка дефинира URL маршрута, който се иска от потребителя, докато методът дефинира типа на заявката. Може да бъде GET, POST, DELETE или PUT/PATCH заявка. Заглавката е част от информацията, която обикновено се предава за удостоверяване между клиента и сървъра, докато тялото решава информацията, която трябва да предадем на сървъра.

Това беше доста бърз начин да се обобщи всичко, което се случва от страната на сървъра. Нека видим как Flask може да се използва за бързо съставяне на API, който може да ни върне дата-час на текущата ни заявка във формат JSON:

Успяхме да съставим две крайни точки за нашия API на Flask в рамките на 15 реда код. Декораторът @app.route картографира HTTP заявките към функциите и връща HTTP отговорите под формата на JSON. jsonifyобвива Datetime в съобщение и го предава като HTTP отговор.

Нека изградим приложението

Сега ще изградим API, който може да извлича мемове за нас и ще дефинираме множество крайни точки за нашето приложение, за да предоставим възможности за разширяване и персонализиране на потребителя. Ще използваме Praw, който е Python Reddit API Wrapper, за да ни помогне да извличаме мемове директно от Reddit. Нека започнем със създаването на виртуална среда за нашата цел.

Създайте папка за целия си код и отворете инструмента за команден ред за вашата операционна система и въведете следните команди:

$ pip install virtualenv

След като virtualenv бъде инсталиран, можете да активирате виртуална среда, като натиснете проста команда:

$ virtualenv env

Това ще създаде нов изпълним файл на Python във вашата текуща директория. След като настройката приключи, можете да продължите напред с активиране на виртуалната среда:

$ activate

Можете алтернативно да deactivate вашата виртуална среда с проста команда, ако е необходимо. Нека да продължим към създаването на прост Flask API. Въведете следната команда и въведете:

$ pip install flask

Отворете VS Code/PyCharm и направете файл app.py и въведете следния код:

Стартирайте своя код, като отворите командния ред и натиснете: python app.py. Това ще стартира вашия код и ще имате уеб сървър, работещ на порт 5000 със съобщението 'Hello World from Python Flask!'. Доста лесно, нали?

Нека дефинираме логическия слой за нашия API в отделен файл. Ще ни трябва praw за нашата цел, така че ще го инсталираме чрез Python Package Manager:

$ pip install praw

Отидете на Страницата с документация на Praw и вижте как можете да извършите OAuth удостоверяване, преди да можете да използвате Wrapper във вашия API. Можете да регистрирате приложението си с цел изграждане на уеб приложение и ще получите следното:

  1. Идентификационен номер на клиент, който е низ от 14 знака.
  2. Клиентска тайна, която е низ от 27 знака.
  3. Парола за акаунта в Reddit, който използвате.
  4. Потребителско име за вашия Reddit акаунт.

Нека създадем файл с име Main.py, за да дефинираме нашите логически функции тук. Нека удостоверим това, като стартираме потребителско изпълнение за нашето приложение:

Нека сега дефинираме функция, която може да се използва за проверка дали нашето изображение е JPEG/PNG или не. Това ще се използва за проверка дали изображението, което получаваме, е валидно изображение или не:

Нека вземем Meme сега. Ще дефинираме функция, в която предаваме два параметъра: sub, което означава Subreddit, откъдето искаме да извлечем мемовете, и count, което означава броя на мемовете, които искаме да извлечем. Нека дефинираме функцията сега:

Ще получим Заглавие, URL, гласове за, гласове против, URL адрес на Redditи Subredditи ще ги добавим към резултата и ще го върнем от функцията. Ще дефинираме подобна функция, за да получим котировките и от Subreddit, както и посочения брой:

Изпращанетодефинира най-горещите изпращания в конкретен Subreddit, а selftextдефинира съдържанието на Markdown за конкретно изпращане. Останалата част от кода е доста разбираема и можете да си поиграете с нея, преди да дефинирате допълнително крайните точки на API.

Нека изградим API

Върнете се към файла app.py и нека започнем с дефинирането на крайните точки на REST API за нашето приложение. Премахнете целия код, който бяхме написали по-рано в нашия файл, тъй като ще започнем отначало. Нека първо дефинираме Subreddits, откъдето искаме да извлечем нашите мемета и да инициализираме нашето Flask приложение, като импортираме необходимите библиотеки и създадем работещо приложение:

Нека сега добавим декораторите над отделните функции, което ги преобразува в „Маршрут“, който дефинира нови URL адреси за нашата Backend услуга. Нека създадем крайната точка, която да представя нашето съобщение „Добре дошли“ на екрана, след като потребителят стартира API:

Нека да знаем, че дефинираме крайна точка, която ще се върне като мем от случаен Subreddit. Ще използваме функцията get_meme() и check_image(), която дефинирахме по-рано в нашия файл Main.py, за да извлечем произволни мемове. Ще вземем заглавието, URL адреса на публикацията, гласовете за/против, URL адреса на снимката и накрая Subreddit, откъдето мемът е извлечен.

Нека сега дефинираме маршрут, който ни връща мем от Subreddit по наш избор. Ние ще поставим нашия код в блок Try-Catch, само за да гарантираме, че се връща съобщение 404, ако Subreddit не съществува. Ние ще върнем всички данни като JSON с Random Meme от конкретния Subreddit, от който извличаме.

Кодът за това е доста разбираем, така че нека продължим напред към изграждането на повече крайни точки и добавянето на повече функционалност към нашия API с всички функции, които бяхме дефинирали по-рано.

Сега ще създадем крайна точка, която ни извлича мемове според броя на броя. Нека напишем кода за това сега:

Тук добавяме брой от 50, така че ако потребителят поиска повече от 50 мемета, ние ще изпратим съответно съобщение за грешка. Ще внедрим друг маршрут, който може да ни извлече няколко мемета от конкретен Subreddit. Нека приложим това:

Нека да видим какви крайни точки сме внедрили досега:

  1. /givememe:Връща произволно меме от всеки Subreddit, който сме дефинирали.
  2. /givememe/‹sub›:Връща мем от Subreddit, който потребителят е посочил.
  3. /givememe/‹int: c›:Връща брой мемета от всеки Subreddit, който сме дефинирали.
  4. /givememe/sub/‹int: c›:Връща брой мемета от Subreddit, който потребителят е посочил.

Сега ще дефинираме подобни маршрути за извличане на текста като котировки, както и от Subreddits. Кодът е доста ясен и можете да го прегледате набързо, докато прилагаме допълнителни маршрути тук.

Нека внедрим маршрут за извличане на оферта от Subreddit, посочен от потребителя:

Нека внедрим окончателен функционален маршрут сега, за да върнем определен брой цитати от конкретен Subreddit:

Ще дефинираме и маршрут 404, така че потребителят да може да се върне към съобщение за грешка, ако е насочил към неопределен URL адрес.

Сега, след като изградихме нашия API, нека добавим този последен блок от код, който стартира нашето приложение.

Тестване на API

Сега, след като изградихме всички наши API крайни точки и дефинирахме логиката в тях, ще продължим с тестването на нашия API във всички подходящи крайни точки. Тук ще използвам Postman, за да тествам нашите крайни точки на API. Ако не сте инсталирали Postman, можете да използвате вашия браузър, за да тествате всички крайни точки на API.

Отворете вашия инструмент за команден ред и въведете командата:

$ python app.py

Това ще стартира сървъра на порт 5000. Отворете Postman и създайте нова заявка. Нека въведем крайната точка на API: http://localhost:5000/givememe, за да създадем заявка:

Можем допълнително да експериментираме това и с другите крайни точки, за да проучим допълнително как работи и функционира нашият API. Нека проверим друга крайна точка на API, за да извлечем 15 произволни мемета, като подадем: http://localhost:5000/givememe/15, за да създадем заявка:

По желание можете да тествате тези крайни точки и на вашия браузър и те ще ви изпратят подходящ JSON отговор. Вече сте свободни да експериментирате с тези крайни точки и да ги персонализирате според вашите нужди и цели.

Заключение

В тази статия разгледахме тънкостите на разработката на API и как можете да съставите API за микроуслуги с Flask и Python сравнително бързо, за да извлечете мемове и цитати от определени Subreddits. Научихме също как можем да дефинираме нашите крайни точки и да ги тестваме с помощта на Postman. Имаме готов напълно функционален API и вече можем да работим върху интегрирането на Front-End за приложението, което може да ни осигури и мрежа за споделяне на мемове.

И така, какво следва? С Flask можете допълнително да проучите разработването на RESTful API и внедряването му в базирани на облак услуги като Azure или Heroku. Можете да започнете да проучвате как можете да разработите мащабируеми функции с Flask, които могат да обработват множество заявки и други. За разлика от Django или Ruby on Rails, които автоматично генерират множество файлове, след като приключите с настройването им, Flask ви предоставя много повече функционалност и ви помага да дефинирате точно това, от което се нуждаете тук.