Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to locally test Django's Sites Framework

Django has the sites framework to support multiple web site hosting from a single Django installation.

EDIT (below is an incorrect assumption of the system)


I understand that middleware sets the settings.SITE_ID value based on a lookup/cache of the request domain.


ENDEDIT

But when testing locally, I'm at http://127.0.0.1:8000/, not http://my-actual-domain.com/

How do I locally view my different sites during development?

like image 864
Daniel Rhoden Avatar asked Feb 08 '10 17:02

Daniel Rhoden


People also ask

What testing framework should I use with Django?

You can also use any other Python test framework; Django provides an API and tools for that kind of integration. They are described in the Using different testing frameworks section of Advanced testing topics.

What is a sites framework in Django?

Django comes with an optional “sites” framework. It’s a hook for associating objects and functionality to particular websites, and it’s a holding place for the domain names and “verbose” names of your Django-powered sites.

What is unittest in Django?

Django provides a test framework with a small hierarchy of classes that build on the Python standard unittest library. Despite the name, this test framework is suitable for both unit and integration tests. The Django framework adds API methods and tools to help test web and Django-specific behavior.

How do I run a test in Django?

With Django’s test-execution framework and assorted utilities, you can simulate requests, insert test data, inspect your application’s output and generally verify your code is doing what it should be doing. The preferred way to write tests in Django is using the unittest module built-in to the Python standard library.


2 Answers

Create a separate settings.py file for every site, including an appropriate SITE_ID setting. Of course you can use the import statement to share common setting between files.

From now on, when running Django development server specify the --settings option to tell Django which site to run.

For example (assuming you've got two setting files - settings_first.py and settings_second.py):

manage.py runserver --settings settings_first

will run the first site, and

manage.py runserver --settings settings_second

will give you an access to the second site.

You can also run them simultaneously, specifying different ports:

manage.py runserver 8001 --settings settings_first

manage.py runserver 8002 --settings settings_second

The above commands (run on two different consoles) will make the first website accesible under http://127.0.0.1:8001/, and the second one under http://127.0.0.1:8002/

like image 194
Ludwik Trammer Avatar answered Nov 04 '22 11:11

Ludwik Trammer


Maybe you are mislead by the documentation. You wrote:

I understand that middleware sets the settings.SITE_ID value based on a lookup/cache of the request domain.

This is not the case. It works exactly the other way around. Django uses the settings.SITE_ID value to look up the correct Site object in the database. This returns your prefered domain and site name.

The sites application was designed to fill the (in my opinion) rare usecase that you want to have multiple sites with the same database in the background. This allows you to publish the same articles on different sites but still have the flexibility that some models are available just for a single site.

For developing multiple projects (that doesn't actually make use of the sites framework) you don't have to specify anything special. You can use the default SITE_ID set to 1. For utilizing the admin's view on website links you can set in your development database the Site's domain to localhost:8000.

If you want to develop multiple sites using the same database (and make use of the sites framework) you must have each project with a distinct SITE_ID but the same database settings. The values for SITE_ID in each project on your development machine are in most cases the same as for your production servers.

like image 39
Gregor Müllegger Avatar answered Nov 04 '22 12:11

Gregor Müllegger