<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Anton Shcherbatov</title>
    <description>The latest articles on DEV Community by Anton Shcherbatov (@storvus).</description>
    <link>https://dev.to/storvus</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1091925%2F1235b56d-8d46-4677-abc4-2e8aa9670d6b.jpeg</url>
      <title>DEV Community: Anton Shcherbatov</title>
      <link>https://dev.to/storvus</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/storvus"/>
    <language>en</language>
    <item>
      <title>More abbreviations to the abbreviation's God</title>
      <dc:creator>Anton Shcherbatov</dc:creator>
      <pubDate>Sun, 11 Jun 2023 19:54:17 +0000</pubDate>
      <link>https://dev.to/storvus/more-abbreviations-to-the-abbreviations-god-1lek</link>
      <guid>https://dev.to/storvus/more-abbreviations-to-the-abbreviations-god-1lek</guid>
      <description>&lt;p&gt;At the work I meet a lot of different abbreviations. Some of them are insignificant, some of them are pretty useful, but most of them you're already know. Nevertheless, they describe the developing process in a way it should be and can help to build a real robust applications. There is a list of the most common of them. Which ones would you like to add?&lt;/p&gt;

&lt;p&gt;SOLID Principles&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;S (Single Responsibility)&lt;/strong&gt; Every class is responsible for the on operation only.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;O (Open Closed)&lt;/strong&gt; The classes have to be open for extending and closed for modification&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;L (Liskov substitution)&lt;/strong&gt; It should be possible to use a child class (type) instead of a parent without negative consequences&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;I (Interface Segregation)&lt;/strong&gt; You shouldn't force a class to implement an interface, which doesn't relate to the class&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;D (Dependency Inversion)&lt;/strong&gt; Abstractions don't depend on the details, but details do depend on the abstractions&lt;/li&gt;
&lt;/ul&gt;




&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;YAGNI (You're not gonna need it)&lt;/strong&gt; If you're writing the code, ensure you're gonna use it. &lt;strong&gt;Don't&lt;/strong&gt; add the code if you think it'll be useful later&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DRY (Don't repeat yourself)&lt;/strong&gt; Pretty obvious. Don't hurry to write the code - look around. Likely, someone already wrote it. This is why I love pull requests for - somebody can remember that your functional already exists and we don't actually need. Seriously?! Where have you been during the sprint planning?!&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;KISS (Keep it simple, stupid)&lt;/strong&gt; Well, just be simpler. The simpler code, the better it works. If a task doesn't require over-complicated solution, just use the solution. It supposes that you have multiple solution of the task. Haha :\&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;BDUF (Big design up front)&lt;/strong&gt; This is what I'm lack in. No time to think, just write the &lt;del&gt;f..&lt;/del&gt; code. It's incorrect. Before starting coding, ensure that everything is well thought out&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;APO (Avoid Premature Optimization)&lt;/strong&gt; Don't force the code optimization until it's really necessary.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;There are much more abbreviations in a programming world. Which one is your favourite? My favourite is LGTM in the comments of pull requests!&lt;/p&gt;

</description>
      <category>solidity</category>
      <category>learning</category>
      <category>yagni</category>
      <category>dry</category>
    </item>
    <item>
      <title>Bottle+Sqlite</title>
      <dc:creator>Anton Shcherbatov</dc:creator>
      <pubDate>Thu, 01 Jun 2023 19:10:50 +0000</pubDate>
      <link>https://dev.to/storvus/bottlesqlite-4off</link>
      <guid>https://dev.to/storvus/bottlesqlite-4off</guid>
      <description>&lt;p&gt;A few more words about Bottle. After enabling a sqlite extension, you can easily include a specified keyword as a view argument. Like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;bottle&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Bottle&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;db_plugin&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;bottle_sqlite&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Plugin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dbfile&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;'./test.db'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;keyword&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"db"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;install&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;db_plugin&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;route&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="p"&gt;....&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It works perfect... Until you decide to show the view for authorized users only. And this&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;bottle&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;auth_basic&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;save_post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="p"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;will cause&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;TypeError("main() missing 1 required positional argument: 'db'")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is a &lt;a href="https://github.com/bottlepy/bottle-sqlite/issues/21"&gt;known issue&lt;/a&gt;, which still wasn't solved on the plugin level. So, again &lt;a href="https://github.com/storvus/effective-pancake/blob/bottle/db/bottle_sqlite.py"&gt;workarounds&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The only change here is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;params&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;inspect&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;signature&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_callback&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;parameters&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;keyword&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;callback&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;instead of&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;argspec&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;inspect&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getargspec&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_callback&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
    </item>
    <item>
      <title>Bottle</title>
      <dc:creator>Anton Shcherbatov</dc:creator>
      <pubDate>Tue, 30 May 2023 09:02:48 +0000</pubDate>
      <link>https://dev.to/storvus/bottle-4e33</link>
      <guid>https://dev.to/storvus/bottle-4e33</guid>
      <description>&lt;p&gt;Bottle is a really small python-based framework. The whole its code takes 1 file with ~4000 rows. Meanwhile, Bottle is pretty self-sufficient - it supports:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;wsgi-server&lt;/li&gt;
&lt;li&gt;routing&lt;/li&gt;
&lt;li&gt;authorization&lt;/li&gt;
&lt;li&gt;plugins&lt;/li&gt;
&lt;li&gt;own templates language&lt;/li&gt;
&lt;li&gt;a lot of extensions (mostly one-paged too)&lt;/li&gt;
&lt;li&gt;custom error pages&lt;/li&gt;
&lt;li&gt;and much more!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I was excited trying to write my blog using Bottle. The first issue I faced - you can login, but you can't logout :D&lt;/p&gt;

&lt;p&gt;Bottle supports basic auth mechanism, so you can do something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;auth_callback&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;password&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;password&lt;/span&gt;  &lt;span class="c1"&gt;# or any check you want
&lt;/span&gt;
&lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;bottle&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;auth_basic&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;auth_callback&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;edit_post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;post_id&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="p"&gt;....&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;But there is no way to logout. The only workaround I found is to return 401 status as a response. It allows to force logout the user. It's not quite correct, because user doesn't expect to get 401Error on logout, but this is why it's called workaround.&lt;/p&gt;

&lt;p&gt;To make the solution to look more pretty I also customized 401 Error page, by adding an html-template with link to login.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;logout&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;bottle&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;abort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;401&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;401&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;error_401&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;bottle&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;template&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"errors/401"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;route&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/logout/"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"GET"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;logout&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;As alternative, there is an extension for bottle, called bottle-login, which has been archived few years ago.&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--A9-wwsHG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/klen"&gt;
        klen
      &lt;/a&gt; / &lt;a href="https://github.com/klen/bottle-login"&gt;
        bottle-login
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Implement users' sessions in Bottle framework
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="rst"&gt;
&lt;h1&gt;
Bottle Login&lt;/h1&gt;
&lt;p id="user-content-description"&gt;Bottle Login -- Implement users' sessions in Bottle web framework.&lt;/p&gt;
&lt;a href="http://travis-ci.org/klen/bottle-login" id="user-content-badges" rel="nofollow"&gt;&lt;img alt="Build Status" src="https://camo.githubusercontent.com/96a9519f93ad3f86da7f94b87d3a40feeebec9124961203c4bd8e4cde59cb73c/687474703a2f2f696d672e736869656c64732e696f2f7472617669732f6b6c656e2f626f74746c652d6c6f67696e2e7376673f7374796c653d666c61742d737175617265"&gt;&lt;/a&gt;
&lt;a href="https://coveralls.io/r/klen/bottle-login" rel="nofollow"&gt;&lt;img alt="Coverals" src="https://camo.githubusercontent.com/c4b24ba8764b6d26f874d847c5c68949b51317577588d26833ea64d8d7ae7bae/687474703a2f2f696d672e736869656c64732e696f2f636f766572616c6c732f6b6c656e2f626f74746c652d6c6f67696e2e7376673f7374796c653d666c61742d737175617265"&gt;&lt;/a&gt;
&lt;a href="https://pypi.python.org/pypi/bottle-login" rel="nofollow"&gt;&lt;img alt="http://img.shields.io/pypi/v/bottle-login.svg?style=flat-square" src="https://camo.githubusercontent.com/3fb659198db89c40c8ecdf7d593f4d992b022a617f01deff45cd0b02f79b8783/687474703a2f2f696d672e736869656c64732e696f2f707970692f762f626f74746c652d6c6f67696e2e7376673f7374796c653d666c61742d737175617265"&gt;&lt;/a&gt;
&lt;a href="https://pypi.python.org/pypi/bottle-login" rel="nofollow"&gt;&lt;img alt="http://img.shields.io/pypi/dm/bottle-login.svg?style=flat-square" src="https://camo.githubusercontent.com/909a82677398653c3499af3707545f00aefaee57f0630797739342112115527e/687474703a2f2f696d672e736869656c64732e696f2f707970692f646d2f626f74746c652d6c6f67696e2e7376673f7374796c653d666c61742d737175617265"&gt;&lt;/a&gt;
&lt;a href="https://www.gratipay.com/klen/" rel="nofollow"&gt;&lt;img alt="Donate" src="https://camo.githubusercontent.com/4bf6c8c22667967dfd5fd7501f392b3c7b935e61effe3bcf6068a7448fa2875e/687474703a2f2f696d672e736869656c64732e696f2f67726174697061792f6b6c656e2e7376673f7374796c653d666c61742d737175617265"&gt;&lt;/a&gt;
&lt;div id="user-content-id1"&gt;
&lt;p&gt;Contents&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/klen/bottle-login#id2" id="user-content-id7"&gt;Requirements&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/klen/bottle-login#id3" id="user-content-id8"&gt;Installation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/klen/bottle-login#id4" id="user-content-id9"&gt;Usage&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/klen/bottle-login#bug-tracker" id="user-content-id10"&gt;Bug tracker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/klen/bottle-login#id5" id="user-content-id11"&gt;Contributing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/klen/bottle-login#contributors" id="user-content-id12"&gt;Contributors&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/klen/bottle-login#id6" id="user-content-id13"&gt;License&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;

&lt;h2&gt;
&lt;a href="https://github.com/klen/bottle-login#id7"&gt;Requirements&lt;/a&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;python &amp;gt;= 2.6&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
&lt;a href="https://github.com/klen/bottle-login#id8"&gt;Installation&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Bottle Login&lt;/strong&gt; should be installed using pip:&lt;/p&gt;

&lt;pre&gt;pip install bottle-login
&lt;/pre&gt;

&lt;h2&gt;
&lt;a href="https://github.com/klen/bottle-login#id9"&gt;Usage&lt;/a&gt;
&lt;/h2&gt;

&lt;pre&gt;from bottle import Bottle, request, redirect
from bottle_login import LoginPlugin

app = Bottle()
app.config['SECRET_KEY'] = 'secret'

login = app.install(LoginPlugin())

&lt;a class="mentioned-user" href="https://dev.to/login"&gt;@login&lt;/a&gt;.load_user
def load_user_by_id(user_id):
    # Load user by id here


# Some application views

@app.route('/')
def index():
    current_user = login.get_user()
    return current_user.name

@app.route('/signout')
def signout():
    # Implement logout
    login.logout_user()
    return redirect('/')

@app.route('/signin')
def signin():
    # Implement login (you can check passwords here or etc)
    user_id = int(request.GET.get('user_id'))
    login.login_user(user_id)
    return redirect('/')
&lt;/pre&gt;

&lt;h2&gt;
&lt;a href="https://github.com/klen/bottle-login#id10"&gt;Bug tracker&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;If you have any suggestions, bug reports or
annoyances please report them to the issue tracker
at &lt;a href="https://github.com/klen/bottle-login/issues"&gt;https://github.com/klen/bottle-login/issues&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
&lt;a href="https://github.com/klen/bottle-login#id11"&gt;Contributing&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Development of Bottle Login happens at: &lt;a href="https://github.com/klen/bottle-login"&gt;https://github.com/klen/bottle-login&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
&lt;a href="https://github.com/klen/bottle-login#id12"&gt;Contributors&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/klen"&gt;klen&lt;/a&gt; (Kirill Klenov)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
&lt;a href="https://github.com/klen/bottle-login#id13"&gt;License&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Licensed under a &lt;a href="http://www.linfo.org/bsdlicense.html" rel="nofollow"&gt;BSD license&lt;/a&gt;.&lt;/p&gt;

&lt;/div&gt;



&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/klen/bottle-login"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


</description>
      <category>bottle</category>
      <category>python</category>
      <category>auth</category>
    </item>
    <item>
      <title>First post</title>
      <dc:creator>Anton Shcherbatov</dc:creator>
      <pubDate>Mon, 29 May 2023 21:01:16 +0000</pubDate>
      <link>https://dev.to/storvus/first-post-4b6</link>
      <guid>https://dev.to/storvus/first-post-4b6</guid>
      <description>&lt;p&gt;Well, this is probably the first time when I use this title not for testing purposes. Although, this is still gonna be a part of experiment, where I'm trying different kind of frameworks, technologies, skills and share all the useful (for me) and interesting (again, for me) information.&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
