Hello guys, I want to show you how to run an external Python script inside a Django environment for debugging, for data-crud operations, etc. You can use Django modules and your Django models inside the script and run and run without any error. The good thing here is you don’t need to create Django commands to run your script. This way is easier to run and debug an external script.
Now let’s look at how Django starts up.
We use runserver
command to start up a Django project, we trigger it with python manage.py runserver
as every Django people know. Inside this command, the runserver.inner_run
method is called, and inside this method, the django.servers.get_internal_wsgi_application
function is given to django.servers.run
function as a parameter and called.
Here, a WSGIServer instantiated which will become the server part of the WSGI protocol. WSGIRequestHandler parameter is given because it will be called inside the WSGIServer to process the incoming requests.
There is also a set_app method run. Our WSGIHandler instance handler object is given as a parameter. This method sets the web application part of the WSGI protocol.
Lastly, the function executes the serve_forever method and starts to listen to the port.
Inside django.servers.get_internal_wsgi_application
, django.setup()
function is called, where the web application part is set.
from django.utils.version import get_version VERSION = (4, 0, 0, 'alpha', 0) __version__ = get_version(VERSION) def setup(set_prefix=True): """ Configure the settings (this happens as a side effect of accessing the first setting), configure logging and populate the app registry. Set the thread-local urlresolvers script prefix if `set_prefix` is True. """ from django.apps import apps from django.conf import settings from django.urls import set_script_prefix from django.utils.log import configure_logging configure_logging(settings.LOGGING_CONFIG, settings.LOGGING) if set_prefix: set_script_prefix( '/' if settings.FORCE_SCRIPT_NAME is None else settings.FORCE_SCRIPT_NAME ) apps.populate(settings.INSTALLED_APPS)
Here the logging is configured and the app registry is populated.
Now let’s get back to our main topic. Before we run django.setup
in the script, we need to provide where is the settings.py in our project:
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "project.settings")
Then we can call django.setup
:
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "project.settings ") django.setup()
Then we’re ready to go. We can run our fancy scripts now, like:
#!/usr/bin/python # -*- coding: utf-8 -*- import os import django from project.apps.myapp.models import MyModel os.environ.setdefault("DJANGO_SETTINGS_MODULE", "project.settings") django.setup() def work(): for i in range(10): m = MyModel.objects.get(pk=i) if __name__ == '__main__': work()
Source:
How applications are loaded
How the WSGI protocol works