<?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>Forem: Uhtred M.</title>
    <description>The latest articles on Forem by Uhtred M. (@uhttred).</description>
    <link>https://forem.com/uhttred</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%2F343923%2F20d3a133-b297-4288-805f-fee55e368b0f.jpeg</url>
      <title>Forem: Uhtred M.</title>
      <link>https://forem.com/uhttred</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/uhttred"/>
    <language>en</language>
    <item>
      <title>Introduction - Reminder System with Message Templates using Django #1</title>
      <dc:creator>Uhtred M.</dc:creator>
      <pubDate>Wed, 25 Oct 2023 23:59:50 +0000</pubDate>
      <link>https://forem.com/uhttred/introduction-reminder-system-with-message-templates-using-django-1-2laf</link>
      <guid>https://forem.com/uhttred/introduction-reminder-system-with-message-templates-using-django-1-2laf</guid>
      <description>&lt;p&gt;In this set of insights we will be developing a reminder system from scratch with the possibility of modeling or creating template messages. The system will be developed with Python and Django Framework. But you can use the principles applied here with your favorite framework, you just need to have a certain level of experience enough to adapt certain concepts to your framework.&lt;/p&gt;

&lt;p&gt;So, what is a reminder system, and what is its use?…&lt;/p&gt;

&lt;p&gt;&lt;a href="https://uhtred.dev/insights/introduction-reminder-system-with-message-templates-using-django-1-ucg2"&gt;Read the full article on uhtred.dev&lt;/a&gt;&lt;/p&gt;

</description>
      <category>django</category>
      <category>marketing</category>
      <category>python</category>
      <category>webdev</category>
    </item>
    <item>
      <title>How to dynamically serialize model fields in Django REST Framework</title>
      <dc:creator>Uhtred M.</dc:creator>
      <pubDate>Fri, 29 Sep 2023 21:42:42 +0000</pubDate>
      <link>https://forem.com/uhttred/how-to-dynamically-serialize-model-fields-in-django-rest-framework-3omo</link>
      <guid>https://forem.com/uhttred/how-to-dynamically-serialize-model-fields-in-django-rest-framework-3omo</guid>
      <description>&lt;p&gt;So, how about a scenario that we define our serializer class to access all fields in the model, but we choose which fields to be serialized when we instantiate the serializer class?&lt;/p&gt;

&lt;p&gt;Know more reading the full article &lt;a href="https://uhtred.dev/insights/how-to-dynamically-serialize-model-fields-in-django-rest-framework"&gt;here&lt;/a&gt;!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>django</category>
      <category>python</category>
      <category>programming</category>
    </item>
    <item>
      <title>Criando imagem de dataURL base64 com Python e Django</title>
      <dc:creator>Uhtred M.</dc:creator>
      <pubDate>Sat, 16 Sep 2023 17:03:06 +0000</pubDate>
      <link>https://forem.com/uhttred/criando-imagem-de-dataurl-base64-com-python-e-django-5d5o</link>
      <guid>https://forem.com/uhttred/criando-imagem-de-dataurl-base64-com-python-e-django-5d5o</guid>
      <description>&lt;p&gt;Olá, acabei de postar um bom artigo em meu site sobre &lt;a href="https://uhtred.dev/pt/insights/creating-image-from-dataurl-base64-with-python-and-django"&gt;como criar imagens a partir de dataURL base64 com Python e Django&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Acesse o artigo &lt;a href="https://uhtred.dev/pt/insights/creating-image-from-dataurl-base64-with-python-and-django"&gt;aqui&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>python</category>
      <category>django</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Creating Image from dataURL base64 with Python and Django</title>
      <dc:creator>Uhtred M.</dc:creator>
      <pubDate>Sat, 16 Sep 2023 17:01:39 +0000</pubDate>
      <link>https://forem.com/uhttred/creating-image-from-dataurl-base64-with-python-and-django-1bei</link>
      <guid>https://forem.com/uhttred/creating-image-from-dataurl-base64-with-python-and-django-1bei</guid>
      <description>&lt;p&gt;Hi, I just post a nice article on my website about &lt;a href="https://uhtred.dev/insights/creating-image-from-dataurl-base64-with-python-and-django"&gt;Creating Image from dataURL base64 with Python and Django&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Access the article &lt;a href="https://uhtred.dev/insights/creating-image-from-dataurl-base64-with-python-and-django"&gt;here&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>django</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Como modelar um sistema de seguidores semelhante ao do Twitter e Instagram com Pyhton e Django</title>
      <dc:creator>Uhtred M.</dc:creator>
      <pubDate>Mon, 11 Sep 2023 13:25:40 +0000</pubDate>
      <link>https://forem.com/uhttred/como-modelar-um-sistema-de-seguidores-semelhante-ao-do-twitter-e-instagram-com-pyhton-e-django-iii</link>
      <guid>https://forem.com/uhttred/como-modelar-um-sistema-de-seguidores-semelhante-ao-do-twitter-e-instagram-com-pyhton-e-django-iii</guid>
      <description>&lt;p&gt;Olá, publiquei um ótimo artigo em meu site sobre como modelar um sistema de seguidores semelhante ao Twitter ou Instagram.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://uhtred.dev/pt/insights/how-to-model-a-following-system-similar-to-twitter-and-instagram-with-python-and-django"&gt;Acesse o artigo aqui&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>django</category>
      <category>python</category>
      <category>systemdesign</category>
      <category>programming</category>
    </item>
    <item>
      <title>Anotações de Tipos em Python - Folha de Dicas (Cheat Sheet)</title>
      <dc:creator>Uhtred M.</dc:creator>
      <pubDate>Mon, 11 Sep 2023 13:23:21 +0000</pubDate>
      <link>https://forem.com/uhttred/anotacoes-de-tipos-em-python-folha-de-dicas-cheat-sheet-50hj</link>
      <guid>https://forem.com/uhttred/anotacoes-de-tipos-em-python-folha-de-dicas-cheat-sheet-50hj</guid>
      <description>&lt;p&gt;&lt;a href="https://uhtred.dev/pt/insights/python-type-hints-cheat-sheet"&gt;Folha de dicas&lt;/a&gt; básicas sobre anotações de tipos em Python. Útil para quem está a começar agora com Python e para consulta rápida para quem já é experiente com Python.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://uhtred.dev/pt/insights/python-type-hints-cheat-sheet"&gt;Folha de dicas aqui&lt;/a&gt;!&lt;/p&gt;

</description>
      <category>python</category>
      <category>cheatsheet</category>
      <category>programming</category>
    </item>
    <item>
      <title>Python Type Hints Cheat Sheet</title>
      <dc:creator>Uhtred M.</dc:creator>
      <pubDate>Mon, 11 Sep 2023 13:21:20 +0000</pubDate>
      <link>https://forem.com/uhttred/python-type-hints-cheat-sheet-3ep</link>
      <guid>https://forem.com/uhttred/python-type-hints-cheat-sheet-3ep</guid>
      <description>&lt;p&gt;Basic &lt;a href="https://uhtred.dev/insights/python-type-hints-cheat-sheet"&gt;cheat sheet&lt;/a&gt; on type annotations in Python. Useful for those who are just starting out with Python and for quick reference for those who are already experienced with Python.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://uhtred.dev/insights/python-type-hints-cheat-sheet"&gt;Access cheat sheet here&lt;/a&gt;!&lt;/p&gt;

</description>
      <category>python</category>
      <category>programming</category>
      <category>cheatsheet</category>
    </item>
    <item>
      <title>How to configure nuxt-i18n and fetch with Nuxt 3 for multilingual APIs</title>
      <dc:creator>Uhtred M.</dc:creator>
      <pubDate>Thu, 07 Sep 2023 12:14:05 +0000</pubDate>
      <link>https://forem.com/uhttred/how-to-configure-nuxt-i18n-and-fetch-with-nuxt-3-for-multilingual-apis-37o6</link>
      <guid>https://forem.com/uhttred/how-to-configure-nuxt-i18n-and-fetch-with-nuxt-3-for-multilingual-apis-37o6</guid>
      <description>&lt;p&gt;Hi, I published a nice article on my website about how to configure nuxt-i18n and fetch with Nuxt 3 for multilingual APIs.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://uhtred.dev/insights/how-to-configure-nuxt-i18n-and-fetch-with-nuxt-3-for-multilingual-apis"&gt;Access the article here&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>nuxt</category>
      <category>vue</category>
      <category>javascript</category>
      <category>programming</category>
    </item>
    <item>
      <title>How to model a following system similar to Twitter and Instagram with Python and Django</title>
      <dc:creator>Uhtred M.</dc:creator>
      <pubDate>Thu, 31 Aug 2023 13:29:13 +0000</pubDate>
      <link>https://forem.com/uhttred/how-to-model-a-following-system-similar-to-twitter-and-instagram-with-python-and-django-3d9h</link>
      <guid>https://forem.com/uhttred/how-to-model-a-following-system-similar-to-twitter-and-instagram-with-python-and-django-3d9h</guid>
      <description>&lt;p&gt;Hi, I published a nice article on my &lt;a href="https://uhtred.dev/insights/how-to-model-a-following-system-similar-to-twitter-and-instagram-with-python-and-django"&gt;website&lt;/a&gt; about how to model a follower system similar to Twitter or Instagram.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://uhtred.dev/insights/how-to-model-a-following-system-similar-to-twitter-and-instagram-with-python-and-django"&gt;Access the article here&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>django</category>
      <category>python</category>
      <category>tutorial</category>
      <category>architecture</category>
    </item>
    <item>
      <title>uhtred.dev Is out now! A business around a freelancer</title>
      <dc:creator>Uhtred M.</dc:creator>
      <pubDate>Tue, 22 Aug 2023 22:07:48 +0000</pubDate>
      <link>https://forem.com/uhttred/uhtreddev-is-out-now-a-business-around-a-freelancer-1hci</link>
      <guid>https://forem.com/uhttred/uhtreddev-is-out-now-a-business-around-a-freelancer-1hci</guid>
      <description>&lt;p&gt;After years, I finally decided to take some time (approximately 2 months) to develop my personal &lt;a href="https://uhtred.dev"&gt;website&lt;/a&gt;. It's finally finished (or a good part of it hahah) and available to the world!&lt;/p&gt;

&lt;p&gt;I decided to set up a website that presents me as the &lt;strong&gt;Product Developer&lt;/strong&gt; freelancer that I am, someone capable of putting together the ideal on-demand team for the realization of a specific product.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In general, the website will serve to&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Present the &lt;a href="https://uhtred.dev/cases"&gt;success cases&lt;/a&gt; that I developed with my team. The cases/portfolio I'm referring to here are not just mockups that lead to a client's website, but details of the project/challenge. Its origin, related people and companies, the problem detected, the solution presented and how we implement it.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Share various &lt;a href="https://uhtred.dev/insights"&gt;insights&lt;/a&gt; about &lt;strong&gt;business&lt;/strong&gt;, &lt;strong&gt;freelancing&lt;/strong&gt;, &lt;strong&gt;programming&lt;/strong&gt;, &lt;strong&gt;design&lt;/strong&gt;, &lt;strong&gt;finance&lt;/strong&gt; and other topics that can bring people together. Insights will be written by me and partners. You can be one of those partners too, here's the invitation.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Provide some &lt;a href="https://uhtred.dev/store"&gt;digital products&lt;/a&gt; that can complement other entrepreneurs and freelancers.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There isn't much content yet, but we already have enough to get a sense of what I just described above, so I invite you to explore the &lt;a href="https://uhtred.dev"&gt;website&lt;/a&gt; and share your impressions if you wish.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Here are some technical details about the website&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Front-end developed with Nuxt.js 3.&lt;/li&gt;
&lt;li&gt;Back-end and Back-office developed with Python and Django (Django Admin is the best!!)&lt;/li&gt;
&lt;li&gt;Build, test and delivery automation with Gitlab CI and Google Cloud Build&lt;/li&gt;
&lt;li&gt;Every website is on Google Cloud, some featured products are: Cloud SQL, Cloud Run and Cloud Storage&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's it, stay tuned for the next achievements!&lt;/p&gt;

</description>
      <category>news</category>
      <category>nuxt</category>
      <category>django</category>
      <category>googlecloud</category>
    </item>
    <item>
      <title>Django Cloud Task Queue</title>
      <dc:creator>Uhtred M.</dc:creator>
      <pubDate>Fri, 08 Oct 2021 21:15:01 +0000</pubDate>
      <link>https://forem.com/uhttred/django-cloud-task-queue-27g2</link>
      <guid>https://forem.com/uhttred/django-cloud-task-queue-27g2</guid>
      <description>&lt;p&gt;I’m developing and maintaining a Python &lt;a href="https://github.com/txiocoder/dj-cloud-task"&gt;package&lt;/a&gt; to easily integrate your Django Application with Google Cloud Task.&lt;/p&gt;

&lt;p&gt;Some features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Easily push tasks to Cloud Task using a decorator&lt;/li&gt;
&lt;li&gt;Automatically route all tasks from a single endpoint&lt;/li&gt;
&lt;li&gt;Ease scheduling with native python datetime&lt;/li&gt;
&lt;li&gt;Named task to avoid duplicated&lt;/li&gt;
&lt;li&gt;Local development support with Redis Queue&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Simple and beautiful task definition&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="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;datetime&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;timedelta&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;django.utils.timezone&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;now&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;cloudtask&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;CloudTaskRequest&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;task&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;task&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;'default'&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;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;CloudTaskRequest&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s"&gt;'Running task with args &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; and &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&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;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# pushing task to queue
&lt;/span&gt;&lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;# executing the task immediately without push to queue
&lt;/span&gt;&lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;)()&lt;/span&gt;

&lt;span class="c1"&gt;# scheduling the task
&lt;/span&gt;&lt;span class="n"&gt;at&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;timedelta&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;days&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;schedule&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;at&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;at&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;See the &lt;a href="https://github.com/txiocoder/dj-cloud-task"&gt;repository&lt;/a&gt; and full documentation on my &lt;a href="https://github.com/txiocoder/dj-cloud-task"&gt;Github page&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Thanks to the project &lt;a href="https://bazaar.ao"&gt;bazaar&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;If it was helpful or if you found it interesting, also leave an 🙋🏽‍♂️❤️ in the comments. Thank you, looking forward to the next article. Enjoy and follow my work.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;See &lt;a href="https://linktr.ee/txiocoder"&gt;Here&lt;/a&gt;, all my resources.&lt;/li&gt;
&lt;li&gt;Learn With Me on &lt;a href="https://www.youtube.com/channel/UCETQfLH1W0V1EBwp4iMOF6w"&gt;Youtube&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Follow Me on &lt;a href="https://www.instagram.com/txiocoder/"&gt;Instagram&lt;/a&gt; to stay updated.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Thanks,&lt;br&gt;
Stay safe!&lt;/p&gt;

</description>
      <category>django</category>
      <category>googlecloud</category>
      <category>python</category>
      <category>queue</category>
    </item>
    <item>
      <title>Django Signals structured as Event emitter</title>
      <dc:creator>Uhtred M.</dc:creator>
      <pubDate>Tue, 28 Sep 2021 14:26:36 +0000</pubDate>
      <link>https://forem.com/uhttred/django-signals-structured-as-event-emitter-131f</link>
      <guid>https://forem.com/uhttred/django-signals-structured-as-event-emitter-131f</guid>
      <description>&lt;p&gt;Hi, I don’t know if this is the right title 😆, but I have done some good stuff and I hope that’s could be helpful for you.&lt;/p&gt;

&lt;p&gt;While I’m develop the RESTful API for a project (&lt;a href="https://bazaar.ao"&gt;bazaar.ao&lt;/a&gt;) that will be available soon, with my team from &lt;a href="https://ahllia.co"&gt;Ahllia LLC&lt;/a&gt;. I have the idea to make this structure (I will show you soon below) for events.&lt;/p&gt;

&lt;p&gt;At moment we are developing a monolithic application, but we also want to move for Microservices later, so, with that in mind I decided to keep every monolithic's module (django app) the most independent as possible.&lt;/p&gt;

&lt;p&gt;So, to share changes/events within modules I decided to use &lt;a href="https://docs.djangoproject.com/en/3.2/topics/signals/"&gt;Django Signals&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  The problem
&lt;/h3&gt;

&lt;p&gt;First, I started to create a lot of Signal instances for each event such as:&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="c1"&gt;# in: myproject.user.dispatch
&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;django.dispatch&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Signal&lt;/span&gt;

&lt;span class="n"&gt;account_created&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Signal&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s"&gt;'user'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="n"&gt;email_created&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Signal&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s"&gt;'email'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="n"&gt;phone_created&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Signal&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s"&gt;'phone'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="c1"&gt;# and so on…
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And after this, I have imported every single instance on signals file to handle the events.&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="c1"&gt;# in: myproject.user.signals
&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;django.dispatch&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;receiver&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;myproject.user.dispatch&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;account_created&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;email_created&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;phone_created&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;receiver&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;account_created&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;hdl_account_created&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sender&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="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="k"&gt;pass&lt;/span&gt;

&lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;receiver&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;email_created&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;hdl_email_created&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sender&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="k"&gt;pass&lt;/span&gt;

&lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;receiver&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;phone_created&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;hdl_phone_created&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sender&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;phone&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="k"&gt;pass&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Has you can see, this will bring us with a lot of instances and imports, making our application bigger and slow to start.&lt;/p&gt;




&lt;p&gt;So I came up with the idea to make things more automated. Using only one instance (which I preferred to call it event) of Singal for each module. All signals (specifically, the keys) will be registered at runtime and only when needed.&lt;/p&gt;

&lt;p&gt;First, I'll show you how to use it (it's beautiful ❤️) then I'll show you how I implemented it. You can choose to implement it the same way or use it to do your own implementation.&lt;/p&gt;




&lt;h3&gt;
  
  
  Using Event
&lt;/h3&gt;

&lt;p&gt;I created a file named &lt;code&gt;events.py&lt;/code&gt; in each module that has an instance of the global Event class.&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="c1"&gt;# in: myproject.user.events
&lt;/span&gt;
&lt;span class="c1"&gt;# I implemented the global Event class in the core module.
# Which contains all the classes shared between other modules.
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;myproject.core.events&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Event&lt;/span&gt;

&lt;span class="n"&gt;EVENTS&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s"&gt;'ACCOUNT_CREATED'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;'user:account:created'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;'EMAIL_CREATED'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;'user:emails:created'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;'PHONE_CREATED'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;'user:phones:created'&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;event&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Event&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;events&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;EVENTS&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As you can see, the structure of the event dictionary is quite simple. Where key is the name of the event accessed in the instance and the value is the name of the event sharing between modules or systems. In case the event is being sent to an Event Queue&lt;/p&gt;

&lt;p&gt;Due to this fact (events can be shared across systems) it is important to create a naming pattern to avoid duplicates and better grouping. I chose the following pattern:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;&amp;lt;app|module|service name&amp;gt;:&amp;lt;context&amp;gt;:&amp;lt;action created|changed|deleted|viewed&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Some thing like: &lt;code&gt;user:account-primary-email:changed&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Continuing, I demonstrate below in a &lt;code&gt;view&lt;/code&gt; how an event can be emitted:&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="c1"&gt;# in: myproject.user.views
&lt;/span&gt;
&lt;span class="c1"&gt;# Just import the event instance
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;myproject.user.events&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;create_user_view&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="c1"&gt;# ... user creation logic
&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;User&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;create&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="c1"&gt;# emitting the event/signal
&lt;/span&gt;    &lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ACCOUNT_CREATED&lt;/span&gt;&lt;span class="p"&gt;,&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;user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;# or 
&lt;/span&gt;    &lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ACCOUNT_CREATED&lt;/span&gt;&lt;span class="p"&gt;,&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;user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The attribute &lt;code&gt;n&lt;/code&gt; in the event, which can also be accessed via &lt;code&gt;name&lt;/code&gt;, contains the name of the event previously defined in the &lt;code&gt;EVENTS&lt;/code&gt; dictionary. This name is used as a sender when sending the event/signal.&lt;/p&gt;

&lt;p&gt;Now, let's see how to handle the events&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="c1"&gt;# in: myproject.user.signals
&lt;/span&gt;
&lt;span class="c1"&gt;# Just import the signal receiver and the event instance
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;django.dispatch&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;receiver&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;myproject.user.events&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt;

&lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;receiver&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;EMAIL_CREATED&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;hlr_email_created&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sender&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Email Created! '&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;# do some quick task
&lt;/span&gt;    &lt;span class="c1"&gt;# Later we can do something like that
&lt;/span&gt;    &lt;span class="n"&gt;enqueue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;'default'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;event_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;EMAIL_CREATED&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;receiver&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ACCOUNT_CREATED&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;hlr_email_created&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sender&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="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Account Created'&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pay close attention and be careful, in two cases you will access the dictionary key defined in &lt;code&gt;events.py&lt;/code&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;First, you need to access the event name (E.g: to send a signal or send the event to the Event Queue).&lt;/li&gt;
&lt;li&gt;Second, you need the necessary arguments to connect the function called to execute the event.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In the first case, you access the event name by the attribute &lt;code&gt;n&lt;/code&gt; or &lt;code&gt;name&lt;/code&gt; of the Event instance: &lt;code&gt;event.n.ACCOUNT_CREATED&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;In the second case, you access the arguments directly from the instance &lt;code&gt;event.ACCOUNT_CREATED&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;And that's it, and now let's see how I implemented it.&lt;/p&gt;




&lt;h3&gt;
  
  
  Event class Implementation
&lt;/h3&gt;

&lt;p&gt;I will show the complete class with some details that I thought it was important to be commented on to facilitate the perception.&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="c1"&gt;# in: myproject.core.events
&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;uuid&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;django.dispatch&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Signal&lt;/span&gt;

&lt;span class="s"&gt;"""
First, I had defined this class to be able to access
dictionary key with dot (event.) in event
name or n attribute.
"""&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;DictAsObject&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;

    &lt;span class="n"&gt;defaults&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;defaults&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;defaults&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;defaults&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="nb"&gt;dict&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;__getattr__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;attr&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;defaults&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;attr&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;KeyError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nb"&gt;AttributeError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Invalid key: '%s'"&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;attr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nb"&gt;setattr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;attr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&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;value&lt;/span&gt;

&lt;span class="s"&gt;"""
Then I had define the Event class that inherits
from django.dispatch's Signal class
"""&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Event&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Signal&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;

    &lt;span class="n"&gt;__n&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;DictAsObject&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;providing_args&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;use_caching&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;bool&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;events&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nb"&gt;super&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;providing_args&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;providing_args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;use_caching&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;use_caching&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;__n&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;DictAsObject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;events&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;__getattr__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;attr&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="s"&gt;"""
        Looks the event name by key in __n DictAsObject 
        instance and cache it on instance
        with the kwargs to django dispatch receiver:
            sender: event name
            dispatch_uid: unique id for event (event name too)
        """&lt;/span&gt;
        &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;event_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;getattr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;__n&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;attr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;AttributeError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nb"&gt;AttributeError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"the '%s' event was not registered"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;attr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;kwargs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sender&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;event_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dispatch_uid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;uuid&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;uuid4&lt;/span&gt;&lt;span class="p"&gt;())))&lt;/span&gt;
            &lt;span class="nb"&gt;setattr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;attr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;kwargs&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;kwargs&lt;/span&gt;

    &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="nb"&gt;property&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;n&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;__n&lt;/span&gt;

    &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="nb"&gt;property&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;name&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;__n&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;And that's it, I hope you enjoyed it and that it's useful for you. If you have any criticisms or suggestions, don't hesitate to leave them in the comments. Maybe some disadvantage or advantage that I haven't mentioned...&lt;/p&gt;




&lt;p&gt;If it was helpful or if you found it interesting, also leave an 🙋🏽‍♂️❤️ in the comments. Thank you, looking forward to the next article. Enjoy and follow my work.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;See &lt;a href="https://linktr.ee/txiocoder"&gt;Here&lt;/a&gt;, all my resources.&lt;/li&gt;
&lt;li&gt;Learn With Me on &lt;a href="https://www.youtube.com/channel/UCETQfLH1W0V1EBwp4iMOF6w"&gt;Youtube&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Follow Me on &lt;a href="https://www.instagram.com/txiocoder/"&gt;Instagram&lt;/a&gt; to stay updated.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Thanks,&lt;br&gt;
Stay safe!&lt;/p&gt;

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