<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>ploshadka.net</title>
	<atom:link href="https://ploshadka.net/feed/" rel="self" type="application/rss+xml" />
	<link>https://ploshadka.net</link>
	<description>Мир интернет технологий</description>
	<lastBuildDate>Tue, 06 Dec 2022 08:27:28 +0000</lastBuildDate>
	<language>ru-RU</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.1</generator>
	<item>
		<title>Flask Pedantic</title>
		<link>https://ploshadka.net/flask-pedantic/</link>
					<comments>https://ploshadka.net/flask-pedantic/#respond</comments>
		
		<dc:creator><![CDATA[Admin]]></dc:creator>
		<pubDate>Mon, 12 Dec 2022 08:00:00 +0000</pubDate>
				<category><![CDATA[Flask]]></category>
		<category><![CDATA[Pedantic]]></category>
		<guid isPermaLink="false">https://ploshadka.net/?p=8191</guid>

					<description><![CDATA[Примеры кода проверок на Pedantic для Flask. Эта статья будет пополняться примерами. Проверка списка данных Модель проверки: class OperationsUpdateModel&#40;BaseModel&#41;: &#160; &#160; id: int &#160; &#160; confirmed: bool Как проверить валидацию данных в API и отправить ошибку: @operations_bp.route&#40;'/update-operations/', methods=&#91;'PATCH'&#93;&#41; @login_required def...]]></description>
										<content:encoded><![CDATA[<p>Примеры кода проверок на <strong>Pedantic</strong> для <strong>Flask</strong>. <span id="more-8191"></span></p>
<p>Эта статья будет пополняться примерами. </p>
<h2>Проверка списка данных</h2>
<p>Модель проверки:</p>
<div class="codecolorer-container python dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;"><span style="color: #ff7700;font-weight:bold;">class</span> OperationsUpdateModel<span style="color: black;">&#40;</span>BaseModel<span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; <span style="color: #008000;">id</span>: <span style="color: #008000;">int</span><br />
&nbsp; &nbsp; confirmed: <span style="color: #008000;">bool</span></div></div>
<p>Как проверить валидацию данных в API и отправить ошибку:</p>
<div class="codecolorer-container python dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;"><span style="color: #66cc66;">@</span>operations_bp.<span style="color: black;">route</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'/update-operations/'</span><span style="color: #66cc66;">,</span> methods<span style="color: #66cc66;">=</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">'PATCH'</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span><br />
<span style="color: #66cc66;">@</span>login_required<br />
<span style="color: #ff7700;font-weight:bold;">def</span> update_operations_route<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">try</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; data <span style="color: #66cc66;">=</span> request.<span style="color: black;">get_json</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">try</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; list_ <span style="color: #66cc66;">=</span> parse_obj_as<span style="color: black;">&#40;</span>List<span style="color: black;">&#91;</span>OperationsUpdateModel<span style="color: black;">&#93;</span><span style="color: #66cc66;">,</span> data<span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">except</span> <span style="color: #008000;">Exception</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: black;">&#123;</span><span style="color: #483d8b;">&quot;error&quot;</span>: <span style="color: #483d8b;">&quot;Must be a list {id: int, confirmed: bool}&quot;</span><span style="color: black;">&#125;</span><span style="color: #66cc66;">,</span> <span style="color: #ff4500;">400</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> jsonify<span style="color: black;">&#40;</span><span style="color: #483d8b;">'ok'</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">except</span> <span style="color: #008000;">Exception</span> <span style="color: #ff7700;font-weight:bold;">as</span> e:<br />
&nbsp; &nbsp; &nbsp; &nbsp; logger.<span style="color: black;">error</span><span style="color: black;">&#40;</span><span style="color: black;">&#123;</span>e<span style="color: black;">&#125;</span><span style="color: #66cc66;">,</span> exc_info<span style="color: #66cc66;">=</span><span style="color: #008000;">True</span><span style="color: black;">&#41;</span></div></div>
]]></content:encoded>
					
					<wfw:commentRss>https://ploshadka.net/flask-pedantic/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>JavaScript как изменить свойство во вложенном массивов</title>
		<link>https://ploshadka.net/javascript-kak-izmenit-svojjstvo-vo-vlozhennom-massivov/</link>
					<comments>https://ploshadka.net/javascript-kak-izmenit-svojjstvo-vo-vlozhennom-massivov/#respond</comments>
		
		<dc:creator><![CDATA[Admin]]></dc:creator>
		<pubDate>Wed, 07 Dec 2022 08:00:00 +0000</pubDate>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Svelte]]></category>
		<category><![CDATA[array]]></category>
		<guid isPermaLink="false">https://ploshadka.net/?p=8186</guid>

					<description><![CDATA[Как изменить свойство в массиве вложенного в другой массив данных. Как в таком массиве данных заменить значение вложенного свойства: [{…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}] 0 : {commission: -0.05, confirmed: true, currency: 'usd',...]]></description>
										<content:encoded><![CDATA[<p>Как изменить свойство в массиве вложенного в другой массив данных. <span id="more-8186"></span></p>
<p>Как в таком массиве данных заменить значение вложенного свойства:</p>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;">[{…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}]<br />
0<br />
: <br />
{commission: -0.05, confirmed: true, currency: 'usd', date: '21:20 | 05 декабря 2022', id: 3455, …}<br />
1<br />
: <br />
{commission: -0.04, confirmed: true, currency: 'usd', date: '20:51 | 05 декабря 2022', id: 3453, …}<br />
2<br />
: <br />
{commission: -0.05, confirmed: true, currency: 'usd', date: '20:25 | 05 декабря 2022', id: 3450, …}</div></div>
<p>Сначала давайте посмотрим как можно сделать это обычным способом:</p>
<div class="codecolorer-container javascript dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;"><span style="color: #000066; font-weight: bold;">function</span> toggleAll<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="">Object</span>.<span style="color: #660066;">values</span><span style="color: #009900;">&#40;</span>items<span style="color: #009900;">&#41;</span>.<span style="color: #660066;">forEach</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span>item<span style="color: #339933;">,</span> index<span style="color: #339933;">,</span> array<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="">Object</span>.<span style="color: #660066;">entries</span><span style="color: #009900;">&#40;</span>item<span style="color: #009900;">&#41;</span>.<span style="color: #660066;">forEach</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#91;</span>key<span style="color: #339933;">,</span> value<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>key <span style="color: #339933;">===</span> <span style="color: #3366CC;">'confirmed'</span> <span style="color: #339933;">&amp;&amp;</span> value <span style="color: #339933;">===</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; array<span style="color: #009900;">&#91;</span>index<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span>key<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span> <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>key <span style="color: #339933;">===</span> <span style="color: #3366CC;">'confirmed'</span> <span style="color: #339933;">&amp;&amp;</span> value <span style="color: #339933;">===</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; array<span style="color: #009900;">&#91;</span>index<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span>key<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">false</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span></div></div>
<p>Другой вариант сделать это так:</p>
<div class="codecolorer-container javascript dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;"><span style="color: #000066; font-weight: bold;">function</span> itemsToggle<span style="color: #009900;">&#40;</span>b<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; items <span style="color: #339933;">=</span> items.<span style="color: #660066;">map</span><span style="color: #009900;">&#40;</span>obj <span style="color: #339933;">=&gt;</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; ...<span style="color: #660066;">obj</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; confirmed<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">true</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span></div></div>
<p>Как создать новый массив данных по такому свойству:</p>
<div class="codecolorer-container javascript dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;"><span style="color: #000066; font-weight: bold;">function</span> createNewArrayForUpdate<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; confirmedArray <span style="color: #339933;">=</span> <span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; let data <span style="color: #339933;">=</span> <span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><br />
&nbsp; &nbsp; items.<span style="color: #660066;">forEach</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span>item<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>item.<span style="color: #660066;">confirmed</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; data <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #3366CC;">'id'</span><span style="color: #339933;">:</span> item.<span style="color: #660066;">id</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #3366CC;">'confirmed'</span><span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span> <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; data <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #3366CC;">'id'</span><span style="color: #339933;">:</span> item.<span style="color: #660066;">id</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #3366CC;">'confirmed'</span><span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; confirmedArray.<span style="color: #660066;">push</span><span style="color: #009900;">&#40;</span>data<span style="color: #009900;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span></div></div>
]]></content:encoded>
					
					<wfw:commentRss>https://ploshadka.net/javascript-kak-izmenit-svojjstvo-vo-vlozhennom-massivov/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Python / dictionary: как перемножить или сложить каждый элемент с числом</title>
		<link>https://ploshadka.net/python-dictionary-kak-peremnozhit-ili-slozhit-kazhdyjj-ehlement-s-chislom/</link>
					<comments>https://ploshadka.net/python-dictionary-kak-peremnozhit-ili-slozhit-kazhdyjj-ehlement-s-chislom/#respond</comments>
		
		<dc:creator><![CDATA[Admin]]></dc:creator>
		<pubDate>Sun, 04 Dec 2022 08:00:00 +0000</pubDate>
				<category><![CDATA[Python]]></category>
		<guid isPermaLink="false">https://ploshadka.net/?p=8142</guid>

					<description><![CDATA[Короткий вариант как перемножить или сложить каждый элемент в словаре (dictionary) с каким-нибудь числом. Пример ready = &#123;k: v + sum for k, v in dictionary.items&#40;&#41;&#125; Ошибка Если возникает такая ошибка: return self.view_functions[rule.endpoint](**req.view_args) in calculate_results for x, v in response_rub_in_usd:...]]></description>
										<content:encoded><![CDATA[<p>Короткий вариант как перемножить или сложить каждый элемент в <strong>словаре (dictionary)</strong> с каким-нибудь числом. <span id="more-8142"></span></p>
<h2>Пример</h2>
<div class="codecolorer-container python dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;">ready <span style="color: #66cc66;">=</span> <span style="color: black;">&#123;</span>k: v + <span style="color: #008000;">sum</span> <span style="color: #ff7700;font-weight:bold;">for</span> k<span style="color: #66cc66;">,</span> v <span style="color: #ff7700;font-weight:bold;">in</span> dictionary.<span style="color: black;">items</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#125;</span></div></div>
<h2>Ошибка</h2>
<p>Если возникает такая ошибка:</p>
<blockquote><p>
  return self.view_functions[rule.endpoint](**req.view_args)<br />
  in calculate_results<br />
    for x, v in response_rub_in_usd:<br />
ValueError: too many values to unpack (expected 2)</p></blockquote>
<p>Попробуйте добавить <strong>.items()</strong> к словарю, как в примере выше.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ploshadka.net/python-dictionary-kak-peremnozhit-ili-slozhit-kazhdyjj-ehlement-s-chislom/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Устанавливаем nvm, npm, node.js на Mac OS</title>
		<link>https://ploshadka.net/ustanavlivaem-nvm-node-js-na-mac-os/</link>
					<comments>https://ploshadka.net/ustanavlivaem-nvm-node-js-na-mac-os/#respond</comments>
		
		<dc:creator><![CDATA[Admin]]></dc:creator>
		<pubDate>Thu, 01 Dec 2022 10:23:20 +0000</pubDate>
				<category><![CDATA[Mac OS]]></category>
		<guid isPermaLink="false">https://ploshadka.net/?p=8164</guid>

					<description><![CDATA[Установка Node.js через консоль для Mac OS. Протестировано на Mac OS Ventura, архитектура M2. Установка NVM на Mac OS Для начала нужно убедиться, что есть файл .zshrc. Для этого в консоли набрать: ls -a Если файла нет в списке представленных,...]]></description>
										<content:encoded><![CDATA[<p>Установка Node.js через консоль для Mac OS. <span id="more-8164"></span></p>
<p><em>Протестировано на Mac OS Ventura, архитектура M2.</em></p>
<h2>Установка NVM на Mac OS</h2>
<p>Для начала нужно убедиться, что есть файл <strong>.zshrc</strong>. Для этого в консоли набрать:</p>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;">ls -a</div></div>
<p>Если файла нет в списке представленных, то создадим его:</p>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;">touch .zshrc</div></div>
<p>Теперь устанавим NVM:</p>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;">curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.2/install.sh | bash</div></div>
<p>Официальная инструкция находится здесь:</p>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;">https://github.com/nvm-sh/nvm#install--update-script</div></div>
<p>После установки запустим команду:</p>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;">export NVM_DIR=&quot;$HOME/.nvm&quot;<br />
[ -s &quot;$NVM_DIR/nvm.sh&quot; ] &amp;&amp; \. &quot;$NVM_DIR/nvm.sh&quot; &nbsp;# This loads nvm<br />
[ -s &quot;$NVM_DIR/bash_completion&quot; ] &amp;&amp; \. &quot;$NVM_DIR/bash_completion&quot; &nbsp;# This loads nvm bash_completion</div></div>
<h2>Установка Node.js на Mac OS</h2>
<p>Есть предыдущая статья, где <a href="https://ploshadka.net/node-js/">установка node.js ya mac через дистрибьютер</a>. Здесь мы установим через консоль.</p>
<p>Устанавливаем:</p>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;">nvm install node</div></div>
<p>Запускаем:</p>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;">nvm use node</div></div>
<p>Проверить версии установленного:</p>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;">nvm -v<br />
node -v<br />
npm -v</div></div>
<p>Эта статья решает ошибки:</p>
<blockquote><p>
npm install run<br />
zsh: command not found: npm<br />
zsh: command not found: nvm
</p></blockquote>
<p>Если вновь будут ошибки, перезагрузите консоль, иногда это помогает.</p>
<h2>Используем npm сборщики</h2>
<p>При установке нового Node.js часто перестает работать сборщик со старыми версиями. Это неприятно, потому что вместе с обновлением ноды, приходится обновлять пакеты, а с обновлением пакетов перестают работать старые конфиги. И на правку всего этого может уйти целый день. А если все это работает еще на других компьютерах, то придется обновиться и там. Так что много раз следует подумать, стоит ли обновлять ноду.</p>
<p>Для обновления версий воспользуемся статьёй про <a href="https://ploshadka.net/kak-obnovit-vse-versii-v-package-json/">обновление package.json</a>.</p>
<h2>Обновление конфигов</h2>
<p>На примере <a href="https://ploshadka.net/oshibki-i-ispravlenie-konfiga-rollup-config-js-posle-obnovlenija-node/">обновления конфига rollup.js</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ploshadka.net/ustanavlivaem-nvm-node-js-na-mac-os/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Ошибки и исправление конфига rollup.config.js после обновления Node</title>
		<link>https://ploshadka.net/oshibki-i-ispravlenie-konfiga-rollup-config-js-posle-obnovlenija-node/</link>
					<comments>https://ploshadka.net/oshibki-i-ispravlenie-konfiga-rollup-config-js-posle-obnovlenija-node/#respond</comments>
		
		<dc:creator><![CDATA[Admin]]></dc:creator>
		<pubDate>Thu, 01 Dec 2022 10:23:03 +0000</pubDate>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Node Errors]]></category>
		<guid isPermaLink="false">https://ploshadka.net/?p=8174</guid>

					<description><![CDATA[На примере обновления Node исправляем ошибки в rollup.js после запуска компиляционных npm команд. После обновления Node.js могут возникнуть разного рода ошибки. Вариант ошибок При запуске команды npm run dev после обновления возникли ошибки: (node:2023) Warning: To load an ES module,...]]></description>
										<content:encoded><![CDATA[<p>На примере обновления <strong>Node</strong> исправляем ошибки в <strong>rollup.js</strong> после запуска компиляционных npm команд. <span id="more-8174"></span></p>
<p>После <a href="https://ploshadka.net/ustanavlivaem-nvm-node-js-na-mac-os/">обновления Node.js</a> могут возникнуть разного рода ошибки.</p>
<h2>Вариант ошибок</h2>
<p>При запуске команды <strong>npm run dev</strong> после обновления возникли ошибки:</p>
<blockquote><p>(node:2023) Warning: To load an ES module, set &#171;type&#187;: &#171;module&#187; in the package.json or use the .mjs extension.<br />
(Use `node &#8212;trace-warnings &#8230;` to show where the warning was created)</p>
<p>[!] RollupError: Node tried to load your configuration file as CommonJS even though it is likely an ES module. To resolve this, change the extension of your configuration to &#171;.mjs&#187;, set &#171;type&#187;: &#171;module&#187; in your package.json file or pass the &#171;&#8212;bundleConfigAsCjs&#187; flag.</p>
<p>Original error: Cannot use import statement outside a module<br />
https://rollupjs.org/guide/en/#&#8212;bundleconfigascjs<br />
/app/templates/svelte/rollup.config.js:1<br />
import svelte from &#8216;rollup-plugin-svelte&#8217;;<br />
^^^^^^</p>
<p>SyntaxError: Cannot use import statement outside a module<br />
    at internalCompileFunction (node:internal/vm:74:18)<br />
    at wrapSafe (node:internal/modules/cjs/loader:1141:20)<br />
    at Module._compile (node:internal/modules/cjs/loader:1182:27)<br />
    at Object.Module._extensions..js (node:internal/modules/cjs/loader:1272:10)<br />
    at Module.load (node:internal/modules/cjs/loader:1081:32)<br />
    at Function.Module._load (node:internal/modules/cjs/loader:922:12)<br />
    at ModuleWrap.<anonymous> (node:internal/modules/esm/translators:169:29)<br />
    at ModuleJob.run (node:internal/modules/esm/module_job:194:25)</p></blockquote>
<h2>Немного теории</h2>
<p>Никогда не стоит игнорировать ошибки, которые показывает команда:</p>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;">npm install</div></div>
<p>Проигнорировать ошибки можно командой: </p>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;">npm install —force</div></div>
<p>В этом случае будут проигнорированы все предупреждения и установятся все пакеты. Однако лучше так не делать. Можно пропустить ошибки вида:</p>
<blockquote><p>npm WARN deprecated @npmcli/move-file@1.1.2: This functionality has been moved to @npmcli/fs<br />
npm WARN deprecated @npmcli/move-file@2.0.1: This functionality has been moved to @npmcli/fs<br />
npm WARN deprecated rollup-plugin-terser@7.0.2: This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser<br />
npm WARN deprecated rollup-plugin-commonjs@10.1.0: This package has been deprecated and is no longer maintained. Please use @rollup/plugin-commonjs.</p></blockquote>
<p>А затем пытаться исправить то, что не правится без контекста проигнорированных ранее ошибок.</p>
<p>Из ошибок выше видно, что <strong>rollup-plugin-terser </strong>устарел и вместо него используется <strong>@rollup/plugin-terser</strong>. </p>
<p>Это значит, что в файле <strong>package.json</strong> нужно поменять пакеты, а также поменять в файлах конфига <strong>rollup.config.js</strong>.</p>
<p>Одна из ошибок, которая возникла после обновления Node.js и пакетов:</p>
<h2>Ошибка Node tried to load your configuration as an ES module</h2>
<blockquote><p>Reloading updated config&#8230;<br />
[!] RollupError: Node tried to load your configuration as an ES module even though it is likely CommonJS. To resolve this, change the extension of your configuration to &#171;.cjs&#187; or pass the &#171;&#8212;bundleConfigAsCjs&#187; flag.</p>
<p>Original error: require is not defined in ES module scope, you can use import instead<br />
This file is being treated as an ES module because it has a &#8216;.js&#8217; file extension and &#8216;/app/templates/svelte/package.json&#8217; contains &#171;type&#187;: &#171;module&#187;. To treat it as a CommonJS script, rename it to use the &#8216;.cjs&#8217; file extension.<br />
https://rollupjs.org/guide/en/#&#8212;bundleconfigascjs<br />
ReferenceError: require is not defined in ES module scope, you can use import instead<br />
This file is being treated as an ES module because it has a &#8216;.js&#8217; file extension and &#8216;/app/templates/svelte/package.json&#8217; contains &#171;type&#187;: &#171;module&#187;. To treat it as a CommonJS script, rename it to use the &#8216;.cjs&#8217; file extension.<br />
    at file:///app/templates/svelte/rollup.config.js?1669819006568:24:22<br />
    at ModuleJob.run (node:internal/modules/esm/module_job:194:25)</p></blockquote>
<p>Для исправления в свой package.json нужно добавить:</p>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;">&quot;type&quot;: &quot;module&quot;,</div></div>
<p>А дальше в файле <strong>rollup.config.js</strong> изменить такие:</p>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;">import { terser } from '@rollup/plugin-terser';</div></div>
<p>на это</p>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;">import terser from '@rollup/plugin-terser';</div></div>
<h3>Убрать все require</h3>
<p>В том числе, если встречаются такие моменты:</p>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;">postcss: {<br />
&nbsp; &nbsp; plugins: [require('autoprefixer')],<br />
},</div></div>
<p>Заменить на это:</p>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;">import postcss from &quot;autoprefixer&quot;;<br />
<br />
postcss: {<br />
&nbsp; &nbsp; plugins: [postcss],<br />
},</div></div>
<p>Все это будет работать только в том случае, если в пакетах нет несовместимостей. Это важно, иначе исправления не решат проблему. Вместо одной ошибки будет вылезать другая.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ploshadka.net/oshibki-i-ispravlenie-konfiga-rollup-config-js-posle-obnovlenija-node/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>JavaScript &#8212; передача функции в функцию</title>
		<link>https://ploshadka.net/javascript-peredacha-funkcii-v-funkciju/</link>
					<comments>https://ploshadka.net/javascript-peredacha-funkcii-v-funkciju/#respond</comments>
		
		<dc:creator><![CDATA[Admin]]></dc:creator>
		<pubDate>Tue, 29 Nov 2022 08:00:00 +0000</pubDate>
				<category><![CDATA[JavaScript]]></category>
		<guid isPermaLink="false">https://ploshadka.net/?p=8136</guid>

					<description><![CDATA[На примере обычного экспорта функций в JS и участка кода на Svelte. Файл 1: JS файл экспортируемых функций let timeout = null; export function updateWait&#40;item, updateNote&#41; &#123; &#160; &#160; clearTimeout&#40;timeout&#41;; &#160; &#160; timeout = setTimeout&#40;function &#40;&#41; &#123; &#160; &#160; &#160;...]]></description>
										<content:encoded><![CDATA[<p>На примере обычного <strong>экспорта функций в JS</strong> и участка кода на <strong>Svelte</strong>. <span id="more-8136"></span></p>
<h2>Файл 1: JS файл экспортируемых функций</h2>
<div class="codecolorer-container javascript dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;">let timeout <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #339933;">;</span><br />
<span style="color: #FF0000;">export</span> <span style="color: #000066; font-weight: bold;">function</span> updateWait<span style="color: #009900;">&#40;</span>item<span style="color: #339933;">,</span> updateNote<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; clearTimeout<span style="color: #009900;">&#40;</span>timeout<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; timeout <span style="color: #339933;">=</span> setTimeout<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; updateNote<span style="color: #009900;">&#40;</span>item<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">1000</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span></div></div>
<h2>Файл 2: Svelte</h2>
<p>&#8212; Сначала мы импортируем функцию.<br />
&#8212; Затем основная функция, которая мы дальше передадим в импортированную функцию.<br />
&#8212; И в самом низу мы вызываем импортированную функцию и передаем туда параметры: один из параметров &#8212; вторая функция.</p>
<div class="codecolorer-container javascript dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;"><span style="color: #339933;">&lt;</span>script<span style="color: #339933;">&gt;</span><br />
<span style="color: #FF0000;">import</span> <span style="color: #009900;">&#123;</span>updateWait<span style="color: #009900;">&#125;</span> from <span style="color: #3366CC;">'../../assets/js/universal'</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #000066; font-weight: bold;">function</span> updateOperation<span style="color: #009900;">&#40;</span>operation<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; let data <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #3366CC;">'id_'</span><span style="color: #339933;">:</span> operation.<span style="color: #660066;">id</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #3366CC;">'note'</span><span style="color: #339933;">:</span> operation.<span style="color: #660066;">note</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
<br />
&nbsp; &nbsp; patchFetch<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'update/'</span><span style="color: #339933;">,</span> data<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
<span style="color: #339933;">&lt;/</span>script<span style="color: #339933;">&gt;</span><br />
<br />
<br />
<span style="color: #339933;">&lt;</span>textarea rows<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;2&quot;</span><br />
&nbsp; &nbsp; &nbsp; bind<span style="color: #339933;">:</span>value<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;{operation.note}&quot;</span><br />
&nbsp; &nbsp; &nbsp; on<span style="color: #339933;">:</span>keydown<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;{handle}&quot;</span><br />
&nbsp; &nbsp; &nbsp; on<span style="color: #339933;">:</span>paste<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;{handle}&quot;</span><br />
&nbsp; &nbsp; &nbsp; on<span style="color: #339933;">:</span>input<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;{()=&gt; updateWait(operation, updateOperation)}&quot;</span><br />
<span style="color: #339933;">&gt;&lt;/</span>textarea<span style="color: #339933;">&gt;</span></div></div>
]]></content:encoded>
					
					<wfw:commentRss>https://ploshadka.net/javascript-peredacha-funkcii-v-funkciju/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Размышление о python  и в целом о программировании</title>
		<link>https://ploshadka.net/razmyshlenie-o-python-i-v-celom-o-programmirovanii/</link>
					<comments>https://ploshadka.net/razmyshlenie-o-python-i-v-celom-o-programmirovanii/#respond</comments>
		
		<dc:creator><![CDATA[Admin]]></dc:creator>
		<pubDate>Thu, 24 Nov 2022 08:00:00 +0000</pubDate>
				<category><![CDATA[Python]]></category>
		<guid isPermaLink="false">https://ploshadka.net/?p=8129</guid>

					<description><![CDATA[Немного размышлений на принципы программирования. Тут не будет основательных трудов, просто немного мыслей на эту тему. Возможно буду дописывать эту статью. Возможно&#8230; Не использовать странные решения Чем более стандартизировано, тем лучше. Потом сам не запутаешься. Например, в БД нужно сохранить...]]></description>
										<content:encoded><![CDATA[<p>Немного размышлений на принципы программирования. Тут не будет основательных трудов, просто немного мыслей на эту тему. <span id="more-8129"></span></p>
<p>Возможно буду дописывать эту статью. Возможно&#8230;</p>
<h2>Не использовать странные решения</h2>
<p>Чем более стандартизировано, тем лучше. Потом сам не запутаешься.</p>
<p>Например, в БД нужно сохранить дату. Всегда сохранять в формате <strong>datetime</strong>, даже если может показаться, что это лишнее. Зато потом не будет путаницы. </p>
<p>Потому что, если в одном месте будет <strong>datetime</strong>, а в другом  <strong>string</strong> – это создаст лишний код и баги.</p>
<h2>Не писать излишние проверки</h2>
<p>Все проверять хорошо, но чрезмерность не нужна там где не нужна.</p>
<div class="codecolorer-container python dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;"><span style="color: #66cc66;">@</span>categories_bp.<span style="color: black;">route</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'/update-category/'</span><span style="color: #66cc66;">,</span> methods<span style="color: #66cc66;">=</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">'POST'</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span><br />
<span style="color: #66cc66;">@</span>login_required<br />
<span style="color: #ff7700;font-weight:bold;">def</span> update_category<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; user_id <span style="color: #66cc66;">=</span> flask_login.<span style="color: black;">current_user</span>.<span style="color: #008000;">id</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> user_id:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> error_message<span style="color: black;">&#40;</span><span style="color: #483d8b;">'user_not_found'</span><span style="color: black;">&#41;</span></div></div>
<p>В данном примере проверка на пользователя лишняя, потому что уже есть <strong>@login_required</strong>.</p>
<h2>Если код можно сократить, его нужно сократить</h2>
<p>Не нужно жалеть свой код. Если когда-то вы написали очень длинно, а сейчас видите, что можно сделать короче: удаляем старое и пишем короче.</p>
<h2>Не переусердствовать с сокращением</h2>
<p>В сокращении кода лучше не переусердствовать. И читабельность кода может ухудшиться и человек с меньшим опытом может не понять, что там происходит.</p>
<p>Избегать сокращения до букв. </p>
<p>Избегать несколько логический действий в одной строке. </p>
]]></content:encoded>
					
					<wfw:commentRss>https://ploshadka.net/razmyshlenie-o-python-i-v-celom-o-programmirovanii/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>List / список &#8212; как найти следующий элемент</title>
		<link>https://ploshadka.net/list-spisok-kak-najjti-sledujushhijj-ehlement/</link>
					<comments>https://ploshadka.net/list-spisok-kak-najjti-sledujushhijj-ehlement/#respond</comments>
		
		<dc:creator><![CDATA[Admin]]></dc:creator>
		<pubDate>Sat, 19 Nov 2022 08:00:00 +0000</pubDate>
				<category><![CDATA[Python]]></category>
		<guid isPermaLink="false">https://ploshadka.net/?p=8123</guid>

					<description><![CDATA[Пример функции на python перебора списка, в котором мы обращаемся к следующему элементу. С помощью функции zip можно получить предыдущий объект. Однако мы пойдем простым перебором. Принцип функции: &#8212; Сначала мы сортируем список в обратном направлении. &#8212; На первой итерации...]]></description>
										<content:encoded><![CDATA[<p>Пример функции на python перебора списка, в котором мы обращаемся к следующему элементу. <span id="more-8123"></span></p>
<p>С помощью функции <strong>zip</strong> можно получить предыдущий объект. Однако мы пойдем простым перебором.</p>
<p>Принцип функции:<br />
&#8212; Сначала мы сортируем список в обратном направлении.<br />
&#8212; На первой итерации присвоим значение<br />
&#8212; На второй итерации сможем работать с этим значением<br />
&#8212; В конце снова отсортируем</p>
<div class="codecolorer-container python dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;"><span style="color: #ff7700;font-weight:bold;">def</span> calculate_prev_diff_balance<span style="color: black;">&#40;</span>data<span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; data.<span style="color: black;">reverse</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
<br />
&nbsp; &nbsp; prev <span style="color: #66cc66;">=</span> <span style="color: #008000;">None</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">for</span> x <span style="color: #ff7700;font-weight:bold;">in</span> data:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> prev_sum:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; x<span style="color: black;">&#91;</span><span style="color: #483d8b;">'new_sum'</span><span style="color: black;">&#93;</span> <span style="color: #66cc66;">=</span> x<span style="color: black;">&#91;</span><span style="color: #483d8b;">'sum'</span><span style="color: black;">&#93;</span> - prev_sum<br />
&nbsp; &nbsp; &nbsp; &nbsp; prev_sum <span style="color: #66cc66;">=</span> x<span style="color: black;">&#91;</span><span style="color: #483d8b;">'sum'</span><span style="color: black;">&#93;</span><br />
<br />
&nbsp; &nbsp; data.<span style="color: black;">reverse</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> data</div></div>
]]></content:encoded>
					
					<wfw:commentRss>https://ploshadka.net/list-spisok-kak-najjti-sledujushhijj-ehlement/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Случайное преобразование в кортедж (tuple)</title>
		<link>https://ploshadka.net/sluchajjnoe-preobrazovanie-v-kortedzh-tuple/</link>
					<comments>https://ploshadka.net/sluchajjnoe-preobrazovanie-v-kortedzh-tuple/#respond</comments>
		
		<dc:creator><![CDATA[Admin]]></dc:creator>
		<pubDate>Mon, 14 Nov 2022 08:00:00 +0000</pubDate>
				<category><![CDATA[Python]]></category>
		<guid isPermaLink="false">https://ploshadka.net/?p=8115</guid>

					<description><![CDATA[Особенность python в преобразовании элемента в кортедж (tuple) способно направить несколько часов на поиски ошибок. Если случайно поставить запятую в конце строки, например, копируя объект откуда-нибудь из списка: for x in data: &#160; &#160; x&#91;'a'&#93; = 'abc', или x =...]]></description>
										<content:encoded><![CDATA[<p>Особенность <strong>python</strong> в преобразовании элемента в <strong>кортедж (tuple)</strong> способно направить несколько часов на поиски ошибок. <span id="more-8115"></span></p>
<p>Если случайно поставить запятую в конце строки, например, копируя объект откуда-нибудь из списка:</p>
<div class="codecolorer-container python dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;"><span style="color: #ff7700;font-weight:bold;">for</span> x <span style="color: #ff7700;font-weight:bold;">in</span> data:<br />
&nbsp; &nbsp; x<span style="color: black;">&#91;</span><span style="color: #483d8b;">'a'</span><span style="color: black;">&#93;</span> <span style="color: #66cc66;">=</span> <span style="color: #483d8b;">'abc'</span><span style="color: #66cc66;">,</span></div></div>
<p>или</p>
<div class="codecolorer-container python dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;">x <span style="color: #66cc66;">=</span> <span style="color: #483d8b;">'a'</span><span style="color: #66cc66;">,</span></div></div>
<p>^ в конце строки запятая, </p>
<p>то это превратит элемент в tuple.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ploshadka.net/sluchajjnoe-preobrazovanie-v-kortedzh-tuple/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Минимализм SQLAlchemy &#8212; передача списка и распаковка</title>
		<link>https://ploshadka.net/minimalizm-sqlalchemy-peredacha-spiska-i-raspakovka/</link>
					<comments>https://ploshadka.net/minimalizm-sqlalchemy-peredacha-spiska-i-raspakovka/#respond</comments>
		
		<dc:creator><![CDATA[Admin]]></dc:creator>
		<pubDate>Wed, 09 Nov 2022 08:00:00 +0000</pubDate>
				<category><![CDATA[SQLAlchemy]]></category>
		<guid isPermaLink="false">https://ploshadka.net/?p=8102</guid>

					<description><![CDATA[Как передавать разные параметры в SQLAlchemy и распаковать их. Как одновременно создать объект в SQLAlchemy, а если он создан, то обновить объект. Как передавать любые параметры при этом не создавая много одинаковых функций. Ниже приведены несколько вариантов длинного кода, но...]]></description>
										<content:encoded><![CDATA[<p>Как передавать разные параметры в <strong>SQLAlchemy</strong> и распаковать их. Как одновременно создать объект в SQLAlchemy, а если он создан, то обновить объект. Как передавать любые параметры при этом не создавая много одинаковых функций. <span id="more-8102"></span></p>
<p>Ниже приведены несколько вариантов длинного кода, но сокращение для всех применяется одно и то же.</p>
<h2>Сокращение при создании и обновлении БД</h2>
<p>Вместо увеличения списка параметров:</p>
<div class="codecolorer-container python dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;">query <span style="color: #66cc66;">=</span> db.<span style="color: black;">session</span>.<span style="color: black;">query</span><span style="color: black;">&#40;</span>Result<span style="color: black;">&#41;</span>.<span style="color: black;">filter_by</span><span style="color: black;">&#40;</span>user_id<span style="color: #66cc66;">=</span>user_id<span style="color: #66cc66;">,</span> date<span style="color: #66cc66;">=</span>date<span style="color: black;">&#41;</span>.<span style="color: black;">first</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
<span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> query:<br />
&nbsp; &nbsp; <span style="color: #dc143c;">new</span> <span style="color: #66cc66;">=</span> Result<span style="color: black;">&#40;</span><br />
&nbsp; &nbsp; rub<span style="color: #66cc66;">=</span>balance<span style="color: black;">&#91;</span><span style="color: #483d8b;">'rub'</span><span style="color: black;">&#93;</span><span style="color: #66cc66;">,</span><br />
&nbsp; &nbsp; usd<span style="color: #66cc66;">=</span>balance<span style="color: black;">&#91;</span><span style="color: #483d8b;">'usd'</span><span style="color: black;">&#93;</span><span style="color: #66cc66;">,</span><br />
&nbsp; &nbsp; <span style="color: #dc143c;">time</span><span style="color: #66cc66;">=</span>balance<span style="color: black;">&#91;</span><span style="color: #483d8b;">'time'</span><span style="color: black;">&#93;</span><span style="color: #66cc66;">,</span><br />
&nbsp; &nbsp; <span style="color: black;">&#41;</span><br />
<span style="color: #ff7700;font-weight:bold;">else</span>:<br />
&nbsp; &nbsp; db.<span style="color: black;">session</span>.<span style="color: black;">query</span><span style="color: black;">&#40;</span>Result<span style="color: black;">&#41;</span>.<span style="color: black;">filter_by</span><span style="color: black;">&#40;</span>user_id<span style="color: #66cc66;">=</span>user_id<span style="color: #66cc66;">,</span> date<span style="color: #66cc66;">=</span>date<span style="color: black;">&#41;</span>.<span style="color: black;">update</span><span style="color: black;">&#40;</span><br />
&nbsp; &nbsp; <span style="color: black;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #483d8b;">'rub'</span>: balance<span style="color: black;">&#91;</span><span style="color: #483d8b;">'rub'</span><span style="color: black;">&#93;</span><span style="color: #66cc66;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #483d8b;">'usd'</span>: balance<span style="color: black;">&#91;</span><span style="color: #483d8b;">'usd'</span><span style="color: black;">&#93;</span><span style="color: #66cc66;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #483d8b;">'time'</span>: balance<span style="color: black;">&#91;</span><span style="color: #483d8b;">'time'</span><span style="color: black;">&#93;</span><span style="color: #66cc66;">,</span><br />
&nbsp; &nbsp; <span style="color: black;">&#125;</span><span style="color: black;">&#41;</span><br />
db.<span style="color: black;">session</span>.<span style="color: black;">commit</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></div></div>
<p>Можно сделать так:</p>
<div class="codecolorer-container python dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;"><span style="color: #ff7700;font-weight:bold;">def</span> update_results<span style="color: black;">&#40;</span>user_id<span style="color: #66cc66;">,</span> balance<span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; balance<span style="color: black;">&#91;</span><span style="color: #483d8b;">'user_id'</span><span style="color: black;">&#93;</span> <span style="color: #66cc66;">=</span> user_id<br />
&nbsp; &nbsp; balance<span style="color: black;">&#91;</span><span style="color: #483d8b;">'updated_at'</span><span style="color: black;">&#93;</span> <span style="color: #66cc66;">=</span> <span style="color: #dc143c;">datetime</span>.<span style="color: black;">utcnow</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
<br />
&nbsp; &nbsp; query <span style="color: #66cc66;">=</span> db.<span style="color: black;">session</span>.<span style="color: black;">query</span><span style="color: black;">&#40;</span>Result<span style="color: black;">&#41;</span>.<span style="color: black;">filter_by</span><span style="color: black;">&#40;</span>user_id<span style="color: #66cc66;">=</span>user_id<span style="color: #66cc66;">,</span> date<span style="color: #66cc66;">=</span>balance<span style="color: black;">&#91;</span><span style="color: #483d8b;">'date'</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>.<span style="color: black;">first</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> query:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #dc143c;">new</span> <span style="color: #66cc66;">=</span> Result<span style="color: black;">&#40;</span>**balance<span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; db.<span style="color: black;">session</span>.<span style="color: black;">add</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">new</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">else</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">for</span> key<span style="color: #66cc66;">,</span> value <span style="color: #ff7700;font-weight:bold;">in</span> balance.<span style="color: black;">items</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">setattr</span><span style="color: black;">&#40;</span>query<span style="color: #66cc66;">,</span> key<span style="color: #66cc66;">,</span> value<span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; db.<span style="color: black;">session</span>.<span style="color: black;">commit</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></div></div>
<h2>Сокращение при создании нового объекта</h2>
<p>Вместо:</p>
<div class="codecolorer-container python dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;"><span style="color: #ff7700;font-weight:bold;">def</span> add_new_balance_assets<span style="color: black;">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; user_id: <span style="color: #008000;">int</span><span style="color: #66cc66;">,</span> portfolio_id: <span style="color: #008000;">int</span><span style="color: #66cc66;">,</span> instrument_type: <span style="color: #008000;">str</span><span style="color: #66cc66;">,</span> currency: <span style="color: #008000;">str</span><span style="color: #66cc66;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; quantity: <span style="color: #008000;">float</span><br />
<span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; <span style="color: #dc143c;">new</span> <span style="color: #66cc66;">=</span> BalanceAssets<span style="color: black;">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; user_id<span style="color: #66cc66;">=</span>user_id<span style="color: #66cc66;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; portfolio_id<span style="color: #66cc66;">=</span>portfolio_id<span style="color: #66cc66;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; instrument_type<span style="color: #66cc66;">=</span>instrument_type<span style="color: #66cc66;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; currency<span style="color: #66cc66;">=</span>currency<span style="color: #66cc66;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; quantity<span style="color: #66cc66;">=</span>quantity<br />
&nbsp; &nbsp; <span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; db.<span style="color: black;">session</span>.<span style="color: black;">add</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">new</span><span style="color: black;">&#41;</span></div></div>
<p>Это:</p>
<div class="codecolorer-container python dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;"><span style="color: #ff7700;font-weight:bold;">def</span> add_new_balance_assets<span style="color: black;">&#40;</span>balance<span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; <span style="color: #dc143c;">new</span> <span style="color: #66cc66;">=</span> BalanceAssets<span style="color: black;">&#40;</span>**balance<span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; db.<span style="color: black;">session</span>.<span style="color: black;">add</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">new</span><span style="color: black;">&#41;</span></div></div>
<h2>Сокращение при обновлении объекта</h2>
<p>Вместо:</p>
<div class="codecolorer-container python dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;"><span style="color: #ff7700;font-weight:bold;">def</span> update_balance<span style="color: black;">&#40;</span>user_id<span style="color: #66cc66;">,</span> id_<span style="color: #66cc66;">,</span> date_time<span style="color: #66cc66;">,</span> description<span style="color: #66cc66;">,</span> sum_in_rub<span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> date_time:<br />
&nbsp; &nbsp; &nbsp; &nbsp; db.<span style="color: black;">session</span>.<span style="color: black;">query</span><span style="color: black;">&#40;</span>Balance<span style="color: black;">&#41;</span>.<span style="color: black;">filter_by</span><span style="color: black;">&#40;</span>user_id<span style="color: #66cc66;">=</span>user_id<span style="color: #66cc66;">,</span> <span style="color: #008000;">id</span><span style="color: #66cc66;">=</span>id_<span style="color: black;">&#41;</span>.<span style="color: black;">update</span><span style="color: black;">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: black;">&#123;</span><span style="color: #483d8b;">'date'</span>: date_time<span style="color: black;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> description <span style="color: #ff7700;font-weight:bold;">or</span> description <span style="color: #ff7700;font-weight:bold;">is</span> <span style="color: #008000;">None</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; db.<span style="color: black;">session</span>.<span style="color: black;">query</span><span style="color: black;">&#40;</span>Balance<span style="color: black;">&#41;</span>.<span style="color: black;">filter_by</span><span style="color: black;">&#40;</span>user_id<span style="color: #66cc66;">=</span>user_id<span style="color: #66cc66;">,</span> <span style="color: #008000;">id</span><span style="color: #66cc66;">=</span>id_<span style="color: black;">&#41;</span>.<span style="color: black;">update</span><span style="color: black;">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: black;">&#123;</span><span style="color: #483d8b;">'description'</span>: description<span style="color: black;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> sum_in_rub:<br />
&nbsp; &nbsp; &nbsp; &nbsp; db.<span style="color: black;">session</span>.<span style="color: black;">query</span><span style="color: black;">&#40;</span>Balance<span style="color: black;">&#41;</span>.<span style="color: black;">filter_by</span><span style="color: black;">&#40;</span>user_id<span style="color: #66cc66;">=</span>user_id<span style="color: #66cc66;">,</span> <span style="color: #008000;">id</span><span style="color: #66cc66;">=</span>id_<span style="color: black;">&#41;</span>.<span style="color: black;">update</span><span style="color: black;">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: black;">&#123;</span><span style="color: #483d8b;">'sum_in_rub'</span>: sum_in_rub<span style="color: black;">&#125;</span></div></div>
<p>Так:</p>
<div class="codecolorer-container python dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;"><span style="color: #ff7700;font-weight:bold;">def</span> update_balance<span style="color: black;">&#40;</span>balance<span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; query <span style="color: #66cc66;">=</span> db.<span style="color: black;">session</span>.<span style="color: black;">query</span><span style="color: black;">&#40;</span>Balance<span style="color: black;">&#41;</span>.<span style="color: black;">filter_by</span><span style="color: black;">&#40;</span>user_id<span style="color: #66cc66;">=</span>balance<span style="color: black;">&#91;</span><span style="color: #483d8b;">'user_id'</span><span style="color: black;">&#93;</span><span style="color: #66cc66;">,</span> <span style="color: #008000;">id</span><span style="color: #66cc66;">=</span>balance<span style="color: black;">&#91;</span><span style="color: #483d8b;">'id'</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>.<span style="color: black;">first</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">for</span> key<span style="color: #66cc66;">,</span> value <span style="color: #ff7700;font-weight:bold;">in</span> balance.<span style="color: black;">items</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">setattr</span><span style="color: black;">&#40;</span>query<span style="color: #66cc66;">,</span> key<span style="color: #66cc66;">,</span> value<span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; db.<span style="color: black;">session</span>.<span style="color: black;">commit</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></div></div>
]]></content:encoded>
					
					<wfw:commentRss>https://ploshadka.net/minimalizm-sqlalchemy-peredacha-spiska-i-raspakovka/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Как обновить python на Ubuntu</title>
		<link>https://ploshadka.net/kak-obnovit-python-na-ubuntu/</link>
					<comments>https://ploshadka.net/kak-obnovit-python-na-ubuntu/#respond</comments>
		
		<dc:creator><![CDATA[Admin]]></dc:creator>
		<pubDate>Sun, 30 Oct 2022 08:00:00 +0000</pubDate>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<guid isPermaLink="false">https://ploshadka.net/?p=8048</guid>

					<description><![CDATA[Обновление на новые версии это всегда &#171;весело&#187;. Вместе с новым функционалом понадобится убрать устаревшие функции, обновить потерявшие совместимость модули и в целом проделать большую работу. Подготавливаем данные с локальной версии Сначала обновляем версию локально, тестируем. Фиксируем изменения всех зависимостей командой: ...]]></description>
										<content:encoded><![CDATA[<p>Обновление на новые версии это всегда &#171;весело&#187;. Вместе с новым функционалом понадобится убрать устаревшие функции, обновить потерявшие совместимость модули и в целом проделать большую работу. <span id="more-8048"></span></p>
<h2>Подготавливаем данные с локальной версии</h2>
<p>Сначала обновляем версию локально, тестируем. Фиксируем изменения всех зависимостей командой: </p>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;">pip freeze &gt; requirements.txt</div></div>
<h2>Обновляем Ubuntu на сервере</h2>
<p>Проверим версию Ubuntu:</p>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;">cat /etc/*release</div></div>
<p>Обновим систему и пакеты в ней:</p>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;">sudo apt update &amp;&amp; sudo apt upgrade -y</div></div>
<h2>Обновляем python на сервере</h2>
<p>Проверить версию:</p>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;">python3 -V</div></div>
<p>Если сразу запустить обновление, то возникнет ошибка:</p>
<blockquote><p>sudo apt install python3.10<br />
Чтение списков пакетов… Готово<br />
Построение дерева зависимостей<br />
Чтение информации о состоянии… Готово<br />
E: Невозможно найти пакет python3.10<br />
E: Не удалось найти ни один пакет с помощью шаблона «python3.10»</p></blockquote>
<p>Сначала установим необходимые компоненты для добавления пользовательских PPA:</p>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;">sudo apt install software-properties-common -y</div></div>
<p>Добавим PPA-репозиторий deadsnakes/ppa в список источников диспетчера пакетов APT:</p>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;">sudo add-apt-repository ppa:deadsnakes/ppa -y</div></div>
<p>Запустим обновление APT для обновления менеджера пакетов &#8212; появится новый импортированный PPA:</p>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;">sudo apt update</div></div>
<p>Теперь можем установить новую версию python 3.10:</p>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;">sudo apt install python3.10</div></div>
<p>Проверим установленную версию:</p>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;">python3.10 --version</div></div>
<p>Также проверим текущую версию по умолчанию:</p>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;">python3 -V</div></div>
<p>Установим дополнительные модули стандартной библиотеки (venv):</p>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;">sudo apt install python3.10-venv -y</div></div>
<p>Для расширений C:</p>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;">sudo apt install python3.10-dev -y</div></div>
<p>Также могут пригодиться и другие модули:</p>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;">sudo apt install python3.10-distutils -y<br />
sudo apt install python3.10-lib2to3 -y<br />
sudo apt install python3.10-gdbm -y<br />
sudo apt install python3.10-tk -y</div></div>
<p>Многие дополнительные модули python нужны для работы библиотек, без них они не установятся и будут вылезать ошибки.</p>
<h2>Меняем версию python в системе &#171;по умолчанию&#187;</h2>
<p>По умолчанию python будет указывать на старую версию. </p>
<p>Например, Python 3 указывает на Python 3.8. Это значит, что когда мы запустим python3, он будет выполняться как python 3.8, мы же хотим выполнить его как python 3.10. </p>
<p>Для этого добавим альтернативы:</p>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;">sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.8 1<br />
sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.10 2</div></div>
<p>Выберем нужную сборку:</p>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;">sudo update-alternatives --config python3</div></div>
<h2>Устанавливаем новое окружение</h2>
<p>Переименовываем старую директорию окружения (мы должны находится в директории сайта с виртуальным окружением):</p>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;">mv venv venv-old-python-3.8</div></div>
<p>Затем в этой директории создаем новое виртуальное окружение:</p>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;">python3 -m venv venv</div></div>
<p>Подтягиваем изменения:</p>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;">git pull</div></div>
<p>Активируем оболочку:</p>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;">source venv/bin/activate</div></div>
<p>Установим зависимости:</p>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;">pip install --upgrade pip<br />
pip install -r requirements.txt</div></div>
]]></content:encoded>
					
					<wfw:commentRss>https://ploshadka.net/kak-obnovit-python-na-ubuntu/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Не обновляется new Date в Svelte</title>
		<link>https://ploshadka.net/ne-obnovljaetsja-new-date-v-svelte/</link>
					<comments>https://ploshadka.net/ne-obnovljaetsja-new-date-v-svelte/#respond</comments>
		
		<dc:creator><![CDATA[Admin]]></dc:creator>
		<pubDate>Tue, 25 Oct 2022 08:00:00 +0000</pubDate>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Svelte]]></category>
		<guid isPermaLink="false">https://ploshadka.net/?p=8073</guid>

					<description><![CDATA[При изменении даты в реактивном режиме она не меняется. Может это баг, может фича. Но нам нужно, чтобы все изменилось. Как это сделать. Код даты: let currentDate; const options = &#123;weekday: 'long', year: 'numeric', month: 'short', day: 'numeric'&#125;; Место, где...]]></description>
										<content:encoded><![CDATA[<p>При изменении даты в реактивном режиме она не меняется. Может это баг, может фича. Но нам нужно, чтобы все изменилось. Как это сделать. <span id="more-8073"></span></p>
<p>Код даты:</p>
<div class="codecolorer-container javascript dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;">let currentDate<span style="color: #339933;">;</span><br />
<span style="color: #000066; font-weight: bold;">const</span> options <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span>weekday<span style="color: #339933;">:</span> <span style="color: #3366CC;">'long'</span><span style="color: #339933;">,</span> year<span style="color: #339933;">:</span> <span style="color: #3366CC;">'numeric'</span><span style="color: #339933;">,</span> month<span style="color: #339933;">:</span> <span style="color: #3366CC;">'short'</span><span style="color: #339933;">,</span> day<span style="color: #339933;">:</span> <span style="color: #3366CC;">'numeric'</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></div></div>
<p>Место, где она должна меняться при её изменении:</p>
<div class="codecolorer-container html4strict dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="html4strict codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;"><span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/div.html"><span style="color: #000000; font-weight: bold;">div</span></a> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;title&quot;</span>&gt;</span>{currentDate}<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><a href="http://december.com/html/4/element/div.html"><span style="color: #000000; font-weight: bold;">div</span></a>&gt;</span></div></div>
<p>Решения через фронт не нашел, как вариант передавать через бэкенд и обрабатывать:</p>
<div class="codecolorer-container javascript dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;">postFetch<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'get-date/'</span><span style="color: #339933;">,</span> data<span style="color: #009900;">&#41;</span>.<span style="color: #660066;">then</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>r<span style="color: #009900;">&#41;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; currentDate <span style="color: #339933;">=</span> r<span style="color: #009900;">&#91;</span><span style="color: #3366CC;">'current_date'</span><span style="color: #009900;">&#93;</span><br />
&nbsp; &nbsp; currentDate <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">new</span> <span style="">Date</span><span style="color: #009900;">&#40;</span>currentDate<span style="color: #009900;">&#41;</span>.<span style="color: #660066;">toLocaleDateString</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'ru-RU'</span><span style="color: #339933;">,</span> options<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></div>
<p>На выходе получим:</p>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;">суббота, 23 окт. 2030 г.</div></div>
]]></content:encoded>
					
					<wfw:commentRss>https://ploshadka.net/ne-obnovljaetsja-new-date-v-svelte/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>SQLAlchemy &#8212; связи relationship</title>
		<link>https://ploshadka.net/sqlalchemy-svjazi-relationship/</link>
					<comments>https://ploshadka.net/sqlalchemy-svjazi-relationship/#respond</comments>
		
		<dc:creator><![CDATA[Admin]]></dc:creator>
		<pubDate>Mon, 24 Oct 2022 10:16:48 +0000</pubDate>
				<category><![CDATA[SQLAlchemy]]></category>
		<guid isPermaLink="false">https://ploshadka.net/?p=8085</guid>

					<description><![CDATA[Как связать несколько моделей таблиц базы данных PostgreSQL между собой в SQLAlchemy. Пример связей Я уже когда-то писал статью в которой затрагивалась тема связей SQLAlchemy. Это статья будет эволюционным продолжением предыдущий. Возьмём пример из официальной документации: https://docs.sqlalchemy.org/en/14/orm/basic_relationships.html class Association&#40;Base&#41;: &#160;...]]></description>
										<content:encoded><![CDATA[<p>Как связать несколько моделей таблиц базы данных PostgreSQL между собой в SQLAlchemy. <span id="more-8085"></span></p>
<h2>Пример связей</h2>
<p>Я уже когда-то писал статью в которой затрагивалась тема <a href="https://ploshadka.net/sqlalchemy-many-to-many/">связей SQLAlchemy</a>. Это статья будет эволюционным продолжением предыдущий. </p>
<p>Возьмём пример из официальной документации:<br />
<a href="https://docs.sqlalchemy.org/en/14/orm/basic_relationships.html" rel="noopener" target="_blank">https://docs.sqlalchemy.org/en/14/orm/basic_relationships.html</a></p>
<div class="codecolorer-container python dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;"><span style="color: #ff7700;font-weight:bold;">class</span> Association<span style="color: black;">&#40;</span>Base<span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; __tablename__ <span style="color: #66cc66;">=</span> <span style="color: #483d8b;">&quot;association_table&quot;</span><br />
&nbsp; &nbsp; left_id <span style="color: #66cc66;">=</span> Column<span style="color: black;">&#40;</span>ForeignKey<span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;left_table.id&quot;</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">,</span> primary_key<span style="color: #66cc66;">=</span><span style="color: #008000;">True</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; right_id <span style="color: #66cc66;">=</span> Column<span style="color: black;">&#40;</span>ForeignKey<span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;right_table.id&quot;</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">,</span> primary_key<span style="color: #66cc66;">=</span><span style="color: #008000;">True</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; extra_data <span style="color: #66cc66;">=</span> Column<span style="color: black;">&#40;</span>String<span style="color: black;">&#40;</span><span style="color: #ff4500;">50</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; child <span style="color: #66cc66;">=</span> relationship<span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;Child&quot;</span><span style="color: #66cc66;">,</span> back_populates<span style="color: #66cc66;">=</span><span style="color: #483d8b;">&quot;parents&quot;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; parent <span style="color: #66cc66;">=</span> relationship<span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;Parent&quot;</span><span style="color: #66cc66;">,</span> back_populates<span style="color: #66cc66;">=</span><span style="color: #483d8b;">&quot;children&quot;</span><span style="color: black;">&#41;</span><br />
<br />
<br />
<span style="color: #ff7700;font-weight:bold;">class</span> Parent<span style="color: black;">&#40;</span>Base<span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; __tablename__ <span style="color: #66cc66;">=</span> <span style="color: #483d8b;">&quot;left_table&quot;</span><br />
&nbsp; &nbsp; <span style="color: #008000;">id</span> <span style="color: #66cc66;">=</span> Column<span style="color: black;">&#40;</span>Integer<span style="color: #66cc66;">,</span> primary_key<span style="color: #66cc66;">=</span><span style="color: #008000;">True</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; children <span style="color: #66cc66;">=</span> relationship<span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;Association&quot;</span><span style="color: #66cc66;">,</span> back_populates<span style="color: #66cc66;">=</span><span style="color: #483d8b;">&quot;parent&quot;</span><span style="color: black;">&#41;</span><br />
<br />
<br />
<span style="color: #ff7700;font-weight:bold;">class</span> Child<span style="color: black;">&#40;</span>Base<span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; __tablename__ <span style="color: #66cc66;">=</span> <span style="color: #483d8b;">&quot;right_table&quot;</span><br />
&nbsp; &nbsp; <span style="color: #008000;">id</span> <span style="color: #66cc66;">=</span> Column<span style="color: black;">&#40;</span>Integer<span style="color: #66cc66;">,</span> primary_key<span style="color: #66cc66;">=</span><span style="color: #008000;">True</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; parents <span style="color: #66cc66;">=</span> relationship<span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;Association&quot;</span><span style="color: #66cc66;">,</span> back_populates<span style="color: #66cc66;">=</span><span style="color: #483d8b;">&quot;child&quot;</span><span style="color: black;">&#41;</span></div></div>
<p>В примере выше есть все необходимое. Я лишь обращу внимание на конкретные места, чтобы не было путаницы.</p>
<p>1. Начинаем строить наши связи с таблицы, через которую будет связываться две другие.</p>
<p>2. Обратим внимание на первую модель, на свойство child:</p>
<div class="codecolorer-container python dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;">child <span style="color: #66cc66;">=</span> relationship<span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;Child&quot;</span><span style="color: #66cc66;">,</span> back_populates<span style="color: #66cc66;">=</span><span style="color: #483d8b;">&quot;parents&quot;</span><span style="color: black;">&#41;</span></div></div>
<p>Название переменной в единственном роде и оно же ссылается на класс (модель, таблицу) с названием в единственном роде. Принцип построения этой связи легко запоминается по критерию &#8212; единственный род.</p>
<p>3. Второй параметр из примера выше (но для разнообразия возьмем другую связь) <strong>back_populates</strong>:</p>
<div class="codecolorer-container python dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;">parent <span style="color: #66cc66;">=</span> relationship<span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;Parent&quot;</span><span style="color: #66cc66;">,</span> back_populates<span style="color: #66cc66;">=</span><span style="color: #483d8b;">&quot;children&quot;</span><span style="color: black;">&#41;</span></div></div>
<p>Видим, что <strong>back_populates</strong> ссылается на свойство <strong>children</strong> в классе <strong>Parent</strong>. </p>
<p>4. В обоих моделях (таблицах), которые мы связываем есть отсылки к связанной модели через модель ассоциаций:</p>
<div class="codecolorer-container python dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;">children <span style="color: #66cc66;">=</span> relationship<span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;Association&quot;</span><span style="color: #66cc66;">,</span> back_populates<span style="color: #66cc66;">=</span><span style="color: #483d8b;">&quot;parent&quot;</span><span style="color: black;">&#41;</span></div></div>
<p>Т.е. <strong>class Parent(Base)</strong> мы связываем не напрямую через класс <strong>class Child(Base)</strong>, а через класс <strong>class Association(Base)</strong> и свойство в нем <strong>parent</strong>, которое уже ссылается на другой класс <strong>class Child(Base)</strong>.</p>
<p>Важно понимать как строится связи, иначе будут возникать ошибки:</p>
<blockquote><p>SAWarning: relationship &#8216;Task.cat_Task&#8217; will copy column Task.id to column categories_Task.Task_id, which conflicts with relationship(s): &#8216;Category.Task&#8217; (copies Task.id to categories_Task.Task_id), &#8216;Task.cats&#8217; (copies Task.id to categories_Task.Task_id). If this is not the intention, consider if these relationships should be linked with back_populates, or if viewonly=True should be applied to one or more if they are read-only. For the less common case that foreign key constraints are partially overlapping, the orm.foreign() annotation can be used to isolate the columns that should be written towards.   To silence this warning, add the parameter &#8216;overlaps=&#187;cats,Task&#187;&#8216; to the &#8216;Task.cat_Task&#8217; relationship. (Background on this error at: https://sqlalche.me/e/14/qzyx)</p></blockquote>
<h2>Пример доступа к связанным объектам</h2>
<p>Рассмотрим следующий пример. Допустим нам нужно получить объект из одной таблицы, но подтянуть связи из других таблиц. Весь код выглядит так:</p>
<div class="codecolorer-container python dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;"><span style="color: #ff7700;font-weight:bold;">class</span> TaskCategory<span style="color: black;">&#40;</span>db.<span style="color: black;">Model</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; __tablename__ <span style="color: #66cc66;">=</span> <span style="color: #483d8b;">'task_categories'</span><br />
&nbsp; &nbsp; <span style="color: #008000;">id</span> <span style="color: #66cc66;">=</span> db.<span style="color: black;">Column</span><span style="color: black;">&#40;</span>db.<span style="color: black;">Integer</span><span style="color: #66cc66;">,</span> primary_key<span style="color: #66cc66;">=</span><span style="color: #008000;">True</span><span style="color: #66cc66;">,</span> unique<span style="color: #66cc66;">=</span><span style="color: #008000;">True</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; category <span style="color: #66cc66;">=</span> db.<span style="color: black;">relationship</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'Category'</span><span style="color: #66cc66;">,</span> back_populates<span style="color: #66cc66;">=</span><span style="color: #483d8b;">&quot;tasks&quot;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; task <span style="color: #66cc66;">=</span> db.<span style="color: black;">relationship</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'Task'</span><span style="color: #66cc66;">,</span> back_populates<span style="color: #66cc66;">=</span><span style="color: #483d8b;">&quot;categories&quot;</span><span style="color: black;">&#41;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #66cc66;">@</span><span style="color: #008000;">property</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">def</span> get_task_cats<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: black;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #483d8b;">'task_cat_id'</span>: <span style="color: #008000;">self</span>.<span style="color: #008000;">id</span><span style="color: #66cc66;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: black;">&#125;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #66cc66;">@</span><span style="color: #008000;">property</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">def</span> get_cats<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">category</span>.<span style="color: black;">get_cats</span><br />
<br />
<br />
<span style="color: #ff7700;font-weight:bold;">class</span> Task<span style="color: black;">&#40;</span>db.<span style="color: black;">Model</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; __tablename__ <span style="color: #66cc66;">=</span> <span style="color: #483d8b;">'tasks'</span><br />
&nbsp; &nbsp; <span style="color: #008000;">id</span> <span style="color: #66cc66;">=</span> db.<span style="color: black;">Column</span><span style="color: black;">&#40;</span>db.<span style="color: black;">Integer</span><span style="color: #66cc66;">,</span> primary_key<span style="color: #66cc66;">=</span><span style="color: #008000;">True</span><span style="color: #66cc66;">,</span> unique<span style="color: #66cc66;">=</span><span style="color: #008000;">True</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; categories <span style="color: #66cc66;">=</span> db.<span style="color: black;">relationship</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'TaskCategory'</span><span style="color: #66cc66;">,</span> back_populates<span style="color: #66cc66;">=</span><span style="color: #483d8b;">&quot;task&quot;</span><span style="color: black;">&#41;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #66cc66;">@</span><span style="color: #008000;">property</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">def</span> serialize<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: black;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #483d8b;">'task_id'</span>: <span style="color: #008000;">self</span>.<span style="color: #008000;">id</span><span style="color: #66cc66;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #483d8b;">'cats'</span>: <span style="color: black;">&#91;</span>x.<span style="color: black;">get_cats</span> <span style="color: #ff7700;font-weight:bold;">for</span> x <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">self</span>.<span style="color: black;">categories</span><span style="color: black;">&#93;</span><span style="color: #66cc66;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #483d8b;">'task_cats'</span>: <span style="color: black;">&#91;</span>x.<span style="color: black;">get_task_cats</span> <span style="color: #ff7700;font-weight:bold;">for</span> x <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">self</span>.<span style="color: black;">categories</span><span style="color: black;">&#93;</span><span style="color: #66cc66;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: black;">&#125;</span><br />
<br />
<br />
<span style="color: #ff7700;font-weight:bold;">class</span> Category<span style="color: black;">&#40;</span>db.<span style="color: black;">Model</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; __tablename__ <span style="color: #66cc66;">=</span> <span style="color: #483d8b;">'categories'</span><br />
&nbsp; &nbsp; tasks <span style="color: #66cc66;">=</span> db.<span style="color: black;">relationship</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'TaskCategory'</span><span style="color: #66cc66;">,</span> back_populates<span style="color: #66cc66;">=</span><span style="color: #483d8b;">&quot;category&quot;</span><span style="color: black;">&#41;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #66cc66;">@</span><span style="color: #008000;">property</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">def</span> get_cats<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: black;">&#123;</span><span style="color: black;">&#125;</span></div></div>
<p>Я говорю об этом участке:</p>
<div class="codecolorer-container python dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;">&nbsp; &nbsp; <span style="color: #66cc66;">@</span><span style="color: #008000;">property</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">def</span> serialize<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: black;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #483d8b;">'task_cats'</span>: <span style="color: black;">&#91;</span>x.<span style="color: black;">get_task_cats</span> <span style="color: #ff7700;font-weight:bold;">for</span> x <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">self</span>.<span style="color: black;">categories</span><span style="color: black;">&#93;</span><span style="color: #66cc66;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #483d8b;">'cats'</span>: <span style="color: black;">&#91;</span>x.<span style="color: black;">get_cats</span> <span style="color: #ff7700;font-weight:bold;">for</span> x <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">self</span>.<span style="color: black;">categories</span><span style="color: black;">&#93;</span><span style="color: #66cc66;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: black;">&#125;</span></div></div>
<p>В примере выше мы хотим получить по свойству <strong>serialize</strong> данные из таблицы <strong>class Task(db.Model)</strong>, но одновременно запрашиваем обработанные данные из двух других связанных таблиц.</p>
<p>В этом случае:</p>
<div class="codecolorer-container python dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;"><span style="color: #483d8b;">'task_cats'</span>: <span style="color: black;">&#91;</span>x.<span style="color: black;">get_task_cats</span> <span style="color: #ff7700;font-weight:bold;">for</span> x <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">self</span>.<span style="color: black;">categories</span><span style="color: black;">&#93;</span></div></div>
<p>обращение идет к данным <strong>class TaskCategory(db.Model)</strong>.</p>
<p>В другом случае:</p>
<div class="codecolorer-container python dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;"><span style="color: #483d8b;">'cats'</span>: <span style="color: black;">&#91;</span>x.<span style="color: black;">get_cats</span> <span style="color: #ff7700;font-weight:bold;">for</span> x <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">self</span>.<span style="color: black;">categories</span><span style="color: black;">&#93;</span></div></div>
<p>обращение идет также к классу <strong>class TaskCategory(db.Model)</strong>, но к функции, которая обращается за данными уже к третей таблице.</p>
<p>Таким образом мы берем данные по связи из третей таблицы через вторую (таблица которая связывает обе).</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ploshadka.net/sqlalchemy-svjazi-relationship/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Как исправить в css заливку при overflow</title>
		<link>https://ploshadka.net/kak-ispravit-v-css-zalivku-pri-overflow/</link>
					<comments>https://ploshadka.net/kak-ispravit-v-css-zalivku-pri-overflow/#respond</comments>
		
		<dc:creator><![CDATA[Admin]]></dc:creator>
		<pubDate>Thu, 20 Oct 2022 08:00:00 +0000</pubDate>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[Css Errors]]></category>
		<guid isPermaLink="false">https://ploshadka.net/?p=8068</guid>

					<description><![CDATA[При свойстве overflow, когда скролится таблица в одну из сторон может наблюдаться баг неполной заливки. Ошибка возникает при: overflow: auto; Для исправления изменим на: display: grid;]]></description>
										<content:encoded><![CDATA[<p>При свойстве overflow, когда скролится таблица в одну из сторон может наблюдаться баг неполной заливки. <span id="more-8068"></span></p>
<p>Ошибка возникает при:</p>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;">overflow: auto;</div></div>
<p><img wpfc-lazyload-disable="true" decoding="async" loading="lazy" src="https://ploshadka.net/wp-content/uploads/8068/img1-600x341.jpg" alt="" width="600" height="341" class="alignnone size-medium wp-image-8070" srcset="https://ploshadka.net/wp-content/uploads/8068/img1-600x341.jpg 600w, https://ploshadka.net/wp-content/uploads/8068/img1-300x171.jpg 300w, https://ploshadka.net/wp-content/uploads/8068/img1.jpg 1034w" sizes="(max-width: 600px) 100vw, 600px" /></p>
<p>Для исправления изменим на:</p>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;">display: grid;</div></div>
<p><img wpfc-lazyload-disable="true" decoding="async" loading="lazy" src="https://ploshadka.net/wp-content/uploads/8068/img2-600x282.jpg" alt="" width="600" height="282" class="alignnone size-medium wp-image-8071" srcset="https://ploshadka.net/wp-content/uploads/8068/img2-600x282.jpg 600w, https://ploshadka.net/wp-content/uploads/8068/img2-300x141.jpg 300w, https://ploshadka.net/wp-content/uploads/8068/img2.jpg 1048w" sizes="(max-width: 600px) 100vw, 600px" /></p>
]]></content:encoded>
					
					<wfw:commentRss>https://ploshadka.net/kak-ispravit-v-css-zalivku-pri-overflow/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Как передать пустое значение с фронта на бэкенд</title>
		<link>https://ploshadka.net/kak-peredat-pustoe-znachenie-s-fronta-na-behkend/</link>
					<comments>https://ploshadka.net/kak-peredat-pustoe-znachenie-s-fronta-na-behkend/#respond</comments>
		
		<dc:creator><![CDATA[Admin]]></dc:creator>
		<pubDate>Wed, 19 Oct 2022 18:39:17 +0000</pubDate>
				<category><![CDATA[Flask]]></category>
		<category><![CDATA[SQLAlchemy]]></category>
		<category><![CDATA[Svelte]]></category>
		<category><![CDATA[pydantic]]></category>
		<guid isPermaLink="false">https://ploshadka.net/?p=8059</guid>

					<description><![CDATA[Как передать пустое значение с фронта, чтобы на бэкенде оно приходило пустым. Для чего это нужно? Например, для удаление из поля данных. Например, при передаче пустой строки &#34; &#34;, бэкенд может вернуть ошибку, если входящие данные проверяются на int или...]]></description>
										<content:encoded><![CDATA[<p>Как передать пустое значение с фронта, чтобы на бэкенде оно приходило пустым. Для чего это нужно? Например, для удаление из поля данных. <span id="more-8059"></span></p>
<p>Например, при передаче пустой строки <strong>&#34; &#34;</strong>, бэкенд может вернуть ошибку, если входящие данные проверяются на int или на none. </p>
<p>Для передачи пустого значения приведем его к <strong>null</strong></p>
<p>На фронте, если передается пустое значение, то превратим в null:</p>
<div class="codecolorer-container javascript dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;"><span style="color: #339933;">&lt;</span>input <span style="color: #FF0000;">class</span><span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;rub edit&quot;</span> type<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;text&quot;</span> bind<span style="color: #339933;">:</span>value<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;{b.rub}&quot;</span> on<span style="color: #339933;">:</span>change<span style="color: #339933;">=</span><span style="color: #009900;">&#123;</span>saveUsersData<span style="color: #009900;">&#40;</span>b<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">&gt;</span><br />
<br />
<span style="color: #000066; font-weight: bold;">function</span> saveUsersData<span style="color: #009900;">&#40;</span>b<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>b.<span style="color: #660066;">rub</span> <span style="color: #339933;">===</span> <span style="color: #3366CC;">''</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; b.<span style="color: #660066;">rub</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">null</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
<br />
&nbsp; &nbsp; let data <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #3366CC;">'rub'</span><span style="color: #339933;">:</span> b.<span style="color: #660066;">rub</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
<br />
&nbsp; &nbsp; patchFetch<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'balance/update/'</span><span style="color: #339933;">,</span> data<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span></div></div>
<p>На бэкенде проверим это значение на число через <strong>pydantic</strong>:</p>
<div class="codecolorer-container python dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;">sum_in_rub: Optional<span style="color: black;">&#91;</span><span style="color: #008000;">int</span><span style="color: black;">&#93;</span></div></div>
<p>Видим, что пройдет только int и на пустое значение <strong>&#34; &#34;</strong> возвратит ошибку.</p>
<p>А затем сохраним или значение, которое есть или значения, которого нет:</p>
<div class="codecolorer-container python dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;"><span style="color: #ff7700;font-weight:bold;">def</span> update_balance<span style="color: black;">&#40;</span>user_id<span style="color: #66cc66;">,</span> rub<span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> rub <span style="color: #ff7700;font-weight:bold;">or</span> rub <span style="color: #ff7700;font-weight:bold;">is</span> <span style="color: #008000;">None</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; db.<span style="color: black;">session</span>.<span style="color: black;">query</span><span style="color: black;">&#40;</span>Balance<span style="color: black;">&#41;</span>.<span style="color: black;">filter_by</span><span style="color: black;">&#40;</span>user_id<span style="color: #66cc66;">=</span>user_id<span style="color: #66cc66;">,</span> <span style="color: #008000;">id</span><span style="color: #66cc66;">=</span>id_<span style="color: black;">&#41;</span>.<span style="color: black;">update</span><span style="color: black;">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: black;">&#123;</span><span style="color: #483d8b;">'rub'</span>: rub<span style="color: black;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: black;">&#41;</span></div></div>
]]></content:encoded>
					
					<wfw:commentRss>https://ploshadka.net/kak-peredat-pustoe-znachenie-s-fronta-na-behkend/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Как запустить python скрипт на Linux в виде demon</title>
		<link>https://ploshadka.net/kak-zapustit-python-skript-na-linux-v-vide-demon/</link>
					<comments>https://ploshadka.net/kak-zapustit-python-skript-na-linux-v-vide-demon/#respond</comments>
		
		<dc:creator><![CDATA[Admin]]></dc:creator>
		<pubDate>Sun, 16 Oct 2022 18:23:40 +0000</pubDate>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Python]]></category>
		<guid isPermaLink="false">https://ploshadka.net/?p=8051</guid>

					<description><![CDATA[Описание процесса от создания БД и до запуска скрипта. Соединяемся со своим сервером и дальше работаем через консоль. Переносим локальный проект на сервер Создаем директорию для нашего нового приложения: cd /home/ploshadka/new-application mkdir new-application Клонируем свой git-проект на наш сервер: git...]]></description>
										<content:encoded><![CDATA[<p>Описание процесса от создания БД и до запуска скрипта. <span id="more-8051"></span></p>
<p>Соединяемся со своим сервером и дальше работаем через консоль.</p>
<h2>Переносим локальный проект на сервер</h2>
<p>Создаем директорию для нашего нового приложения:</p>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;">cd /home/ploshadka/new-application<br />
mkdir new-application</div></div>
<p>Клонируем свой git-проект на наш сервер:</p>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;">git clone &quot;&#x67;i&#x74;&#64;g&#x69;t&#x68;&#117;b&#x2e;c&#x6f;&#109;:nikname/name_repository.git&quot; ./</div></div>
<p>Создаем виртуальное окружение python:</p>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;">python3 -m venv venv</div></div>
<p>Активируем оболочку:</p>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;">source venv/bin/activate</div></div>
<p>Устанавливаем зависимости:</p>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;">pip install --upgrade pip<br />
pip install -r requirements.txt</div></div>
<h2>Создаем БД в PostgreSQL</h2>
<p>Подключаемся к PostgreSQL:</p>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;">sudo su - postgres</div></div>
<p>Создаем БД</p>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;">CREATE DATABASE new-application TEMPLATE=template0 ENCODING 'UTF-8' LC_COLLATE 'ru_RU.UTF-8' LC_CTYPE 'ru_RU.UTF-8';</div></div>
<p>Назначаем привелегии новой таблице:</p>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;">GRANT ALL PRIVILEGES ON DATABASE new-application TO ploshadka;</div></div>
<p>Импортируем БД:</p>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;">pg_restore -U ploshadka -d new-application /home/ploshadka/new-application/bd.tar</div></div>
<p>Выходим из postgres окружения:</p>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;">exit</div></div>
<h2>В коде должно быть подключение к PostreSQL</h2>
<p>Выдержка из примера подключения к PostreSQL вместе с логированием.</p>
<div class="codecolorer-container python dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;"><span style="color: #ff7700;font-weight:bold;">def</span> create_connection<span style="color: black;">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; db_name<span style="color: #66cc66;">=</span><span style="color: #483d8b;">'new-application'</span><span style="color: #66cc66;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; db_user<span style="color: #66cc66;">=</span><span style="color: #483d8b;">'ploshadka'</span><span style="color: #66cc66;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; db_password<span style="color: #66cc66;">=</span><span style="color: #483d8b;">'12345'</span><span style="color: #66cc66;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; db_host<span style="color: #66cc66;">=</span><span style="color: #483d8b;">'localhost'</span><span style="color: #66cc66;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; db_port<span style="color: #66cc66;">=</span><span style="color: #ff4500;">5432</span><br />
<span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; connection <span style="color: #66cc66;">=</span> <span style="color: #008000;">None</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">try</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; connection <span style="color: #66cc66;">=</span> psycopg2.<span style="color: black;">connect</span><span style="color: black;">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; database<span style="color: #66cc66;">=</span>db_name<span style="color: #66cc66;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #dc143c;">user</span><span style="color: #66cc66;">=</span>db_user<span style="color: #66cc66;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; password<span style="color: #66cc66;">=</span>db_password<span style="color: #66cc66;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; host<span style="color: #66cc66;">=</span>db_host<span style="color: #66cc66;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; port<span style="color: #66cc66;">=</span>db_port<span style="color: #66cc66;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; connection.<span style="color: black;">autocommit</span> <span style="color: #66cc66;">=</span> <span style="color: #008000;">True</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">except</span> psycopg2.<span style="color: black;">OperationalError</span> <span style="color: #ff7700;font-weight:bold;">as</span> error:<br />
&nbsp; &nbsp; &nbsp; &nbsp; logger.<span style="color: black;">info</span><span style="color: black;">&#40;</span>f<span style="color: #483d8b;">'Ошибка: {error}'</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> connection</div></div>
<h2>Создаем демон для запуска нашего скрипта на python</h2>
<p>Создаем службу:</p>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;">sudo nano /etc/systemd/system/new-application.service</div></div>
<p>Внутри этого файла вставляем:</p>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;">Description=New Application<br />
After=network.target<br />
<br />
[Service]<br />
User=ploshadka<br />
Group=www-data<br />
WorkingDirectory=/home/ploshadka/new-application<br />
Environment=&quot;PATH=/home/ploshadka/new-application/venv/bin&quot;<br />
ExecStart=/home/ploshadka/new-application/venv/bin/python bot.py --start<br />
ExecStop=/home/ploshadka/new-application/venv/bin/python bot.py --stop<br />
ExecReload=/home/ploshadka/new-application/venv/bin/python bot.py --restart<br />
TimeoutSec=30<br />
Restart=always</div></div>
<p>Команды для запуска, остановки, перезагрузки службы</p>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;">sudo systemctl start new-application<br />
sudo systemctl stop new-application<br />
sudo systemctl start new-application<br />
sudo systemctl reload new-application</div></div>
<p>Узнать статус работы:</p>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;">sudo systemctl status new-application</div></div>
]]></content:encoded>
					
					<wfw:commentRss>https://ploshadka.net/kak-zapustit-python-skript-na-linux-v-vide-demon/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Установка FastApi</title>
		<link>https://ploshadka.net/ustanovka-fastapi/</link>
					<comments>https://ploshadka.net/ustanovka-fastapi/#respond</comments>
		
		<dc:creator><![CDATA[Admin]]></dc:creator>
		<pubDate>Wed, 03 Aug 2022 08:00:00 +0000</pubDate>
				<category><![CDATA[FastAPI]]></category>
		<guid isPermaLink="false">https://ploshadka.net/?p=8037</guid>

					<description><![CDATA[Установка и настройка FastApi. Статья не полная, будет со временем наполняться. Установка модулей Основной модуль pip install fastapi ASGI web server pip install uvicorn Модуль валидации и аннотации pip install pydantic Поддержка асинхронности для файлов pip install aiofiles Адаптер для...]]></description>
										<content:encoded><![CDATA[<p>Установка и настройка FastApi. Статья не полная, будет со временем наполняться. <span id="more-8037"></span></p>
<h2>Установка модулей</h2>
<p>Основной модуль</p>
<div class="codecolorer-container bash dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;">pip <span style="color: #c20cb9; font-weight: bold;">install</span> fastapi</div></div>
<p>ASGI web server</p>
<div class="codecolorer-container bash dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;">pip <span style="color: #c20cb9; font-weight: bold;">install</span> uvicorn</div></div>
<p>Модуль валидации и аннотации</p>
<div class="codecolorer-container bash dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;">pip <span style="color: #c20cb9; font-weight: bold;">install</span> pydantic</div></div>
<p>Поддержка асинхронности для файлов</p>
<div class="codecolorer-container bash dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;">pip <span style="color: #c20cb9; font-weight: bold;">install</span> aiofiles</div></div>
<p>Адаптер для PostgreSQL</p>
<div class="codecolorer-container bash dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;">pip <span style="color: #c20cb9; font-weight: bold;">install</span> psycopg2</div></div>
<p>ОРМ SQLAlchemy</p>
<div class="codecolorer-container bash dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;">pip <span style="color: #c20cb9; font-weight: bold;">install</span> SQLAlchemy</div></div>
<p>Асинхронный драйвер для SQLAlchemy</p>
<div class="codecolorer-container bash dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;">pip <span style="color: #c20cb9; font-weight: bold;">install</span> asyncpg</div></div>
<p>Миграция alembic</p>
<div class="codecolorer-container bash dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;">pip <span style="color: #c20cb9; font-weight: bold;">install</span> alembic</div></div>
<p>Шаблонизатор</p>
<div class="codecolorer-container bash dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;">pip <span style="color: #c20cb9; font-weight: bold;">install</span> jinja2</div></div>
]]></content:encoded>
					
					<wfw:commentRss>https://ploshadka.net/ustanovka-fastapi/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Flask Login Pytest API</title>
		<link>https://ploshadka.net/flask-login-pytest-api/</link>
					<comments>https://ploshadka.net/flask-login-pytest-api/#respond</comments>
		
		<dc:creator><![CDATA[Admin]]></dc:creator>
		<pubDate>Mon, 01 Aug 2022 12:46:12 +0000</pubDate>
				<category><![CDATA[Flask]]></category>
		<category><![CDATA[Pytest]]></category>
		<guid isPermaLink="false">https://ploshadka.net/?p=8024</guid>

					<description><![CDATA[Конфигурация PyTest для тестирования Flask API при использовании Flask-Login (Flask-Admin, Flask-Security) при которой тесты обходят авторизацию на сайте. Описание проблемы При тестировании, особенно при тестировании API для прохождения тестов необходимо обойти авторизацию на сайте. Для этого будем использовать встроенные функции....]]></description>
										<content:encoded><![CDATA[<p>Конфигурация <strong>PyTest</strong> для тестирования <strong>Flask API</strong> при использовании <strong>Flask-Login (Flask-Admin, Flask-Security)</strong> при которой тесты обходят авторизацию на сайте. <span id="more-8024"></span></p>
<h2>Описание проблемы</h2>
<p>При тестировании, особенно при тестировании API для прохождения тестов необходимо обойти авторизацию на сайте. Для этого будем использовать встроенные функции. Ниже две конфигурации при которой всё работает.</p>
<p>Код учитывает обход как <strong>@login_required</strong> для путей API, так и авторизирует пользователя при прохождении тестов. В результате <strong>flask_login.current_user.id</strong> видит указанного пользователя.</p>
<h2>Конфигурация 1</h2>
<p>Содержимое файла <strong>conftest.py</strong>. Этот файл используется для инициализации тестов.</p>
<div class="codecolorer-container python dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;"><span style="color: #ff7700;font-weight:bold;">import</span> flask_login<br />
<span style="color: #ff7700;font-weight:bold;">import</span> pytest<br />
<span style="color: #ff7700;font-weight:bold;">from</span> app <span style="color: #ff7700;font-weight:bold;">import</span> app<span style="color: #66cc66;">,</span> db<br />
<span style="color: #ff7700;font-weight:bold;">from</span> app.<span style="color: black;">models</span>.<span style="color: black;">users</span> <span style="color: #ff7700;font-weight:bold;">import</span> User<br />
<br />
<br />
<span style="color: #66cc66;">@</span>pytest.<span style="color: black;">fixture</span><br />
<span style="color: #ff7700;font-weight:bold;">def</span> client<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; app.<span style="color: black;">config</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">&quot;TESTING&quot;</span><span style="color: black;">&#93;</span> <span style="color: #66cc66;">=</span> <span style="color: #008000;">True</span><br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># Обходит @login_required</span><br />
&nbsp; &nbsp; app.<span style="color: black;">config</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">&quot;LOGIN_DISABLED&quot;</span><span style="color: black;">&#93;</span> <span style="color: #66cc66;">=</span> <span style="color: #008000;">True</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">with</span> app.<span style="color: black;">test_client</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #ff7700;font-weight:bold;">as</span> client:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">yield</span> client<br />
<br />
<br />
<span style="color: #66cc66;">@</span>pytest.<span style="color: black;">fixture</span><br />
<span style="color: #ff7700;font-weight:bold;">def</span> authenticated_request<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># Решает проблему с flask_login.current_user.id:</span><br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># AttributeError: 'AnonymousUser' object has no attribute 'id'</span><br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># Создает авторизацию пользователя</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">with</span> app.<span style="color: black;">test_request_context</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; test_user <span style="color: #66cc66;">=</span> db.<span style="color: black;">session</span>.<span style="color: black;">query</span><span style="color: black;">&#40;</span>User<span style="color: black;">&#41;</span>.<span style="color: black;">filter_by</span><span style="color: black;">&#40;</span><span style="color: #008000;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>.<span style="color: black;">first</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">yield</span> flask_login.<span style="color: black;">login_user</span><span style="color: black;">&#40;</span>test_user<span style="color: black;">&#41;</span></div></div>
<p>Содержимое файла <strong>test-category.py</strong></p>
<div class="codecolorer-container python dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;"><span style="color: #ff7700;font-weight:bold;">import</span> json<br />
<span style="color: #ff7700;font-weight:bold;">import</span> pytest<br />
<br />
<span style="color: #ff7700;font-weight:bold;">from</span> app <span style="color: #ff7700;font-weight:bold;">import</span> db<br />
<span style="color: #ff7700;font-weight:bold;">from</span> app.<span style="color: black;">models</span>.<span style="color: black;">categories</span> <span style="color: #ff7700;font-weight:bold;">import</span> Category<br />
<span style="color: #ff7700;font-weight:bold;">from</span> app.<span style="color: black;">repositories</span>.<span style="color: black;">category</span> <span style="color: #ff7700;font-weight:bold;">import</span> get_category_by_id<br />
<br />
headers <span style="color: #66cc66;">=</span> <span style="color: black;">&#123;</span><span style="color: #483d8b;">&quot;Content-Type&quot;</span>: <span style="color: #483d8b;">&quot;application/json&quot;</span><span style="color: black;">&#125;</span><br />
<br />
<span style="color: #66cc66;">@</span>pytest.<span style="color: black;">mark</span>.<span style="color: black;">usefixtures</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;authenticated_request&quot;</span><span style="color: black;">&#41;</span><br />
<span style="color: #ff7700;font-weight:bold;">def</span> test_category_rename<span style="color: black;">&#40;</span>client<span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># Create test data</span><br />
&nbsp; &nbsp; user_id <span style="color: #66cc66;">=</span> <span style="color: #ff4500;">1</span><br />
&nbsp; &nbsp; cat <span style="color: #66cc66;">=</span> Category<span style="color: black;">&#40;</span>user_id<span style="color: #66cc66;">=</span>user_id<span style="color: #66cc66;">,</span> name<span style="color: #66cc66;">=</span><span style="color: #483d8b;">'Test Category'</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; db.<span style="color: black;">session</span>.<span style="color: black;">add</span><span style="color: black;">&#40;</span>cat<span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; db.<span style="color: black;">session</span>.<span style="color: black;">commit</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># Mock</span><br />
&nbsp; &nbsp; mock_name <span style="color: #66cc66;">=</span> <span style="color: #483d8b;">'Test Category New'</span><br />
&nbsp; &nbsp; mock_request_data <span style="color: #66cc66;">=</span> <span style="color: black;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #483d8b;">'cat_id'</span>: cat.<span style="color: #008000;">id</span><span style="color: #66cc66;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #483d8b;">'name'</span>: mock_name<span style="color: #66cc66;">,</span><br />
&nbsp; &nbsp; <span style="color: black;">&#125;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># Rename category</span><br />
&nbsp; &nbsp; url <span style="color: #66cc66;">=</span> <span style="color: #483d8b;">'http://127.0.0.1:5000/categories/update/'</span><br />
&nbsp; &nbsp; client.<span style="color: black;">patch</span><span style="color: black;">&#40;</span>url<span style="color: #66cc66;">,</span> headers<span style="color: #66cc66;">=</span>headers<span style="color: #66cc66;">,</span> data<span style="color: #66cc66;">=</span>json.<span style="color: black;">dumps</span><span style="color: black;">&#40;</span>mock_request_data<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># Check new name</span><br />
&nbsp; &nbsp; category <span style="color: #66cc66;">=</span> get_category_by_id<span style="color: black;">&#40;</span>user_id<span style="color: #66cc66;">,</span> cat.<span style="color: #008000;">id</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">assert</span> category.<span style="color: black;">name</span> <span style="color: #66cc66;">==</span> mock_name<br />
<br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># Clear test data</span><br />
&nbsp; &nbsp; db.<span style="color: black;">session</span>.<span style="color: black;">delete</span><span style="color: black;">&#40;</span>category<span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; db.<span style="color: black;">session</span>.<span style="color: black;">commit</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></div></div>
<p>Ссылка на <a href="https://github.com/ploshadka/flask-login-pytest/tree/main/example-short" rel="noopener" target="_blank">репозиторий в GitHub</a>.</p>
<h2>Конфигурация 2</h2>
<p>Если не нужен обход авторизации во всех тестах можно обходить авторизацию в каждом отдельном тесте.</p>
<p>Содержимое файла <strong>conftest.py</strong>:</p>
<div class="codecolorer-container python dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;"><span style="color: #ff7700;font-weight:bold;">import</span> pytest<br />
<span style="color: #ff7700;font-weight:bold;">from</span> app <span style="color: #ff7700;font-weight:bold;">import</span> app<span style="color: #66cc66;">,</span> db<br />
<br />
<br />
<span style="color: #66cc66;">@</span>pytest.<span style="color: black;">fixture</span><br />
<span style="color: #ff7700;font-weight:bold;">def</span> client<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; app.<span style="color: black;">config</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">&quot;TESTING&quot;</span><span style="color: black;">&#93;</span> <span style="color: #66cc66;">=</span> <span style="color: #008000;">True</span><br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># Bypasses @login_required</span><br />
&nbsp; &nbsp; app.<span style="color: black;">config</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">&quot;LOGIN_DISABLED&quot;</span><span style="color: black;">&#93;</span> <span style="color: #66cc66;">=</span> <span style="color: #008000;">True</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">with</span> app.<span style="color: black;">test_client</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #ff7700;font-weight:bold;">as</span> client:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">yield</span> client</div></div>
<p>Содержимое файла <strong>test_category.py</strong>:</p>
<div class="codecolorer-container python dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;"><span style="color: #ff7700;font-weight:bold;">import</span> json<br />
<span style="color: #ff7700;font-weight:bold;">from</span> app <span style="color: #ff7700;font-weight:bold;">import</span> db<span style="color: #66cc66;">,</span> app<br />
<span style="color: #ff7700;font-weight:bold;">from</span> app.<span style="color: black;">models</span>.<span style="color: black;">categories</span> <span style="color: #ff7700;font-weight:bold;">import</span> Category<br />
<span style="color: #ff7700;font-weight:bold;">from</span> app.<span style="color: black;">models</span>.<span style="color: black;">users</span> <span style="color: #ff7700;font-weight:bold;">import</span> User<br />
<span style="color: #ff7700;font-weight:bold;">from</span> app.<span style="color: black;">repositories</span>.<span style="color: black;">category</span> <span style="color: #ff7700;font-weight:bold;">import</span> get_category_by_id<br />
<br />
headers <span style="color: #66cc66;">=</span> <span style="color: black;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #483d8b;">&quot;Content-Type&quot;</span>: <span style="color: #483d8b;">&quot;application/json&quot;</span><span style="color: #66cc66;">,</span><br />
<span style="color: black;">&#125;</span><br />
<br />
<br />
<span style="color: #ff7700;font-weight:bold;">def</span> test_category_rename<span style="color: black;">&#40;</span>client<span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># Create test data</span><br />
&nbsp; &nbsp; user_id <span style="color: #66cc66;">=</span> <span style="color: #ff4500;">1</span><br />
&nbsp; &nbsp; cat <span style="color: #66cc66;">=</span> Category<span style="color: black;">&#40;</span>user_id<span style="color: #66cc66;">=</span>user_id<span style="color: #66cc66;">,</span> name<span style="color: #66cc66;">=</span><span style="color: #483d8b;">'Test Category'</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; db.<span style="color: black;">session</span>.<span style="color: black;">add</span><span style="color: black;">&#40;</span>cat<span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; db.<span style="color: black;">session</span>.<span style="color: black;">commit</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># Mock</span><br />
&nbsp; &nbsp; mock_name <span style="color: #66cc66;">=</span> <span style="color: #483d8b;">'Test Category New'</span><br />
&nbsp; &nbsp; mock_request_data <span style="color: #66cc66;">=</span> <span style="color: black;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #483d8b;">'cat_id'</span>: cat.<span style="color: #008000;">id</span><span style="color: #66cc66;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #483d8b;">'name'</span>: mock_name<span style="color: #66cc66;">,</span><br />
&nbsp; &nbsp; <span style="color: black;">&#125;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">with</span> app.<span style="color: black;">test_client</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #ff7700;font-weight:bold;">as</span> client:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># Решает проблему с flask_login.current_user.id:</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># AttributeError: 'AnonymousUser' object has no attribute 'id'</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; test_user <span style="color: #66cc66;">=</span> db.<span style="color: black;">session</span>.<span style="color: black;">query</span><span style="color: black;">&#40;</span>User<span style="color: black;">&#41;</span>.<span style="color: black;">filter_by</span><span style="color: black;">&#40;</span><span style="color: #008000;">id</span><span style="color: #66cc66;">=</span>user_id<span style="color: black;">&#41;</span>.<span style="color: black;">first</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #66cc66;">@</span>app.<span style="color: black;">login_manager</span>.<span style="color: black;">request_loader</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">def</span> load_user_from_request<span style="color: black;">&#40;</span>request<span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> test_user<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># Tests starts here</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; url <span style="color: #66cc66;">=</span> <span style="color: #483d8b;">'http://127.0.0.1:5000/categories/update/'</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; client.<span style="color: black;">patch</span><span style="color: black;">&#40;</span>url<span style="color: #66cc66;">,</span> headers<span style="color: #66cc66;">=</span>headers<span style="color: #66cc66;">,</span> data<span style="color: #66cc66;">=</span>json.<span style="color: black;">dumps</span><span style="color: black;">&#40;</span>mock_request_data<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># Check new name</span><br />
&nbsp; &nbsp; category <span style="color: #66cc66;">=</span> get_category_by_id<span style="color: black;">&#40;</span>user_id<span style="color: #66cc66;">,</span> <span style="color: #ff4500;">576</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">assert</span> category.<span style="color: black;">name</span> <span style="color: #66cc66;">==</span> mock_name<br />
<br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># Clear test data</span><br />
&nbsp; &nbsp; db.<span style="color: black;">session</span>.<span style="color: black;">delete</span><span style="color: black;">&#40;</span>category<span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; db.<span style="color: black;">session</span>.<span style="color: black;">commit</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></div></div>
<p>Ссылка на <a href="https://github.com/ploshadka/flask-login-pytest/tree/main/example-long" rel="noopener" target="_blank">репозиторий в GitHub</a>.</p>
<h2>Запуск тестов</h2>
<p>Запуск тестов осуществляется командой:</p>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;">pytest app/tests/</div></div>
<p>Дополнительные ключи:</p>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;"># -s - отображает содержимое print<br />
# -v - отображает полное название тестов<br />
# --disable-pytest-warnings - убирает warnings summary</div></div>
]]></content:encoded>
					
					<wfw:commentRss>https://ploshadka.net/flask-login-pytest-api/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>fastapi users coroutine &#8216;create_db_and_tables&#8217; was never awaited</title>
		<link>https://ploshadka.net/fastapi-users-coroutine-create_db_and_tables-was-never-awaited/</link>
					<comments>https://ploshadka.net/fastapi-users-coroutine-create_db_and_tables-was-never-awaited/#respond</comments>
		
		<dc:creator><![CDATA[Admin]]></dc:creator>
		<pubDate>Fri, 15 Jul 2022 08:00:00 +0000</pubDate>
				<category><![CDATA[Python Errors]]></category>
		<guid isPermaLink="false">https://ploshadka.net/?p=8003</guid>

					<description><![CDATA[Ошибки с созданием таблиц в fastapi users. Ошибки fastapi users coroutine &#8216;create_db_and_tables&#8217; was never awaited Если запустить через asyncio.run(), то возникнет другая ошибка: RuntimeError: asyncio.run() cannot be called from a running event loop Решение Для решение запустить инсталляцию таблиц в...]]></description>
										<content:encoded><![CDATA[<p>Ошибки с созданием таблиц в fastapi users. <span id="more-8003"></span></p>
<h2>Ошибки</h2>
<blockquote><p>fastapi users coroutine &#8216;create_db_and_tables&#8217; was never awaited</p></blockquote>
<p>Если запустить через asyncio.run(), то возникнет другая ошибка:</p>
<blockquote><p>RuntimeError: asyncio.run() cannot be called from a running event loop</p></blockquote>
<h2>Решение</h2>
<p>Для решение запустить инсталляцию таблиц в БД через роут, например так:</p>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;">@router.get('/')<br />
async def create_db(favorite: Optional[bool] = None, db: Session = Depends(get_db)):<br />
return await create_db_and_tables()</div></div>
]]></content:encoded>
					
					<wfw:commentRss>https://ploshadka.net/fastapi-users-coroutine-create_db_and_tables-was-never-awaited/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Команды для Alembic</title>
		<link>https://ploshadka.net/komandy-dlja-alembic/</link>
					<comments>https://ploshadka.net/komandy-dlja-alembic/#respond</comments>
		
		<dc:creator><![CDATA[Admin]]></dc:creator>
		<pubDate>Thu, 14 Jul 2022 13:48:29 +0000</pubDate>
				<category><![CDATA[SQLAlchemy]]></category>
		<guid isPermaLink="false">https://ploshadka.net/?p=8007</guid>

					<description><![CDATA[Чистый Alembic для SQLALchemy отличается от команд на Flask. Разберем основные команды для Alembic. SQLAlchemy на Flask flask db init flask db migrate -m &#34;Update&#34; flask db upgrade Чистый Alembic для FastAPI alembic init alembic alembic init db-migration / alembic...]]></description>
										<content:encoded><![CDATA[<p>Чистый Alembic для SQLALchemy отличается от команд на Flask. Разберем основные команды для Alembic. <span id="more-8007"></span></p>
<h2>SQLAlchemy на Flask</h2>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;">flask db init<br />
flask db migrate -m &quot;Update&quot;<br />
flask db upgrade</div></div>
<h2>Чистый Alembic для FastAPI</h2>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;">alembic init alembic<br />
alembic init db-migration / alembic init -t async migrations<br />
alembic upgrade head</div></div>
]]></content:encoded>
					
					<wfw:commentRss>https://ploshadka.net/komandy-dlja-alembic/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
