diff --git a/flask_applications/NAT.png b/flask_applications/NAT.png new file mode 100644 index 0000000..3a2ce5f Binary files /dev/null and b/flask_applications/NAT.png differ diff --git a/flask_applications/arch.png b/flask_applications/arch.png new file mode 100644 index 0000000..4ccfa22 Binary files /dev/null and b/flask_applications/arch.png differ diff --git a/flask_applications/flask1.ipynb b/flask_applications/flask1.ipynb index 3f89fa7..fa0966c 100644 --- a/flask_applications/flask1.ipynb +++ b/flask_applications/flask1.ipynb @@ -2,9 +2,6 @@ "cells": [ { "cell_type": "markdown", - "metadata": { - "collapsed": true - }, "source": [ "# Пишем сайты на питоне\n", "\n", @@ -28,7 +25,7 @@ "\n", "IP\n", "* *IP-адрес* — (пока что) набор из 4 байт, присваиваемый каждому подключённому к сети устройству\n", - "* Некоторые IP-адреса уникальны, некоторые — нет (внутренние адреса в локальных сетях)\n", + "* Некоторые IP-адреса уникальны, некоторые — нет (внутренние адреса в локальных сетях). Подробнее про [private_network](https://en.wikipedia.org/wiki/Private_network) и про [NAT](https://en.wikipedia.org/wiki/Network_address_translation)\n", "* Практически любой ресурс (например, сайт) можно получить по его IP-адресу (например, через браузер)\n", "* Существуют зарезервированные адреса и диапазоны адресов, например, `127.0.0.1` — адрес данного устройства\n", "\n", @@ -38,6 +35,10 @@ "* Веб-сервер может прослушивать некоторые порты (listen to ports) и по-разному обрабатывать сообщения, поступившие на разные порты\n", "* Если порт не прослушивается, сообщения на этот порт останутся без ответа\n", "\n", + "Сокет(*Socket*) - конечная точка соединения, которая задается парой (`IP:port`)\n", + "\n", + "\n", + "\n", "\n", "__URL__\n", "\n", @@ -62,6 +63,11 @@ "\n", "Написать сайт на питоне значит написать такую программу, которая может работать веб-сервером или использоваться веб-сервером для порождения HTML-кода веб-страниц. Для этого существует несколько модулей, например, Django и Flask\n", "\n", + "\n", + "__Пример архитектуры__\n", + "\n", + "\n", + "\n", "## flask\n", "\n", "### Intro\n", @@ -93,52 +99,58 @@ "\n", "\n", "#### Пример готового сайта на flask:" - ] + ], + "metadata": { + "collapsed": true + } }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - " * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)\n", - "127.0.0.1 - - [29/May/2018 16:23:17] \"GET / HTTP/1.1\" 200 -\n", - "127.0.0.1 - - [29/May/2018 16:23:17] \"GET /favicon.ico HTTP/1.1\" 404 -\n", - "127.0.0.1 - - [29/May/2018 16:23:17] \"GET /favicon.ico HTTP/1.1\" 404 -\n", - "127.0.0.1 - - [29/May/2018 16:23:17] \"GET / HTTP/1.1\" 200 -\n" - ] - } - ], + "execution_count": 4, "source": [ "from flask import Flask\n", "\n", "app = Flask(__name__)\n", "\n", - "@app.route('/')\n", + "@app.route('/', methods=[\"GET\"])\n", "def index():\n", " return '
Hello, world!
'\n", "\n", "if __name__ == '__main__':\n", " app.run(debug=False)" - ] + ], + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + " * Serving Flask app '__main__' (lazy loading)\n", + " * Environment: production\n", + "\u001b[31m WARNING: This is a development server. Do not use it in a production deployment.\u001b[0m\n", + "\u001b[2m Use a production WSGI server instead.\u001b[0m\n", + " * Debug mode: off\n" + ] + }, + { + "output_type": "stream", + "name": "stderr", + "text": [ + " * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)\n" + ] + } + ], + "metadata": {} }, { "cell_type": "markdown", - "metadata": {}, "source": [ "Каждая страница сайта порождается какой-то функцией. Декоратор `@app.route(...)` перед функцией показывает, какой адрес будет у страницы, за которую отвечает эта функция:" - ] + ], + "metadata": {} }, { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], "source": [ "@app.route('/')\n", "def index():\n", @@ -147,46 +159,46 @@ "@app.route('/hi')\n", "def hi():\n", " return 'Hi!'" - ] + ], + "outputs": [], + "metadata": { + "collapsed": true + } }, { "cell_type": "markdown", - "metadata": {}, "source": [ "Одна функция может отвечать за несколько разных страниц:\n", "* Во-первых, декораторов может стоять несколько подряд.\n", "* Во-вторых, декораторы могут содержать переменные.\n", "\n", "Пример:" - ] + ], + "metadata": {} }, { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], "source": [ "@app.route('/user/Слишком длинное имя!
\n", "{% else %}\n", "{{ username }}
\n", "{% endif %}" - ] + ], + "outputs": [], + "metadata": { + "collapsed": true + } }, { "cell_type": "markdown", - "metadata": {}, "source": [ "## Словари в шаблонах\n", "\n", "Предположим, у нас есть словарь, в котором хранятся имена наших друзей и их почтовые адреса. И мы хотим выводить эти имена с адресами на нашем сайте. Мы можем написать что-то такое:\n" - ] + ], + "metadata": {} }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 3, "source": [ "from flask import Flask\n", "from flask import render_template\n", @@ -362,20 +395,41 @@ "\n", "if __name__ == '__main__':\n", " app.run()" - ] + ], + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + " * Serving Flask app '__main__' (lazy loading)\n", + " * Environment: production\n", + "\u001b[31m WARNING: This is a development server. Do not use it in a production deployment.\u001b[0m\n", + "\u001b[2m Use a production WSGI server instead.\u001b[0m\n", + " * Debug mode: off\n" + ] + }, + { + "output_type": "stream", + "name": "stderr", + "text": [ + " * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)\n", + "127.0.0.1 - - [19/Nov/2021 09:09:01] \"GET / HTTP/1.1\" 200 -\n", + "127.0.0.1 - - [19/Nov/2021 09:09:01] \"\u001b[33mGET /favicon.ico HTTP/1.1\u001b[0m\" 404 -\n" + ] + } + ], + "metadata": {} }, { "cell_type": "markdown", - "metadata": {}, "source": [ "Тогда в папке `templates` нам нужно создать файл `index.html`, в котором будут перебираться элементы словаря. Делается это с помощью функции `items()`. Вот так будет выглядеть `index.html`:" - ] + ], + "metadata": {} }, { "cell_type": "code", "execution_count": null, - "metadata": {}, - "outputs": [], "source": [ "\n", "\n", @@ -392,22 +446,22 @@ "\n", "\n", "