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.
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.
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:
Then we can call
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()