Первый проект на 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()