Saya memiliki satu proyek Django dengan beberapa aplikasi berbeda yang seharusnya dihosting di domain berbeda. Misalnya, sebut saja mereka:
Situs administratif, ourdashboard.com
Situs Konten Pertama oursite1.com
Situs Konten Kedua oursite2.com
Situs dashboard hanya untuk penerbit konten, sedangkan situs konten untuk pengunjung. Setiap situs berbeda dalam hal fungsionalitas, konten, dan desain. Saya ingin penerbit dapat memposting konten di kedua situs, jadi saya tidak akan membuat proyek Django yang berbeda. Namun genre konten memerlukan situs berbeda untuk audiens tertentu.
Saya memulai sebuah aplikasi bernama dashboard. Saya ingin aplikasi ini dihosting di domain dashboard.com kami, di mana mengakses domain ini akan langsung mengakses dashboard.urls
. Jadi pada dasarnya saya ingin meng-host beberapa situs menggunakan satu proyek Django, di mana setiap domain akan ditautkan ke file url aplikasi tertentu.
Saya melakukan sedikit riset, dan menemukan MultiHostMiddleware dan mencoba mengimplementasikannya. Terlihat sederhana dan mudah, tetapi karena belum pernah bekerja dengan middleware Djangos sebelumnya, saya menemui jalan buntu sejak awal. Saya menerapkan kode dengan benar seperti yang diinstruksikan tetapi saya terus mendapatkan 500 Internal Server Error. Awalnya saya pikir saya mengacaukan sesuatu di file pengaturan saya, tapi tidak bisa melihat di mana masalahnya. Kemudian saya melihat log dan memperhatikan bahwa kelas middleware tidak menerima get_response
. Sedikit penelitian lebih lanjut di Dokumentasi Middleware menunjukkan kepada saya bahwa inisialisasi dan fungsi yang dapat dipanggil diperlukan dan __init__
hanya dapat menerima satu argumen 'get_response'. Selain itu saya mengetahui ada beberapa perubahan besar pada Djangos middleware belum lama ini, dan pembaruan terakhir pada MultiHostMiddleware lebih dari 3 tahun yang lalu (Saat ini saya menggunakan Django 2.1.5, jadi perubahan pasca-middleware). Saya telah melihat kode lama selama 6 jam sekarang, mencari solusi yang mungkin, tapi sejujurnya saya bahkan tidak tahu harus mulai dari mana ketika berhubungan dengan middleware. Saya bahkan berpikir saya bisa mengadopsi fungsi yang ada ke fungsi yang diperlukan, berpikir process_response adalah yang dapat dipanggil, karena ia mengembalikan respons, tetapi saya jatuh ke lubang kelinci lain. Jadi, saya mencari cara untuk mengadaptasi kode lama ini untuk Django 2.1 untuk meng-host situs berbeda menggunakan proyek Django yang sama.
pengaturan.py
MIDDLEWARE = [
'network.middleware.MultiHostMiddleware',
...
]
HOST_MIDDLEWARE_URLCONF_MAP = {
"ourdahsboard.com": "dashboard.urls",
"oursite1.com": "musiclounge.urls",
"oursite2.com": "artworld.urls",
}
middleware.py
import time
from django.conf import settings
from django.utils.cache import patch_vary_headers
class MultiHostMiddleware:
def process_request(self, request):
try:
request.META["LoadingStart"] = time.time()
host = request.META["HTTP_HOST"]
#if host[-3:] == ":80":
# host = host[:-3] # ignore default port number, if present
# best way to do this.
host_port = host.split(':')
if len(host_port)==2:
host = host_port[0]
if host in settings.HOST_MIDDLEWARE_URLCONF_MAP:
request.urlconf = settings.HOST_MIDDLEWARE_URLCONF_MAP[host]
request.META["MultiHost"] = str(request.urlconf)
else:
request.META["MultiHost"] = str(settings.ROOT_URLCONF)
except KeyError:
pass # use default urlconf (settings.ROOT_URLCONF)
def process_response(self, request, response):
if 'MultiHost' in request.META:
response['MultiHost'] = request.META.get("MultiHost")
if 'LoadingStart' in request.META:
_loading_time = time.time() - int(request.META["LoadingStart"])
response['LoadingTime'] = "%.2fs" % ( _loading_time, )
if getattr(request, "urlconf", None):
patch_vary_headers(response, ('Host',))
return response
** MEMPERBARUI **
As, requestedstack error:
Traceback (most recent call last):
File "/home/user/webapps/django_network/network/network/wsgi.py", line 16, in <module>
application = get_wsgi_application()
File "/home/user/webapps/django_network/lib/python3.7/Django-2.1.5-py3.7.egg/django/core/wsgi.py", line 13, in get_wsgi_application
return WSGIHandler()
File "/home/user/webapps/django_network/lib/python3.7/Django-2.1.5-py3.7.egg/django/core/handlers/wsgi.py", line 136, in __init__
self.load_middleware()
File "/home/user/webapps/django_network/lib/python3.7/Django-2.1.5-py3.7.egg/django/core/handlers/base.py", line 36, in load_middleware
mw_instance = middleware(handler)
TypeError: __init__() missing 1 required positional argument: 'get_response'