Latest posts on Вопрос про Flask topichttp://python.su/forum/topic/41918/2022-11-02T14:29:48+02:00Веб-технологии :: Web :: Вопрос про Flask
2022-11-02T14:29:48+02:00ZerG2246641. Не нужно в одной теме пложить разные вопросы - это не чат<br/>2. Вам уже ответили<br/><a href="https://python.su/forum/topic/42115/">https://python.su/forum/topic/42115/</a>
Веб-технологии :: Web :: Вопрос про Flask
2022-11-02T11:18:42+02:00lonesygrind1221224649Помгите. <br/><br/>@app.route(“/”)<br/>def get_messages():<br/> return {“messages”: all_messages}<br/><br/>app.run()<br/><br/>all_messages подсвечивается красным<br/>problem: Unresolved reference ‘all_messages’
Веб-технологии :: Web :: Вопрос про Flask
2022-09-08T09:22:45+03:00ZerG223937создайте для начала тестовый файл в котором реализуйте методы чтения записи в базу - когда получиться<br/>пихайте уже в фласк
Веб-технологии :: Web :: Вопрос про Flask
2022-09-05T23:56:46+03:00pyser223926И снова я со своими баранами…<br/><br/>Решил я что лучше будет изучать создание приложений с БД MySQL. Нашёл я пару статей про всё это дело и решил самому написать, простенькое приложение, которое будет принимать через форму имя пользователя, сохранять его в БД а потом, на другой странице должно появится приветствие с именем взятым из БД.<br/><br/>Проблема в том, что я опять что-то делаю не так и имя в БД никак не хочет попадать. Будет круто если кто-то подскажет где я накосячил.<br/><br/>Код: <br/>main.py<br/><div class="code"><pre> <span class="kn">from</span> <span class="nn">flask</span> <span class="kn">import</span> <span class="n">Flask</span><span class="p">,</span> <span class="n">redirect</span><span class="p">,</span> <span class="n">render_template</span><span class="p">,</span> <span class="n">url_for</span>
<span class="kn">from</span> <span class="nn">flask_mysqldb</span> <span class="kn">import</span> <span class="n">MySQL</span>
<span class="kn">from</span> <span class="nn">flask_wtf</span> <span class="kn">import</span> <span class="n">FlaskForm</span>
<span class="kn">from</span> <span class="nn">wtforms</span> <span class="kn">import</span> <span class="n">StringField</span><span class="p">,</span> <span class="n">SubmitField</span>
<span class="kn">from</span> <span class="nn">wtforms.validators</span> <span class="kn">import</span> <span class="n">DataRequired</span>
<span class="n">app</span> <span class="o">=</span> <span class="n">Flask</span><span class="p">(</span><span class="vm">__name__</span><span class="p">)</span>
<span class="n">app</span><span class="o">.</span><span class="n">config</span><span class="p">[</span><span class="s1">'SECRET_KEY'</span><span class="p">]</span> <span class="o">=</span> <span class="s1">'1234567989'</span>
<span class="n">app</span><span class="o">.</span><span class="n">config</span><span class="p">[</span><span class="s1">'MYSQL_USER'</span><span class="p">]</span> <span class="o">=</span> <span class="s1">'root'</span>
<span class="n">app</span><span class="o">.</span><span class="n">config</span><span class="p">[</span><span class="s1">'MYSQL_PASSWORD'</span><span class="p">]</span> <span class="o">=</span> <span class="s1">'password'</span>
<span class="n">app</span><span class="o">.</span><span class="n">config</span><span class="p">[</span><span class="s1">'MYSQL_HOST'</span><span class="p">]</span> <span class="o">=</span> <span class="s1">'localhost'</span>
<span class="n">app</span><span class="o">.</span><span class="n">config</span><span class="p">[</span><span class="s1">'MYSQL_DB'</span><span class="p">]</span> <span class="o">=</span> <span class="s1">'nametest'</span>
<span class="n">app</span><span class="o">.</span><span class="n">config</span><span class="p">[</span><span class="s1">'MYSQL_CURSORCLASS'</span><span class="p">]</span> <span class="o">=</span> <span class="s1">'DictCursor'</span>
<span class="n">mysql</span> <span class="o">=</span> <span class="n">MySQL</span><span class="p">(</span><span class="n">app</span><span class="p">)</span>
<span class="k">class</span> <span class="nc">NameForm</span><span class="p">(</span><span class="n">FlaskForm</span><span class="p">):</span>
<span class="n">name</span> <span class="o">=</span> <span class="n">StringField</span><span class="p">(</span><span class="s1">'Your name'</span><span class="p">,</span> <span class="n">validators</span><span class="o">=</span><span class="p">[</span><span class="n">DataRequired</span><span class="p">()])</span>
<span class="n">submit</span> <span class="o">=</span> <span class="n">SubmitField</span><span class="p">(</span><span class="s1">'Say your Name'</span><span class="p">)</span>
<span class="nd">@app.route</span><span class="p">(</span><span class="s1">'/'</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">index</span><span class="p">():</span>
<span class="k">return</span> <span class="n">render_template</span><span class="p">(</span><span class="s1">'index.html'</span><span class="p">)</span>
<span class="nd">@app.route</span><span class="p">(</span><span class="s1">'/say_name'</span><span class="p">,</span> <span class="n">methods</span><span class="o">=</span><span class="p">[</span><span class="s1">'GET'</span><span class="p">,</span> <span class="s1">'POST'</span><span class="p">])</span>
<span class="k">def</span> <span class="nf">say</span><span class="p">():</span>
<span class="n">form</span> <span class="o">=</span> <span class="n">NameForm</span><span class="p">()</span>
<span class="k">if</span> <span class="n">form</span><span class="o">.</span><span class="n">validate_on_submit</span><span class="p">():</span>
<span class="n">name</span> <span class="o">=</span> <span class="n">form</span><span class="o">.</span><span class="n">name</span><span class="o">.</span><span class="n">data</span><span class="p">()</span>
<span class="n">curs</span> <span class="o">=</span> <span class="n">mysql</span><span class="o">.</span><span class="n">connection</span><span class="o">.</span><span class="n">cursor</span><span class="p">()</span>
<span class="n">curs</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="n">f</span><span class="s2">"INSERT INTO tbl_names VALUES('NULL, {name}')"</span><span class="p">)</span>
<span class="n">mysql</span><span class="o">.</span><span class="n">connection</span><span class="o">.</span><span class="n">commit</span><span class="p">()</span>
<span class="n">curs</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
<span class="k">print</span><span class="p">(</span><span class="s2">"Saved "</span> <span class="o">+</span> <span class="n">name</span><span class="p">)</span>
<span class="k">return</span> <span class="n">redirect</span><span class="p">(</span><span class="n">url_for</span><span class="p">(</span><span class="s1">'hello'</span><span class="p">))</span>
<span class="k">return</span> <span class="n">render_template</span><span class="p">(</span><span class="s1">'say_name.html'</span><span class="p">,</span> <span class="n">form</span><span class="o">=</span><span class="n">form</span><span class="p">)</span>
<span class="nd">@app.route</span><span class="p">(</span><span class="s1">'/hello'</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">hello</span><span class="p">():</span>
<span class="n">curs</span> <span class="o">=</span> <span class="n">mysql</span><span class="o">.</span><span class="n">connection</span><span class="o">.</span><span class="n">cursor</span><span class="p">()</span>
<span class="n">curs</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="n">f</span><span class="s1">'SELECT * FROM tbl_names'</span><span class="p">)</span>
<span class="n">data</span> <span class="o">=</span> <span class="n">curs</span><span class="o">.</span><span class="n">fetchone</span><span class="p">()</span>
<span class="k">print</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
<span class="n">curs</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
<span class="k">return</span> <span class="n">render_template</span><span class="p">(</span><span class="s1">'hello.html'</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="n">data</span><span class="p">)</span>
<span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s1">'__main__'</span><span class="p">:</span>
<span class="n">app</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="n">debug</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
</pre></div><br/>say_name.html<br/><div class="code"><pre> <span class="p">{</span><span class="o">%</span> <span class="n">extends</span> <span class="s1">'basic.html'</span> <span class="o">%</span><span class="p">}</span>
<span class="p">{</span><span class="o">%</span> <span class="n">block</span> <span class="n">title</span> <span class="o">%</span><span class="p">}</span> <span class="n">Say</span> <span class="n">Name</span> <span class="n">Form</span> <span class="p">{</span><span class="o">%</span> <span class="n">endblock</span> <span class="o">%</span><span class="p">}</span>
<span class="p">{</span><span class="o">%</span> <span class="n">block</span> <span class="n">content</span> <span class="o">%</span><span class="p">}</span>
<span class="o"><</span><span class="n">form</span> <span class="n">action</span><span class="o">=</span><span class="s2">"http://127.0.0.1:5000/say_name"</span> <span class="n">method</span><span class="o">=</span><span class="s2">"POST"</span><span class="o">></span>
<span class="p">{{</span> <span class="n">form</span><span class="o">.</span><span class="n">name</span><span class="o">.</span><span class="n">label</span> <span class="p">}}</span> <span class="p">{{</span> <span class="n">form</span><span class="o">.</span><span class="n">name</span><span class="p">()</span> <span class="p">}}</span>
<span class="p">{{</span> <span class="n">form</span><span class="o">.</span><span class="n">submit</span><span class="p">()</span> <span class="p">}}</span>
<span class="o"></</span><span class="n">form</span><span class="o">></span>
<span class="p">{</span><span class="o">%</span> <span class="n">endblock</span> <span class="o">%</span><span class="p">}</span>
</pre></div><br/>hello.html<br/><div class="code"><pre> <span class="p">{</span><span class="o">%</span> <span class="n">extends</span> <span class="s1">'basic.html'</span> <span class="o">%</span><span class="p">}</span>
<span class="p">{</span><span class="o">%</span> <span class="n">block</span> <span class="n">title</span> <span class="o">%</span><span class="p">}</span> <span class="n">Hello</span> <span class="n">Page</span> <span class="p">{</span><span class="o">%</span> <span class="n">endblock</span> <span class="o">%</span><span class="p">}</span>
<span class="p">{</span><span class="o">%</span> <span class="n">block</span> <span class="n">content</span> <span class="o">%</span><span class="p">}</span>
<span class="o"><</span><span class="n">h1</span><span class="o">></span><span class="n">Hello</span><span class="p">,</span> <span class="p">{{</span> <span class="n">data</span> <span class="p">}}</span><span class="o"></</span><span class="n">h1</span><span class="o">></span>
<span class="p">{</span><span class="o">%</span> <span class="n">endblock</span> <span class="o">%</span><span class="p">}</span>
</pre></div>
Веб-технологии :: Web :: Вопрос про Flask
2022-09-03T22:26:29+03:00pyser223914<blockquote><em>py.user.next</em><br/></blockquote>Ок, спасибо за дельные советы
Веб-технологии :: Web :: Вопрос про Flask
2022-09-02T08:15:52+03:00py.user.next223893<blockquote><em>pyser</em><br/>поэтому и получается что ищу возможность создавать таблицы на ходу</blockquote>Там можно создавать. Способов много, какой из них самый правильный, мне неизвестно, так как SQLAlchemy я не изучал вообще, потому что она стоит там у меня на десятом месте по приоритету, если не на двадцатом. Читай доку, ищи сообщества, в которых фанатеют от SQLAlchemy. Здесь ты можешь зайти в Telegram-канал, выслушать все истории про тайский бокс, мотоциклы и булочки и, может быть, там тебе скажут, как создать таблицу и добавить её в базу, а может и нет. Я просто к тому, что зачем её создавать на лету, если приложение у тебя должно быть полностью спроектировано ещё до его написания, и, соответственно, все таблицы у тебя уже к началу этого написания уже должны быть все придуманы, спроектированы и распланированы. Даже если ты поднимаешь версию приложения и добавляешь эту таблицу, которой не было раньше, ты всё равно просто перезапускаешь приложение, которое в итоге все эти таблицы один раз создаёт или подцепляет в самом начале при запуске.<br/><br/><blockquote><em>pyser</em><br/>Да, я как раз думал на второй ноут установить Линукс дистрибутив. Кстати, что лучше ставить начинающему? Я думал ставить какой-нибудь Ubuntu или Linux Mint. Толком ещё не вдавался в подробности по этому поводу.</blockquote>Они сейчас все одинаковые. Это раньше они сильно различались на те, которые нужно было сначала сидеть компилировать целую неделю, чтобы просто что-то запустить хотя бы, и те, которые можно было сразу поставить. Сейчас большинство из них ставится сразу, а потом ты уже в них разбираешься детально.<br/>Ставь Ubuntu или Fedora. Используй в них KDE по возможности, она более функциональная, чем GNOME. Дальше сможешь без переустановки на другие графические системы переехать. Это не винда, где всё надо переустанавливать чуть что.
Веб-технологии :: Web :: Вопрос про Flask
2022-09-02T07:13:29+03:00pyser223890<blockquote>Ну, оно должно все ошибки писать либо в консоль, либо в самом браузере. К тому же любые изменения файлов должы сразу отражаться на приложении без перезапуска тестового сервера.<br/></blockquote>Я тоже подумал что должно было выводится сообщение о том что что-то не так<br/><br/><blockquote>Это вопрос относится к SQLAlchemy. К Flask'у это вообще никаким боком.<br/>В SQLAlchemy куча разных способов для всего, читай документацию по ней.</blockquote><br/>Да, это я понял, просто не правильно выразился.<br/><br/><blockquote>Тут вопрос в том, а зачем тебе таблицы создавать на ходу? Все таблицы надо изначально сделать.</blockquote>Ну, это понятно. Просто сейчас пока учусь, идем приходят во время написания кода, поэтому и получается что ищу возможность создавать таблицы на ходу.<br/><br/><blockquote>Поставь себе Linux.</blockquote>Да, я как раз думал на второй ноут установить Линукс дистрибутив. Кстати, что лучше ставить начинающему? Я думал ставить какой-нибудь Ubuntu или Linux Mint. Толком ещё не вдавался в подробности по этому поводу.
Веб-технологии :: Web :: Вопрос про Flask
2022-09-02T01:20:47+03:00py.user.next223888<blockquote><em>pyser</em><br/>да, я так и запускаю, только на винде set вместо export.<br/></blockquote>Ну, оно должно все ошибки писать либо в консоль, либо в самом браузере. К тому же любые изменения файлов должы сразу отражаться на приложении без перезапуска тестового сервера.<br/><br/><blockquote><em>pyser</em><br/>Вот тут я создал БД и в ней уже есть таблица, когда я захочу к примеру сделать форму регистрации, нужно будет создать ещё одну таблицу.</blockquote>Это вопрос относится к SQLAlchemy. К Flask'у это вообще никаким боком.<br/>В SQLAlchemy куча разных способов для всего, читай документацию по ней.<br/><br/>Тут вопрос в том, а зачем тебе таблицы создавать на ходу? Все таблицы надо изначально сделать.<br/><br/><blockquote><em>pyser</em><br/>И вообще, это обязательно всё прописывать каждый раз в терминале или можно к примеру записать всё внутри if __name__ == ‘__main__’:?<br/></blockquote>Не, если тебе надо что-то сделать, то для этого надо скрипт написать, который это и делает, а потом просто запускать этот скрипт. Если ты пишешь каждый раз что-то в консоль, то задумайся “а почему я скрипт не написал ещё для этого, который всё это делает вместо меня?”. Даже в винде этой тупой есть батники, ими и скриптуют обычно там всё ещё с древних времён.<br/><br/>Вот пример простейший, там db.create_all() под воротами<br/><a href="https://pythonbasics.org/flask-sqlalchemy/">https://pythonbasics.org/flask-sqlalchemy/</a><br/><div class="code"><pre>
<span class="kn">from</span> <span class="nn">flask</span> <span class="kn">import</span> <span class="n">Flask</span><span class="p">,</span> <span class="n">request</span><span class="p">,</span> <span class="n">flash</span><span class="p">,</span> <span class="n">url_for</span><span class="p">,</span> <span class="n">redirect</span><span class="p">,</span> <span class="n">render_template</span>
<span class="kn">from</span> <span class="nn">flask_sqlalchemy</span> <span class="kn">import</span> <span class="n">SQLAlchemy</span>
<span class="n">app</span> <span class="o">=</span> <span class="n">Flask</span><span class="p">(</span><span class="vm">__name__</span><span class="p">)</span>
<span class="n">app</span><span class="o">.</span><span class="n">config</span><span class="p">[</span><span class="s1">'SQLALCHEMY_DATABASE_URI'</span><span class="p">]</span> <span class="o">=</span> <span class="s1">'sqlite:///students.sqlite3'</span>
<span class="n">app</span><span class="o">.</span><span class="n">config</span><span class="p">[</span><span class="s1">'SECRET_KEY'</span><span class="p">]</span> <span class="o">=</span> <span class="s1">'random string'</span>
<span class="n">db</span> <span class="o">=</span> <span class="n">SQLAlchemy</span><span class="p">(</span><span class="n">app</span><span class="p">)</span>
<span class="k">class</span> <span class="nc">students</span><span class="p">(</span><span class="n">db</span><span class="o">.</span><span class="n">Model</span><span class="p">):</span>
<span class="nb">id</span> <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">Column</span><span class="p">(</span><span class="s1">'student_id'</span><span class="p">,</span> <span class="n">db</span><span class="o">.</span><span class="n">Integer</span><span class="p">,</span> <span class="n">primary_key</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
<span class="n">name</span> <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">Column</span><span class="p">(</span><span class="n">db</span><span class="o">.</span><span class="n">String</span><span class="p">(</span><span class="mi">100</span><span class="p">))</span>
<span class="n">city</span> <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">Column</span><span class="p">(</span><span class="n">db</span><span class="o">.</span><span class="n">String</span><span class="p">(</span><span class="mi">50</span><span class="p">))</span>
<span class="n">addr</span> <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">Column</span><span class="p">(</span><span class="n">db</span><span class="o">.</span><span class="n">String</span><span class="p">(</span><span class="mi">200</span><span class="p">))</span>
<span class="n">pin</span> <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">Column</span><span class="p">(</span><span class="n">db</span><span class="o">.</span><span class="n">String</span><span class="p">(</span><span class="mi">10</span><span class="p">))</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">city</span><span class="p">,</span> <span class="n">addr</span><span class="p">,</span><span class="n">pin</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="n">name</span>
<span class="bp">self</span><span class="o">.</span><span class="n">city</span> <span class="o">=</span> <span class="n">city</span>
<span class="bp">self</span><span class="o">.</span><span class="n">addr</span> <span class="o">=</span> <span class="n">addr</span>
<span class="bp">self</span><span class="o">.</span><span class="n">pin</span> <span class="o">=</span> <span class="n">pin</span>
<span class="nd">@app.route</span><span class="p">(</span><span class="s1">'/'</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">show_all</span><span class="p">():</span>
<span class="k">return</span> <span class="n">render_template</span><span class="p">(</span><span class="s1">'show_all.html'</span><span class="p">,</span> <span class="n">students</span><span class="o">=</span><span class="n">students</span><span class="o">.</span><span class="n">query</span><span class="o">.</span><span class="n">all</span><span class="p">())</span>
<span class="nd">@app.route</span><span class="p">(</span><span class="s1">'/new'</span><span class="p">,</span> <span class="n">methods</span><span class="o">=</span><span class="p">[</span><span class="s1">'GET'</span><span class="p">,</span> <span class="s1">'POST'</span><span class="p">])</span>
<span class="k">def</span> <span class="nf">new</span><span class="p">():</span>
<span class="k">if</span> <span class="n">request</span><span class="o">.</span><span class="n">method</span> <span class="o">==</span> <span class="s1">'POST'</span><span class="p">:</span>
<span class="k">if</span> <span class="p">(</span><span class="ow">not</span> <span class="n">request</span><span class="o">.</span><span class="n">form</span><span class="p">[</span><span class="s1">'name'</span><span class="p">]</span>
<span class="ow">or</span> <span class="ow">not</span> <span class="n">request</span><span class="o">.</span><span class="n">form</span><span class="p">[</span><span class="s1">'city'</span><span class="p">]</span>
<span class="ow">or</span> <span class="ow">not</span> <span class="n">request</span><span class="o">.</span><span class="n">form</span><span class="p">[</span><span class="s1">'addr'</span><span class="p">]):</span>
<span class="n">flash</span><span class="p">(</span><span class="s1">'Please enter all the fields'</span><span class="p">,</span> <span class="s1">'error'</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">student</span> <span class="o">=</span> <span class="n">students</span><span class="p">(</span><span class="n">request</span><span class="o">.</span><span class="n">form</span><span class="p">[</span><span class="s1">'name'</span><span class="p">],</span> <span class="n">request</span><span class="o">.</span><span class="n">form</span><span class="p">[</span><span class="s1">'city'</span><span class="p">],</span>
<span class="n">request</span><span class="o">.</span><span class="n">form</span><span class="p">[</span><span class="s1">'addr'</span><span class="p">],</span> <span class="n">request</span><span class="o">.</span><span class="n">form</span><span class="p">[</span><span class="s1">'pin'</span><span class="p">])</span>
<span class="n">db</span><span class="o">.</span><span class="n">session</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">student</span><span class="p">)</span>
<span class="n">db</span><span class="o">.</span><span class="n">session</span><span class="o">.</span><span class="n">commit</span><span class="p">()</span>
<span class="n">flash</span><span class="p">(</span><span class="s1">'Record was successfully added'</span><span class="p">)</span>
<span class="k">return</span> <span class="n">redirect</span><span class="p">(</span><span class="n">url_for</span><span class="p">(</span><span class="s1">'show_all'</span><span class="p">))</span>
<span class="k">return</span> <span class="n">render_template</span><span class="p">(</span><span class="s1">'new.html'</span><span class="p">)</span>
<span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s1">'__main__'</span><span class="p">:</span>
<span class="n">db</span><span class="o">.</span><span class="n">create_all</span><span class="p">()</span>
<span class="n">app</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="n">debug</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
</pre></div>Ну, наверное, автор этого туториала прочитал это где-то в какой-то книжке и теперь так делает, или он просто код этот откуда-то скопировал у того, кто читал книжку какую-то. Сам этот автор не очень шарит, потому что мне пришлось поправлять его некоторые нарушения PEP8 какие-то элементарнейшие.<br/><br/>Я этот код через Яндекс нашёл по фразе “flask sqlalchemy example”.<br/><br/><blockquote><em>pyser</em><br/>да, я так и запускаю, только на винде set вместо export.</blockquote>Поставь себе Linux. У тебя тогда мозги разовьются больше, потому что это система для программистов, поэтому там есть очень много примеров хороших программ. И поэтому в этой среде ты будешь учиться именно хорошим всяким привычкам, в том числе и скриптованию всего и вся.
Веб-технологии :: Web :: Вопрос про Flask
2022-09-02T00:11:52+03:00pyser223887<blockquote><em>py.user.next</em><br/></blockquote>Кароче, всё заработало. Ошибка была в том чтоб в таблице я указал что дата будет браться автоматом, datetime.utcnow, в тоже время, создав форму я создал и поле для даты, видимо питон просто не понимал что я хочу делать и зачем я пытаюсь передать дату если она уже есть из функции datetime.utcnow. Я поле для даты убрал и теперь редирект работает.<br/><br/>По поводу:<br/>export FLASK_APP=app.py<br/>export FLASK_DEBUG=1<br/>flask-3 ru<br/><br/>да, я так и запускаю, только на винде set вместо export.<br/><br/><br/>Но! У меня есть ещё такой вопрос. Вот тут я создал БД и в ней уже есть таблица, когда я захочу к примеру сделать форму регистрации, нужно будет создать ещё одну таблицу. Вопрос такой, мне потом снова делать<br/>>>> from main import db<br/>>>>db.create_all()<br/>?<br/><br/>или есть команды только для обновления? И вообще, это обязательно всё прописывать каждый раз в терминале или можно к примеру записать всё внутри if __name__ == ‘__main__’:?
Веб-технологии :: Web :: Вопрос про Flask
2022-09-01T23:55:02+03:00py.user.next223885<blockquote><em>pyser</em><br/>По пробовал, никаких изменений <img src="/static/djangobb_forum/img/smilies/sad.png" /><br/>После нажатия кнопки, страница будто перезагружается вместо того чтоб срабатывал редирект.</blockquote>Просто перезагружается? У меня вообще исключение вылезло на всю страницу.<br/>Это я просто забыл, как работает url_for().<br/><br/>Для отладки запускай вот так<br/><div class="code"><pre>#!/bin/bash<br/><br/># Run local server localhost:5000<br/><br/>export FLASK_APP=app.py<br/>export FLASK_DEBUG=1<br/>flask-3 run</pre></div><br/><br/><blockquote><em>pyser</em><br/>Ну и сам create_article.html:</blockquote>Там в примерах кнопка submit ставится прямо в странице<br/><a href="https://flask-wtf.readthedocs.io/en/1.0.x/quickstart/#validating-forms">https://flask-wtf.readthedocs.io/en/1.0.x/quickstart/#validating-forms</a><br/>Попробуй убрать form.save_post() и поставить туда кнопку в виде HTML-кода, как в примерах.
Веб-технологии :: Web :: Вопрос про Flask
2022-09-01T23:42:19+03:00pyser223884<blockquote><em>py.user.next</em><br/></blockquote>По пробовал, никаких изменений <img src="/static/djangobb_forum/img/smilies/sad.png" /><br/>После нажатия кнопки, страница будто перезагружается вместо того чтоб срабатывал редирект.
Веб-технологии :: Web :: Вопрос про Flask
2022-09-01T20:38:48+03:00pyser223879Всем привет!<br/>Совсем недавно стал изучать фреймворк Flask и вот решил сделать небольшое, тестовое приложение, в стиле блога с постами. Вот только появилась такая проблема: при заполнении всех полей (title, intro, text & date) и нажатия кнопки Save, ничего не происходит. Хотя я прописал чтоб при удачном добавлении всех данных в БД, всплывало сообщение об это и происходил редирект на страницу с постами. Подскажите, что я делаю не так, возможно я что-то не так понимаю <img src="/static/djangobb_forum/img/smilies/hmm.png" /> <br/><br/>Код:<br/>Инициализация всего и вся:<br/><div class="code"><pre> <span class="kn">from</span> <span class="nn">flask</span> <span class="kn">import</span> <span class="n">Flask</span><span class="p">,</span> <span class="n">render_template</span><span class="p">,</span> <span class="n">url_for</span><span class="p">,</span> <span class="n">redirect</span><span class="p">,</span> <span class="n">flash</span>
<span class="kn">from</span> <span class="nn">flask_sqlalchemy</span> <span class="kn">import</span> <span class="n">SQLAlchemy</span>
<span class="kn">from</span> <span class="nn">forms</span> <span class="kn">import</span> <span class="n">NewsCreator</span>
<span class="kn">from</span> <span class="nn">datetime</span> <span class="kn">import</span> <span class="n">datetime</span>
<span class="n">app</span> <span class="o">=</span> <span class="n">Flask</span><span class="p">(</span><span class="vm">__name__</span><span class="p">)</span>
<span class="n">app</span><span class="o">.</span><span class="n">config</span><span class="p">[</span><span class="s1">'SECRET_KEY'</span><span class="p">]</span> <span class="o">=</span> <span class="s2">"kbfihlfnfar3r23rff32r2r2"</span>
<span class="n">app</span><span class="o">.</span><span class="n">config</span><span class="p">[</span><span class="s1">'SQLALCHEMY_TRACK_MODIFICATIONS'</span><span class="p">]</span> <span class="o">=</span> <span class="bp">False</span>
<span class="n">app</span><span class="o">.</span><span class="n">config</span><span class="p">[</span><span class="s1">'SQLALCHEMY_DATABASE_URI'</span><span class="p">]</span> <span class="o">=</span> <span class="s1">'sqlite:///blog.db'</span>
<span class="n">db</span> <span class="o">=</span> <span class="n">SQLAlchemy</span><span class="p">(</span><span class="n">app</span><span class="p">)</span>
<span class="o">.......</span>
<span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s1">'__main__'</span><span class="p">:</span>
<span class="n">app</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="n">debug</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
</pre></div><br/>Для создания полей, использую Flask-WTF. Весь код в отдельном файле forms.py<br/><div class="code"><pre> <span class="kn">from</span> <span class="nn">flask_wtf</span> <span class="kn">import</span> <span class="n">FlaskForm</span>
<span class="kn">from</span> <span class="nn">wtforms</span> <span class="kn">import</span> <span class="n">StringField</span><span class="p">,</span> <span class="n">SubmitField</span><span class="p">,</span> <span class="n">PasswordField</span><span class="p">,</span> <span class="n">SelectField</span><span class="p">,</span> <span class="n">TextAreaField</span><span class="p">,</span> <span class="n">DateTimeField</span>
<span class="kn">from</span> <span class="nn">wtforms.validators</span> <span class="kn">import</span> <span class="n">DataRequired</span><span class="p">,</span> <span class="n">Email</span><span class="p">,</span> <span class="n">Length</span>
<span class="k">class</span> <span class="nc">NewsCreator</span><span class="p">(</span><span class="n">FlaskForm</span><span class="p">):</span>
<span class="n">title</span> <span class="o">=</span> <span class="n">StringField</span><span class="p">(</span><span class="s2">"Title"</span><span class="p">,</span> <span class="n">validators</span><span class="o">=</span><span class="p">[</span><span class="n">DataRequired</span><span class="p">(),</span> <span class="n">Length</span><span class="p">(</span><span class="nb">min</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="nb">max</span><span class="o">=</span><span class="mi">40</span><span class="p">)])</span>
<span class="n">intro</span> <span class="o">=</span> <span class="n">TextAreaField</span><span class="p">(</span><span class="s2">"Synopsys"</span><span class="p">,</span> <span class="n">validators</span><span class="o">=</span><span class="p">[</span><span class="n">DataRequired</span><span class="p">(),</span> <span class="n">Length</span><span class="p">(</span><span class="nb">min</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="nb">max</span><span class="o">=</span><span class="mi">150</span><span class="p">)])</span>
<span class="n">text</span> <span class="o">=</span> <span class="n">TextAreaField</span><span class="p">(</span><span class="s2">"Post"</span><span class="p">,</span> <span class="n">validators</span><span class="o">=</span><span class="p">[</span><span class="n">DataRequired</span><span class="p">(),</span> <span class="n">Length</span><span class="p">(</span><span class="nb">min</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="nb">max</span><span class="o">=</span><span class="mi">500</span><span class="p">)])</span>
<span class="n">date</span> <span class="o">=</span> <span class="n">DateTimeField</span><span class="p">(</span><span class="s2">"Date"</span><span class="p">,</span> <span class="n">validators</span><span class="o">=</span><span class="p">[</span><span class="n">DataRequired</span><span class="p">()])</span>
<span class="n">save_post</span> <span class="o">=</span> <span class="n">SubmitField</span><span class="p">(</span><span class="s2">"Save"</span><span class="p">)</span>
</pre></div><br/>Класс таблицы БД находится в main.py (изначально был отдельно в models.py)<br/><br/><div class="code"><pre> <span class="k">class</span> <span class="nc">Article</span><span class="p">(</span><span class="n">db</span><span class="o">.</span><span class="n">Model</span><span class="p">):</span>
<span class="n">__tablename__</span> <span class="o">=</span> <span class="s1">'article'</span>
<span class="nb">id</span> <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">Column</span><span class="p">(</span><span class="n">db</span><span class="o">.</span><span class="n">Integer</span><span class="p">,</span> <span class="n">primary_key</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
<span class="n">title</span> <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">Column</span><span class="p">(</span><span class="n">db</span><span class="o">.</span><span class="n">String</span><span class="p">(</span><span class="mi">40</span><span class="p">),</span> <span class="n">nullable</span><span class="o">=</span><span class="bp">False</span><span class="p">)</span>
<span class="n">intro</span> <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">Column</span><span class="p">(</span><span class="n">db</span><span class="o">.</span><span class="n">String</span><span class="p">(</span><span class="mi">150</span><span class="p">),</span> <span class="n">nullable</span><span class="o">=</span><span class="bp">False</span><span class="p">)</span>
<span class="n">text</span> <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">Column</span><span class="p">(</span><span class="n">db</span><span class="o">.</span><span class="n">Text</span><span class="p">,</span> <span class="n">nullable</span><span class="o">=</span><span class="bp">False</span><span class="p">)</span>
<span class="n">date</span> <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">Column</span><span class="p">(</span><span class="n">db</span><span class="o">.</span><span class="n">DateTime</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="n">datetime</span><span class="o">.</span><span class="n">utcnow</span><span class="p">)</span>
<span class="k">def</span> <span class="fm">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="n">f</span><span class="s1">'{self.title} {self.intro} {self.date}'</span>
</pre></div><br/>Так выглядит Route:<br/><div class="code"><pre> <span class="nd">@app.route</span><span class="p">(</span><span class="s1">'/create_article'</span><span class="p">,</span> <span class="n">methods</span><span class="o">=</span><span class="p">[</span><span class="s1">'GET'</span><span class="p">,</span> <span class="s1">'POST'</span><span class="p">])</span>
<span class="k">def</span> <span class="nf">create_article</span><span class="p">():</span>
<span class="n">form</span> <span class="o">=</span> <span class="n">NewsCreator</span><span class="p">()</span>
<span class="k">if</span> <span class="n">form</span><span class="o">.</span><span class="n">validate_on_submit</span><span class="p">():</span>
<span class="n">flash</span><span class="p">(</span><span class="s2">"Post created with success"</span><span class="p">)</span>
<span class="k">return</span> <span class="n">redirect</span><span class="p">(</span><span class="n">url_for</span><span class="p">(</span><span class="s1">'news'</span><span class="p">))</span>
<span class="k">return</span> <span class="n">render_template</span><span class="p">(</span><span class="s1">'create_article.html'</span><span class="p">,</span> <span class="n">form</span><span class="o">=</span><span class="n">form</span><span class="p">)</span>
</pre></div><br/>Сюда должен происходить редирект:<br/><div class="code"><pre> <span class="nd">@app.route</span><span class="p">(</span><span class="s1">'/news'</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">news</span><span class="p">():</span>
<span class="k">return</span> <span class="n">render_template</span><span class="p">(</span><span class="s1">'news.html'</span><span class="p">)</span>
</pre></div><br/>В basic.html есть такой код для вывода сообщения об успешном добавлении поста:<br/><div class="code"><pre> <span class="p">{</span><span class="o">%</span> <span class="n">block</span> <span class="n">content</span> <span class="o">%</span><span class="p">}</span>
<span class="p">{</span><span class="o">%</span> <span class="k">with</span> <span class="n">messages</span> <span class="o">=</span> <span class="n">get_flashed_messages</span><span class="p">()</span> <span class="o">%</span><span class="p">}</span>
<span class="p">{</span><span class="o">%</span> <span class="k">if</span> <span class="n">messages</span> <span class="o">%</span><span class="p">}</span>
<span class="p">{</span><span class="o">%</span> <span class="k">for</span> <span class="n">message</span> <span class="ow">in</span> <span class="n">messages</span> <span class="o">%</span><span class="p">}</span>
<span class="o"><</span><span class="n">div</span><span class="o">></span>
<span class="p">{{</span> <span class="n">message</span> <span class="p">}}</span>
<span class="o"></</span><span class="n">div</span><span class="o">></span>
<span class="p">{</span><span class="o">%</span> <span class="n">endfor</span> <span class="o">%</span><span class="p">}</span>
<span class="p">{</span><span class="o">%</span> <span class="n">endif</span> <span class="o">%</span><span class="p">}</span>
<span class="p">{</span><span class="o">%</span> <span class="n">endwith</span> <span class="o">%</span><span class="p">}</span>
<span class="p">{</span><span class="o">%</span> <span class="n">endblock</span> <span class="o">%</span><span class="p">}</span>
</pre></div><br/>Ну и сам create_article.html:<br/><div class="code"><pre> <span class="p">{</span><span class="o">%</span> <span class="n">extends</span> <span class="s1">'basic.html'</span> <span class="o">%</span><span class="p">}</span>
<span class="p">{</span><span class="o">%</span> <span class="n">block</span> <span class="n">title</span> <span class="o">%</span><span class="p">}</span> <span class="n">Create</span> <span class="n">Article</span> <span class="n">Form</span> <span class="p">{</span><span class="o">%</span> <span class="n">endblock</span> <span class="o">%</span><span class="p">}</span>
<span class="p">{</span><span class="o">%</span> <span class="n">block</span> <span class="n">content</span> <span class="o">%</span><span class="p">}</span>
<span class="o"><</span><span class="n">div</span><span class="o">></span>
<span class="o"><</span><span class="n">h1</span><span class="o">></span><span class="n">Add</span> <span class="n">article</span><span class="o"></</span><span class="n">h1</span><span class="o">></span>
<span class="o"><</span><span class="n">form</span> <span class="n">action</span><span class="o">=</span><span class="s2">"http://127.0.0.1:5000/create_article"</span> <span class="n">method</span><span class="o">=</span><span class="s2">"POST"</span><span class="o">></span>
<span class="p">{{</span> <span class="n">form</span><span class="o">.</span><span class="n">hidden_tag</span><span class="p">()</span> <span class="p">}}</span>
<span class="p">{{</span> <span class="n">form</span><span class="o">.</span><span class="n">title</span><span class="o">.</span><span class="n">label</span> <span class="p">}}</span> <span class="p">{{</span> <span class="n">form</span><span class="o">.</span><span class="n">title</span><span class="p">()</span> <span class="p">}}</span>
<span class="p">{{</span> <span class="n">form</span><span class="o">.</span><span class="n">intro</span><span class="o">.</span><span class="n">label</span> <span class="p">}}</span> <span class="p">{{</span> <span class="n">form</span><span class="o">.</span><span class="n">intro</span><span class="p">()</span> <span class="p">}}</span>
<span class="p">{{</span> <span class="n">form</span><span class="o">.</span><span class="n">text</span><span class="o">.</span><span class="n">label</span> <span class="p">}}</span> <span class="p">{{</span> <span class="n">form</span><span class="o">.</span><span class="n">text</span><span class="p">()</span> <span class="p">}}</span>
<span class="p">{{</span> <span class="n">form</span><span class="o">.</span><span class="n">date</span><span class="o">.</span><span class="n">label</span> <span class="p">}}</span> <span class="p">{{</span> <span class="n">form</span><span class="o">.</span><span class="n">date</span><span class="p">()</span> <span class="p">}}</span>
<span class="p">{{</span> <span class="n">form</span><span class="o">.</span><span class="n">save_post</span><span class="p">()</span> <span class="p">}}</span>
<span class="o"></</span><span class="n">form</span><span class="o">></span>
<span class="o"></</span><span class="n">div</span><span class="o">></span>
<span class="p">{</span><span class="o">%</span> <span class="n">endblock</span> <span class="o">%</span><span class="p">}</span>
</pre></div><br/>Возможно это важно, после того как создал класс таблицы, в терминале запустил команду<br/>>>> from main import db<br/>>>>db.create_all()<br/><br/>В тот момент, класс таблицы находился в файле models.py, потом я подумал что это может быть причиной и перевёл класс в main.py а сам model.py удалил.<br/><br/>