Первый проект на 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.site, www.justapi.ru or www.testsetup.site' @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()

Автор статьи: Андрей Олегович