<?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: Tima</title>
    <description>The latest articles on DEV Community by Tima (@timthewebmaster).</description>
    <link>https://dev.to/timthewebmaster</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%2F3519264%2F08ad8c8d-0601-43db-982c-26095277d64d.png</url>
      <title>DEV Community: Tima</title>
      <link>https://dev.to/timthewebmaster</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/timthewebmaster"/>
    <language>en</language>
    <item>
      <title>How to Run a Django Server: Development, Testing, and Deployment</title>
      <dc:creator>Tima</dc:creator>
      <pubDate>Thu, 06 Nov 2025 07:37:40 +0000</pubDate>
      <link>https://dev.to/timthewebmaster/how-to-run-a-django-server-development-testing-and-deployment-5a2h</link>
      <guid>https://dev.to/timthewebmaster/how-to-run-a-django-server-development-testing-and-deployment-5a2h</guid>
      <description>&lt;p&gt;Running a Django server isn’t always the same—it depends on whether you’re developing locally, testing deployment readiness, or running on real hosting/VPS. This guide walks through the different approaches.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Normal Server Startup for Development
&lt;/h2&gt;

&lt;p&gt;The simplest way to run Django locally is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python manage.py runserver
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;By default, it runs on port &lt;code&gt;8000&lt;/code&gt;. You can specify another port:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python manage.py runserver 7000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;👉 Changing ports can be useful when integrating with tools like &lt;a href="https://github.com/ritwickdey/vscode-live-server" rel="noopener noreferrer"&gt;VSCode Live Server&lt;/a&gt; or when running multiple apps side by side.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Testing Deployment Readiness
&lt;/h2&gt;

&lt;p&gt;When you switch to production mode (&lt;code&gt;DEBUG=False&lt;/code&gt; and &lt;code&gt;ALLOWED_HOSTS&lt;/code&gt; set), Django stops serving static files. To simulate production but still serve static files locally, use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python manage.py runserver &lt;span class="nt"&gt;--insecure&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This lets you test custom error pages (404, 500, etc.) without setting up Apache or Nginx yet.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Running on Shared Hosting
&lt;/h2&gt;

&lt;p&gt;Django apps don’t run with &lt;code&gt;runserver&lt;/code&gt; in production. Instead, they use &lt;strong&gt;WSGI&lt;/strong&gt; or &lt;strong&gt;ASGI&lt;/strong&gt; interfaces to communicate with web servers.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;WSGI&lt;/strong&gt;: synchronous communication (classic Django setup).
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ASGI&lt;/strong&gt;: asynchronous communication (supports async features).
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A typical &lt;code&gt;wsgi.py&lt;/code&gt; might look 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="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;django.core.wsgi&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;get_wsgi_application&lt;/span&gt;

&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setdefault&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;DJANGO_SETTINGS_MODULE&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Website.settings&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;application&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get_wsgi_application&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  4. Running on a VPS
&lt;/h2&gt;

&lt;p&gt;On a VPS, you’ll configure a web server (Apache or Nginx) to handle requests and proxy them to Django via a socket or port.&lt;/p&gt;

&lt;p&gt;Example Nginx config (HTTP):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nginx"&gt;&lt;code&gt;&lt;span class="k"&gt;server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kn"&gt;listen&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;server_name&lt;/span&gt; &lt;span class="s"&gt;example.com&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="n"&gt;/static&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kn"&gt;root&lt;/span&gt; &lt;span class="n"&gt;/home/site/example.com&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="n"&gt;/media&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kn"&gt;root&lt;/span&gt; &lt;span class="n"&gt;/home/site/example.com&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="n"&gt;/&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;Host&lt;/span&gt; &lt;span class="s"&gt;example.com&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_pass&lt;/span&gt; &lt;span class="s"&gt;http://unix:/tmp/example.com.socket&lt;/span&gt;&lt;span class="p"&gt;;&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;👉 In 2025, you should use HTTPS (port 443) with SSL certificates from Let’s Encrypt:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nginx"&gt;&lt;code&gt;&lt;span class="k"&gt;server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kn"&gt;listen&lt;/span&gt; &lt;span class="mi"&gt;443&lt;/span&gt; &lt;span class="s"&gt;ssl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;server_name&lt;/span&gt; &lt;span class="s"&gt;example.com&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kn"&gt;ssl_certificate&lt;/span&gt; &lt;span class="n"&gt;/etc/letsencrypt/live/example.com/fullchain.pem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;ssl_certificate_key&lt;/span&gt; &lt;span class="n"&gt;/etc/letsencrypt/live/example.com/privkey.pem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="n"&gt;/static&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kn"&gt;root&lt;/span&gt; &lt;span class="n"&gt;/home/user/example.com&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="n"&gt;/media&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kn"&gt;root&lt;/span&gt; &lt;span class="n"&gt;/home/user/example.com&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="n"&gt;/&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;Host&lt;/span&gt; &lt;span class="s"&gt;example.com&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_pass&lt;/span&gt; &lt;span class="s"&gt;http://unix:/tmp/example.com.socket&lt;/span&gt;&lt;span class="p"&gt;;&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;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Use &lt;code&gt;runserver&lt;/code&gt; for local development.
&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;--insecure&lt;/code&gt; for testing production‑like conditions.
&lt;/li&gt;
&lt;li&gt;Use WSGI/ASGI for shared hosting.
&lt;/li&gt;
&lt;li&gt;Configure Nginx/Apache for VPS deployment with HTTPS.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Treat server setup as part of your Django architecture—it’s not just about running code, but about ensuring reliability, scalability, and security.&lt;/p&gt;




&lt;h3&gt;
  
  
  Tags
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;#django&lt;/code&gt; &lt;code&gt;#python&lt;/code&gt; &lt;code&gt;#webdev&lt;/code&gt; &lt;code&gt;#deployment&lt;/code&gt; &lt;code&gt;#devops&lt;/code&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Discussion
&lt;/h3&gt;

&lt;p&gt;How do you usually run Django in production?&lt;br&gt;&lt;br&gt;
Do you prefer WSGI or ASGI for modern projects?&lt;/p&gt;




&lt;h3&gt;
  
  
  Further Reading
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://timthewebmaster.com/en/articles/how-to-run-server-on-django/" rel="noopener noreferrer"&gt;Original article on timthewebmaster.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>django</category>
      <category>python</category>
      <category>webdev</category>
      <category>automation</category>
    </item>
    <item>
      <title>How to Publish Your Python Package to PyPI (Modern Guide with `pyproject.toml`)</title>
      <dc:creator>Tima</dc:creator>
      <pubDate>Thu, 06 Nov 2025 07:33:24 +0000</pubDate>
      <link>https://dev.to/timthewebmaster/how-to-publish-your-python-package-to-pypi-modern-guide-with-pyprojecttoml-54dm</link>
      <guid>https://dev.to/timthewebmaster/how-to-publish-your-python-package-to-pypi-modern-guide-with-pyprojecttoml-54dm</guid>
      <description>&lt;p&gt;Publishing your own Python package is a milestone for any developer. It turns your code into something the community can install with a simple &lt;code&gt;pip install&lt;/code&gt;. This guide is a &lt;strong&gt;quick start&lt;/strong&gt; for beginners who want to publish their first package using the modern &lt;code&gt;pyproject.toml&lt;/code&gt; approach.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why PyPI Matters
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Central hub&lt;/strong&gt;: PyPI is the official package index for Python, similar to npm for JavaScript.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Easy installs&lt;/strong&gt;: With one command, you can pull in frameworks like Django or libraries like requests.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Standardization&lt;/strong&gt;: Packaging ensures consistent distribution and deployment across projects.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;django
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Setting Up the Basics
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Install Python&lt;/strong&gt;: Download from &lt;a href="https://www.python.org/downloads/" rel="noopener noreferrer"&gt;python.org&lt;/a&gt;. Pip comes bundled.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Create a project directory&lt;/strong&gt;: Example: &lt;code&gt;UsefulPackage/&lt;/code&gt;.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Set up a virtual environment&lt;/strong&gt;:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python &lt;span class="nt"&gt;-m&lt;/span&gt; venv .venv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Register accounts&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://pypi.org" rel="noopener noreferrer"&gt;PyPI&lt;/a&gt; for production.
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://test.pypi.org" rel="noopener noreferrer"&gt;TestPyPI&lt;/a&gt; for practice (recommended for beginners).
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Minimal Project Structure
&lt;/h2&gt;

&lt;p&gt;Your package should look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;UsefulPackage/
 ├── .venv/
 ├── src/
 │    └── useful_package_timthewebmaster/
 │         ├── __init__.py
 │         └── main.py
 ├── LICENSE
 ├── pyproject.toml
 ├── dist/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Configuring &lt;code&gt;pyproject.toml&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;This file defines how your package is built and its metadata. Minimal example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="nn"&gt;[build-system]&lt;/span&gt;
&lt;span class="py"&gt;requires&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"hatchling &amp;gt;= 1.26"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="py"&gt;build-backend&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"hatchling.build"&lt;/span&gt;

&lt;span class="nn"&gt;[project]&lt;/span&gt;
&lt;span class="py"&gt;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"useful-package-timthewebmaster"&lt;/span&gt;
&lt;span class="py"&gt;version&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"0.0.1"&lt;/span&gt;
&lt;span class="py"&gt;authors&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="err"&gt;{&lt;/span&gt; &lt;span class="py"&gt;name&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Tim The Webmaster"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="py"&gt;email&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"timachuduk@gmail.com"&lt;/span&gt; &lt;span class="err"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="py"&gt;license&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"MIT"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;👉 You can add classifiers, dependencies, keywords, and URLs to make your package more discoverable. See &lt;a href="https://pypi.org/classifiers/" rel="noopener noreferrer"&gt;PyPI classifiers&lt;/a&gt; for options.&lt;/p&gt;




&lt;h2&gt;
  
  
  Building the Package
&lt;/h2&gt;

&lt;p&gt;Install the build tool:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;build
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Generate distributions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python &lt;span class="nt"&gt;-m&lt;/span&gt; build
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This creates &lt;code&gt;.tar.gz&lt;/code&gt; and &lt;code&gt;.whl&lt;/code&gt; files inside &lt;code&gt;dist/&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Uploading to PyPI
&lt;/h2&gt;

&lt;p&gt;Install Twine:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;twine
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Upload to TestPyPI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python &lt;span class="nt"&gt;-m&lt;/span&gt; twine upload &lt;span class="nt"&gt;--repository&lt;/span&gt; testpypi dist/&lt;span class="k"&gt;*&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Upload to PyPI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python &lt;span class="nt"&gt;-m&lt;/span&gt; twine upload dist/&lt;span class="k"&gt;*&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You’ll need an API token from your PyPI account.&lt;/p&gt;




&lt;h2&gt;
  
  
  Testing Your Package
&lt;/h2&gt;

&lt;p&gt;Install from TestPyPI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--index-url&lt;/span&gt; https://test.pypi.org/simple/ useful-package-timthewebmaster
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or from PyPI directly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;useful-package-timthewebmaster
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run your project and confirm imports work correctly.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Publishing to PyPI is more than distribution—it’s about &lt;strong&gt;joining the ecosystem&lt;/strong&gt;. By sharing your package, you contribute to the collective toolbox of developers worldwide. Start small, iterate, and soon you’ll have a portfolio of packages that reflect your coding style and creativity.&lt;/p&gt;




&lt;p&gt;💡 &lt;strong&gt;Pro tip&lt;/strong&gt;: Use TestPyPI for practice. It keeps the main index clean and gives you confidence before going public.&lt;/p&gt;




&lt;h3&gt;
  
  
  Tags
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;#python&lt;/code&gt; &lt;code&gt;#pypi&lt;/code&gt; &lt;code&gt;#packaging&lt;/code&gt; &lt;code&gt;#opensource&lt;/code&gt; &lt;code&gt;#developers&lt;/code&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Discussion
&lt;/h3&gt;

&lt;p&gt;Have you published a package to PyPI before?&lt;br&gt;&lt;br&gt;
What challenges did you face during the process?&lt;/p&gt;




&lt;h3&gt;
  
  
  Further Reading
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://timthewebmaster.com/en/articles/how-to-publish-your-package-to-pypi/" rel="noopener noreferrer"&gt;Original article on timthewebmaster.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>python</category>
      <category>pypi</category>
      <category>packaging</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Monetizing Your Website with Yandex Advertising Network (RSYA): A Developer’s Guide</title>
      <dc:creator>Tima</dc:creator>
      <pubDate>Thu, 06 Nov 2025 07:26:30 +0000</pubDate>
      <link>https://dev.to/timthewebmaster/monetizing-your-website-with-yandex-advertising-network-rsya-a-developers-guide-54fj</link>
      <guid>https://dev.to/timthewebmaster/monetizing-your-website-with-yandex-advertising-network-rsya-a-developers-guide-54fj</guid>
      <description>&lt;p&gt;When we talk about website monetization, most developers immediately think of Google AdSense. But if your audience includes Russian‑speaking users, &lt;strong&gt;Yandex Advertising Network (RSYA)&lt;/strong&gt; can be a powerful alternative. It’s not just another ad platform—it’s a way to align monetization with regional traffic patterns and user expectations.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why RSYA Matters
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Localized reach&lt;/strong&gt;: RSYA is deeply integrated into the Russian‑speaking internet ecosystem.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Flexible ad formats&lt;/strong&gt;: From contextual banners to native blocks, RSYA offers customization that developers can embed seamlessly.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Better relevance&lt;/strong&gt;: Ads are matched to user intent and site content, often outperforming generic networks in CTR for RU traffic.
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Eligibility&lt;/strong&gt;: Your site needs consistent traffic and must comply with Yandex’s content policies.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Application&lt;/strong&gt;: Submit your site for review. Approval usually takes a few days.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Integration&lt;/strong&gt;: Once approved, you’ll receive ad code snippets. These can be embedded directly into your HTML or managed via template tags in frameworks like Django.
&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Technical Integration Tips
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Modular templates&lt;/strong&gt;: Wrap RSYA ad blocks in reusable components.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Responsive design&lt;/strong&gt;: RSYA supports adaptive blocks—test across devices.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Performance considerations&lt;/strong&gt;: Lazy‑load ads or place them strategically to avoid slowing down page rendering.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- Example RSYA ad block --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"rsya-block"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="c"&gt;&amp;lt;!-- Yandex ad code snippet --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Developer-Friendly Strategies
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Experiment with placement&lt;/strong&gt;: Sidebar vs. inline content can yield very different results.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Track metrics&lt;/strong&gt;: Use Yandex.Metrica or Google Analytics to measure CTR, bounce rate, and revenue impact.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Combine with other models&lt;/strong&gt;: RSYA doesn’t have to be your only monetization stream. Pair it with affiliate links, donations, or premium content.
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Ethical Monetization
&lt;/h2&gt;

&lt;p&gt;Independent developers often face the challenge of balancing monetization with user trust. RSYA allows you to &lt;strong&gt;filter ad categories&lt;/strong&gt;, so you can avoid intrusive or irrelevant ads. This helps maintain credibility with your audience.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;If you’re building for a bilingual or international audience, &lt;strong&gt;don’t overlook regional ad networks&lt;/strong&gt;. RSYA can be a strong complement to global solutions, especially if your traffic leans toward Russian‑speaking users. For developers, the key is to treat monetization as part of your architecture—modular, scalable, and respectful of user experience.&lt;/p&gt;




&lt;p&gt;💡 &lt;strong&gt;Pro tip&lt;/strong&gt;: Think of RSYA not just as an ad network, but as a &lt;em&gt;developer tool&lt;/em&gt;. By integrating it cleanly into your stack, you maintain control over design, performance, and ethics—while unlocking a new revenue stream.&lt;/p&gt;




&lt;h3&gt;
  
  
  Tags
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;#monetization&lt;/code&gt; &lt;code&gt;#webdev&lt;/code&gt; &lt;code&gt;#django&lt;/code&gt; &lt;code&gt;#seo&lt;/code&gt; &lt;code&gt;#developers&lt;/code&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Discussion
&lt;/h3&gt;

&lt;p&gt;Have you tried RSYA or other regional ad networks?&lt;br&gt;&lt;br&gt;
What strategies worked best for you when balancing monetization with user trust?&lt;/p&gt;




&lt;h3&gt;
  
  
  Further Reading
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://timthewebmaster.com/en/articles/monetizaciya-sajta-ispolzuya-rsya/" rel="noopener noreferrer"&gt;Monetization useing YAN (timthewebmaster.com)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webmonetization</category>
      <category>webdev</category>
      <category>django</category>
      <category>seo</category>
    </item>
    <item>
      <title>SEO in Practice: +55% Impressions, +17% Clicks</title>
      <dc:creator>Tima</dc:creator>
      <pubDate>Thu, 25 Sep 2025 10:37:23 +0000</pubDate>
      <link>https://dev.to/timthewebmaster/seo-in-practice-55-impressions-17-clicks-3a0a</link>
      <guid>https://dev.to/timthewebmaster/seo-in-practice-55-impressions-17-clicks-3a0a</guid>
      <description>&lt;p&gt;I recently ran a focused SEO optimization experiment on my site. Instead of chasing big overhauls, I made small, measurable changes:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Meta tags&lt;/strong&gt; rewritten across ~20 articles
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Low‑value pages&lt;/strong&gt; cleaned up or removed
&lt;/li&gt;
&lt;li&gt;A few &lt;strong&gt;quality backlinks&lt;/strong&gt; added
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;6‑week results (Google Search Console):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Metric        Before     After     Change
------------------------------------------
Impressions   88,000     137,000    +55%
Clicks        850        1,000     +17.5%
CTR           0.96%      0.71%     -26%
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;6‑week results (Yandex Webmaster):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Metric        Before     After     Change
------------------------------------------
Impressions   29,000     27,500    -10%
Clicks        800        950       +18.7%
CTR           2.75%      3.45%     +21%
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The takeaway: you don’t always need a massive content push. Sometimes, &lt;strong&gt;tightening the screws on what you already have&lt;/strong&gt; delivers the biggest lift.  &lt;/p&gt;

&lt;p&gt;👉 Full case study with screenshots and details: &lt;a href="https://timthewebmaster.com/en/articles/seo-content-optimization-results/" rel="noopener noreferrer"&gt;SEO Optimization Results&lt;/a&gt;&lt;/p&gt;

</description>
      <category>seo</category>
      <category>html</category>
      <category>website</category>
    </item>
    <item>
      <title>When “Visitors” Aren’t Visitors: My Battle With Bots</title>
      <dc:creator>Tima</dc:creator>
      <pubDate>Wed, 24 Sep 2025 21:00:00 +0000</pubDate>
      <link>https://dev.to/timthewebmaster/when-visitors-arent-visitors-my-battle-with-bots-2fci</link>
      <guid>https://dev.to/timthewebmaster/when-visitors-arent-visitors-my-battle-with-bots-2fci</guid>
      <description>&lt;p&gt;One day my site traffic spiked — bounce rates shot up, charts went wild, and most of the “visitors” were hitting only pagination pages. At first, I thought: &lt;em&gt;DDoS? Clickers? Real users from China?&lt;/em&gt;  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuey6v456weqd941q1hia.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuey6v456weqd941q1hia.png" alt="A graph that shows how much Chinese visited my website for the last month" width="800" height="487"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After digging deeper, I realized it was most likely a &lt;strong&gt;parser bot&lt;/strong&gt; scraping my content. The solution? A crash course in &lt;code&gt;.htaccess&lt;/code&gt;, IP ranges, and blocking entire countries just to keep my site breathing.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyny7xhdi1y6r8v0fil8z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyny7xhdi1y6r8v0fil8z.png" alt="Page is forbidden" width="800" height="432"&gt;&lt;/a&gt;  &lt;/p&gt;

&lt;p&gt;It’s a story about sudden traffic bursts, false alarms, and the messy reality of defending a small independent site.  &lt;/p&gt;

&lt;p&gt;Read the full breakdown here: &lt;a href="https://timthewebmaster.com/en/articles/sudden-visitors-burst-ddos-clickers-parser-on-the-website/" rel="noopener noreferrer"&gt;Someone is parsing my website from China, and then I’ve blocked them via htaccess file&lt;/a&gt;&lt;/p&gt;

</description>
      <category>server</category>
      <category>investigation</category>
      <category>statistics</category>
      <category>scraper</category>
    </item>
    <item>
      <title>Tool of the week: Free WYSIWYG Editor with QuillJS</title>
      <dc:creator>Tima</dc:creator>
      <pubDate>Wed, 24 Sep 2025 04:00:48 +0000</pubDate>
      <link>https://dev.to/timthewebmaster/tool-of-the-week-free-wysiwyg-editor-with-quilljs-5hf5</link>
      <guid>https://dev.to/timthewebmaster/tool-of-the-week-free-wysiwyg-editor-with-quilljs-5hf5</guid>
      <description>&lt;p&gt;I’ve put together a simple but powerful &lt;strong&gt;online WYSIWYG editor&lt;/strong&gt; powered by &lt;a href="https://quilljs.com/" rel="noopener noreferrer"&gt;QuillJS&lt;/a&gt;. It’s designed for developers, bloggers, and content managers who want to quickly create and format HTML without writing raw code.  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Features:&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Rich text editing (bold, italic, underline, headings, quotes, lists)
&lt;/li&gt;
&lt;li&gt;Insert links, media, and code blocks
&lt;/li&gt;
&lt;li&gt;Export clean HTML instantly
&lt;/li&gt;
&lt;li&gt;Save, reload, or download your pages for later use
&lt;/li&gt;
&lt;li&gt;Works right in the browser — no setup required
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This tool started as an educational experiment with QuillJS, but it’s grown into a handy utility for anyone who needs quick HTML snippets or formatted content.  &lt;/p&gt;

&lt;p&gt;Try it here: &lt;a href="https://timthewebmaster.com/en/tools/wysiwyg-editor/" rel="noopener noreferrer"&gt;WYSIWYG Online Editor&lt;/a&gt;  &lt;/p&gt;

&lt;p&gt;Would love to hear your feedback — what features would make this even more useful for your workflow?  &lt;/p&gt;

</description>
      <category>html</category>
      <category>website</category>
      <category>tooling</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
