Есть ли способ настроить 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, которые могут помочь вам сократить количество необходимых строк и шагов.

  1. Использование директивы WSGIScriptAlias для сопоставления с каталогом, содержащим любое количество приложений WSGI:

    WSGIScriptAlias /wsgi/ /usr/local/wsgi/scripts/
    

    При использовании этой директивы следующая часть URL после префикса URL используется для определения того, какой файл сценария приложения WSGI в целевом директории должен быть использован. И точка монтирования, и путь к каталогу должны содержать косую черту.

  2. Другая опция предназначена в основном для подавления расширения во 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

Перенаправление и ремаппинг с помощью mod_rewrite

Вопросы по mod_rewrite

Вернуться на верх