feincms3-language-sites
Multisite support for feincms3.
Usage scenario
Suppose you have a website with several domains and languages but an exact 1:1 mapping between them. Django offers the django.contrib.sites application to partition data but you still have to run one webserver per site.
This app offers a feincms3 abstract page model, a middleware and utilities to support this scenario. Contrary to feincms3-sites which is even more flexible and allows arbitrary combinations of languages and domains this app only allows exactly one domain per language and exactly one language per domain.
Installation
Install the package using pip install feincms3-language-sites into an environment where you’re already using feincms3 pages.
Extend feincms3_language_sites.models.AbstractPage instead of feincms3.pages.AbstractPage. This abstract page already extends feincms3.mixins.LanguageAndTranslationOfMixin so you may remove the language mixins (if you have added them before).
Replace the LocaleMiddleware with feincms3_language_sites.middleware.site_middleware. In case you’re using feincms3 applications you should ensure that the site_middleware is added before feincms3.applications.apps_middleware.
Optionally add feincms3_language_sites.middleware.redirect_to_site_middleware if you want to enforce the host. The SECURE_SSL_REDIRECT is also respected. The redirect_to_site_middleware has to be added before the SecurityMiddleware otherwise users may get redirected twice in a row.
Configure the sites.
Configuration
Possible configuration:
SITES = {
"de": {
"host": "127.0.0.1:8000",
"host_re": r"example\.com$|127.0.0.1:8000$",
},
"fr": {
"host": "localhost:8000",
},
}
Sites are checked in the order they are declared (since dictionaries are guaranteed to preserve the ordering of keys since Python 3.7).
The keys of the SITES dictionary have to be equal to all language codes in LANGUAGES. The host is required and should only consist of the host and an optional port, nothing else. If host_re is given the request.get_host() return value is matched against the host_re regular expression, otherwise the host has to match exactly.
The site_middleware automatically raises a DisallowedHost exception if no site matches the current request (which produces the same error as Django if the request doesn’t match ALLOWED_HOSTS).
Utilities
feincms3_language_sites.models.site_for_host
feincms3_language_sites.models.reverse_language_site_app
feincms3_language_sites.templatetags.feincms3_language_sites.site_translations
Notes
Note that Page.objects.active() only returns pages in the current language. If you want to generate translation links (e.g. using ...|translations in a template) you do not want to use the .active() queryset method but build something yourself which runs .filter(is_active=True).
Metadata
Release files for feincms3-language-sites 0.4.3
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| feincms3_language_sites-0.4.3.tar.gz | 16.2 kB | With provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| feincms3_language_sites-0.4.3-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 26.2 kB
Release files / feincms3_language_sites-0.4.3.tar.gz
| Download URL | feincms3_language_sites-0.4.3.tar.gz |
|---|---|
| Size | 16.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
aedce0c2e3c1d1c5f02f9ee83d107b6a8050185a3e4e9e11260fb3506acad8a9
|
|
BLAKE2b-256 checksum How to use checksums |
a26532f4f5b959c92d7f1aa2ca888131440ac8d20e64288de8cedae752dc155a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jun 6, 2026.
Transparency logRelease files / feincms3_language_sites-0.4.3-py3-none-any.whl
| Download URL | feincms3_language_sites-0.4.3-py3-none-any.whl |
|---|---|
| Size | 10.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
344b89d26f1350e3ff5ac294126be4e2dd917278629f5b13d245229f67a31a17
|
|
BLAKE2b-256 checksum How to use checksums |
a828cc0f4476955f2230d9cb60aedd149a061179a913a1a9f7b92007b789ac88
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jun 6, 2026.
Transparency logSecurity for feincms3-language-sites 0.4.3
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for feincms3_language_sites-0.4.3.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jun 6, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.