Первый проект на Flask

Содержание
Введение
FLASK_APP
url_map: Просмотр всех методов
Пример
Демо API
Другие статьи о Flask

Введение

Предположим, что вы уже умеете писать какой-то код с помощью Flask. Если нет - прочитайте статью «Основы Flask»

Вы можете создать какой-то .py файл и запустить его командой python example.py. У вас всё работате и открыв 127.0.0.1:5000 в браузере или сделав запрос к своему REST API вы видите нужный результат.

Это хорошее начало, но пока что только первый шаг к созданию приложения на Flask

FLASK_APP

Чтобы показать Flask в каком файле находится приложение нужно присвоить правильное значение переменной FLASK_APP.

Допустим вы делаете сайт TopBicycle.ru и код вашего приложения сохраненён как topBicycle.py

Если вы в Windows выполните

set FLASK_APP=topBicycle.py

Или export для Linux

export FLASK_APP=topBicycle.py

Без пробелов вокруг =

На время разработки приложения присвойте переменной FLASK_ENV значение development

set FLASK_ENV=development

Или export для Linux

export FLASK_ENV=development

development упростит нам разработку, например, в этом режиме Flask будет следить за изменением исходного кода и автоматически перезапускать сервер.

Теперь вы можете перейти в папку с вашим .py файлом и выполнить flask run чтобы запустить приложение

flask run

(topBicycle_venv) C:\Users\Andrei\PycharmProjects\topBicycle>flask run * Serving Flask app "topBicycle.py" (lazy loading) * Environment: development * Debug mode: on * Restarting with stat * Debugger is active! * Debugger PIN: 131-857-324 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

Просмотр всех методов

Чтобы посмотреть какие url слушает ваше приложение и какие HTTP методы в данный момент поддерживает каждая url можно перейти в интерактивный режим и воспользоваться .url.map

CTRL + C python import topBicycle topBicycle.app.url_map

Map([<Rule '/' (OPTIONS, GET, HEAD) -> welcome>, <Rule '/static/<filename>' (OPTIONS, GET, HEAD) -> static>])

Показаны все обслуживаемые url, в нашем случае одна / названия функций и разрешенные методы.

Пример

В качестве первого проекта сделаем простое приложение, которое на главной странице будет показывать статичный html а на странице /count_views будет вести подсчёт посещений

Назовём файл project.py

from flask import Flask, render_template, abort, jsonify, request, redirect, url_for app = Flask(__name__) @app.route("/") def home(): return render_template("home.html") counter = 0 @app.route("/count_views/") def count_views(): global counter counter += 1 return "This page was served " + str(counter) + " times"

Нужно в директории с project.py создать директорию templates и в ней создать какой-то простой .html файл назвать его home.html

Также не забудьте про export или set если вы под Windows

export FLASK_APP=project.py

Теперь по адресу

127.0.0.1:5000/

Будет ваш home.html файл а по адресу

127.0.0.1:5000/count_views/

Будет счётчик посещений в виде текста

This page was served X times

Когда проект готов, нужно воспользоваться Freeze для того, чтобы сохранить список зависимостей в файл requirements.txt

python -m pip freeze > projects/your_project/requirements.txt

Этот файл requirements.txt нужно будет отправить на сервер для деплоя или просто сохранить чтобы потом вернуться к работе над проектом

Общие правила создания проектов на Flask

Создадим в проекте папку static и поместим туда изображение flasklogo.png

Создадим папку templates а внутри этой папки файлы home.html и base.html

base.html будет шаблоном, который мы будем использовать для home.html и многих других файлов, которые создадим в будущем.

Работу с шаблонами разберём в следующем уроке - «Шаблоны Jinja»

Изображение баннера

Пример API на основе Flask

from flask import Flask, jsonify, request app = Flask(__name__) @app.route('/') def hello_world(): return 'Hello! This is www.qaces.ru, www.devhops.ru, www.justapi.ru or www.testsetup.ru' @app.route('/get', methods = ['GET']) def api_get(): return '200' @app.route('/put', methods = ['PUT']) def api_put(): return '200' @app.route('/order/<int:put_id>', methods = ['PUT']) def show_put(put_id): # show the post with the given id, the id is an integer return 'Order with id %d was added to the system. Thank you!' % put_id @app.route('/prod_order/<int:order_id>', methods = ['PUT']) def prod_order_put(order_id): # show the put with the given id, the id is an integer if (isinstance(order_id, int)): if (order_id < 20000 and order_id > 9999): ok_response = ('PO with id %d created.' % order_id) return jsonify({"Success": ok_response}), 200 else: content = "order value is not allowed" #return '412' #abort(400) return jsonify({"Error":"This order value is not allowed"}), 412 else: #return '412' #abort(400) return jsonify({"Error":"Order value should be integer"}), 412 @app.route('/post/<int:post_id>', methods = ['POST']) def show_post(post_id): # show the post with the given id, the id is an integer return 'Post %d' % post_id @app.route('/multiply_two', methods = ['GET', 'PUT', 'POST']) def multiply_two(): if request.method == 'GET': return '''This endpoint allows to multiply numbers.\n Use POST method to send two numbers \n factor_1 and factor_2 \n of type int or float. \n For POST: \n format request body as JSON. \n set content-type header to \n application\json \n Response will include info about \n their product. \n ''' elif request.method == 'PUT': success = True factor_1_str = request.args.get('factor_1') factor_2_str = request.args.get('factor_2') try: factor_1 = float(factor_1_str) except: return jsonify({"Error 412":"factor_1 is not a number"}), 412 err412 = True success = False factor_2 = float(factor_2_str) if success: product = factor_1 * factor_2 ok_response = (f'Product of {factor_1} and {factor_2} is {product}') return jsonify({"Success":ok_response}), 200 elif request.method == 'POST': # show the post with the given id, the id is an integer #return 'Post %d' % post_id req_data = request.get_json() try: factor_1 = float(req_data['factor_1']) except: return jsonify({"Error 412":"factor_1 is not a number"}), 412 err412 = True success = False try: factor_2 = float(req_data['factor_2']) except: return jsonify({"Error 412":"factor_1 is not a number"}), 412 err412 = True success = False if success: product = factor_1 * factor_2 ok_response = ('Product of {} and {} is {}'.format(factor_1, factor_2, product)) return jsonify({"Success":ok_response}), 200 if __name__ == '__main__': app.run()

Похожие статьи
Flask
Основы
Python
Запуск Flask на хостинге
Запуск Flask на Linux сервере
Flask в Docker
Первый проект на Flask
Шаблоны Jinja
Web Forms
Blueprint - Чертежи Flask
Как разбить приложение Flask на части
Flask FAQ
Ошибки
Декораторы в Python
HTML
CSS
Фреймворки
Изображение баннера

Поиск по сайту

Подпишитесь на Telegram канал @aofeed чтобы следить за выходом новых статей и обновлением старых

Перейти на канал

@aofeed

Задать вопрос в Телеграм-группе

@aofeedchat

Контакты и сотрудничество:
Рекомендую наш хостинг beget.ru
Пишите на info@urn.su если Вы:
1. Хотите написать статью для нашего сайта или перевести статью на свой родной язык.
2. Хотите разместить на сайте рекламу, подходящую по тематике.
3. Реклама на моём сайте имеет максимальный уровень цензуры. Если Вы увидели рекламный блок недопустимый для просмотра детьми школьного возраста, вызывающий шок или вводящий в заблуждение - пожалуйста свяжитесь с нами по электронной почте
4. Нашли на сайте ошибку, неточности, баг и т.д. ... .......
5. Статьи можно расшарить в соцсетях, нажав на иконку сети: