Есть ли способ настроить Apache на автоматическое распознавание URL для Django vs React без жесткого кодирования каждой конечной точки?
Мы используем Apache 2.4 с React 17 и приложением Django 3.2 (Python 3.9). Нам интересно узнать, как лучше настроить конфигурацию Apache для маршрутизации запросов к приложениям React и Django. Сейчас наш файл виртуальных хостов Apache жестко кодирует, какие маршруты должны обрабатываться приложением React, а какие - Django ...
AliasMatch ^/(?!people)(?!states/)(?!countries/)(?!predefined_types/)(?!coop_types/)(?!coops/)(?!data)(?!save_to_sheet_from_form).* /var/www/html/client/build/$0
<Directory "/var/www/html/client/build/">
Options Indexes FollowSymLinks
AllowOverride all
</Directory>
WSGIDaemonProcess ssl_directory home=/var/www/html/web python-home=/var/www/html/web/venv
WSGIProcessGroup ssl_directory
WSGIScriptAlias /coops /var/www/html/web/directory/wsgi.py/coops process-group=ssl_directory
WSGIScriptAlias /data /var/www/html/web/directory/wsgi.py/data process-group=ssl_directory
WSGIScriptAlias /countries /var/www/html/web/directory/wsgi.py/countries process-group=ssl_directory
WSGIScriptAlias /states /var/www/html/web/directory/wsgi.py/states process-group=ssl_directory
WSGIScriptAlias /predefined_types /var/www/html/web/directory/wsgi.py/predefined_types process-group=ssl_directory
WSGIScriptAlias /coop_types /var/www/html/web/directory/wsgi.py/coop_types process-group=ssl_directory
WSGIScriptAlias /people /var/www/html/web/directory/wsgi.py/people process-group=ssl_directory
WSGIScriptAlias /save_to_sheet_from_form /var/www/html/web/directory/wsgi.py/save_to_sheet_from_form process-group=ssl_directory
Приложение Django, со своей стороны, определяет урлы стандартным образом (в нашем файле urls.py) ...
...
urlpatterns = [
path('data', views.data, name='data'),
path('coops/no_coords', views.coops_wo_coordinates, name='coops_wo_coordinates'),
path('coops/unapproved', views.unapproved_coops, name='unapproved_coops'),
path('coops/', views.CoopList.as_view()),
path('coops/<int:pk>/', views.CoopDetail.as_view()),
path('people/', views.PersonList.as_view()),
path('people/<int:pk>/', views.PersonDetail.as_view()),
path('users/', views.CreateUserView.as_view()),
path('predefined_types/', views.CoopTypeList.as_view()),
path('coop_types/', views.CoopTypeList.as_view()),
path('countries/', views.CountryList.as_view()),
path('states/<country_code>', views.StateList.as_view()),
path('login', views.signin),
path(settings.LOGOUT_PATH, views.signout),
path('user_info', views.user_info),
]
urlpatterns = format_suffix_patterns(urlpatterns)
Есть ли более автоматизированный способ заставить Apache узнать, какие маршруты должны идти к Django, а какие к React? Каждый раз, когда мы добавляем новую конечную точку Django, нам приходится добавлять жестко закодированное исключение в конфигурации Apache.
В отношении python есть две опции wsgi-options, которые могут помочь вам сократить количество необходимых строк и шагов.
Использование директивы WSGIScriptAlias для сопоставления с каталогом, содержащим любое количество приложений WSGI:
WSGIScriptAlias /wsgi/ /usr/local/wsgi/scripts/
При использовании этой директивы следующая часть URL после префикса URL используется для определения того, какой файл сценария приложения WSGI в целевом директории должен быть использован. И точка монтирования, и путь к каталогу должны содержать косую черту.
Другая опция предназначена в основном для подавления расширения во Frontend, но может быть использован и для перенаправления на основе различных аспектов:
WSGIScriptAliasMatch ^/wsgi/([^/]+) /usr/local/wsgi/scripts/$1.wsgi
В этом случае любая информация о пути, появляющаяся после префикса URL, будет отображена на соответствующий файл скрипта WSGI в каталоге, но с расширением '.wsgi'. Однако расширение не нужно включать в URL.
.
Опции могут быть настроены с помощью обычных директив Apache, также есть дополнительные возможности, например, индекс каталога может быть настроен подобным образом, полезно прочитать эту страницу обо всех опциях: https://modwsgi.readthedocs.io/en/master/user-guides/configuration-guidelines.html
Кроме того, у вас есть возможность использовать мощный mod_rewrite. Конечно, есть еще много вариантов, но самое главное, что для различения типов скриптов необходимо иметь какой-то аспект в url или пути, чтобы решить, куда перенаправлять. Это может быть суффикс и/или использование WSGIScriptAlias, которые оба были бы наиболее простыми, но могут быть основаны на mod_mime, возможно, тоже.
Вообще-то, вопрос в том, насколько вы готовы использовать суффиксы или URL, которые делают различие возможным и достаточно простым, чтобы с ним справились предложенные варианты.
Однако следует учитывать, что приложение python может ссылаться и на js-файлы, поэтому простого суффикса может быть недостаточно, но если будут указаны полные пути, это, возможно, будет не слишком сложно сделать.
С mod_rewrite
у вас есть полный контроль над перенаправлением и ремаппингом в Apache