Могут ли разные Django приложения обслуживать один и тот же URL для разных типов MIME? - PullRequest
0 голосов
/ 29 апреля 2020

Я хочу, чтобы URL, скажем /users/fred, служил разному контенту на основе заголовка Accept. Если запрашиваемый тип MIME application/activity+json, я хочу предоставить представление ActivityPub учетной записи Фреда; в противном случае я хочу обслуживать страницу HTML.

Суть в том, что я хочу реализовать представление ActivityPub и представление HTML в различных приложениях Django. Если бы они находились по разным URL-адресам, это было бы легко сделать с помощью urls.py, но это не позволяет фильтровать по Accept.

. Есть ли стандартный способ сделать это? Нужно ли реализовывать что-то новое в промежуточном программном обеспечении?

1 Ответ

2 голосов
/ 29 апреля 2020

Если вы имеете в виду, что вы хотите, чтобы эти вычисления выполнялись в самом пути urls.py, нет, вы не можете. URL-путь связан с одной функцией представления (или View.as_view ()). Они применяют сопоставление с образцом только для самого URL.

Однако вы, безусловно, можете связать его с первой функцией представления, которая читает заголовок и отправляет его в нужное представление приложения на основе его содержимого.

Например, в urls.py

url_pattern = [
    ...
    path('/users/<str:username>', views.user_dispatch_view(), name='user-detail'),
]

В app1.views.py

from app2.views import json_view

def html_view(request, **kwargs):
    '''
    Do your stuff, or even use a generic view instead,
    calling it with YourGenericView.as_view(request, **kwargs)
    '''

def user_dispatch_view(request, **kwargs):
    if request.Meta.get('Accept') == application/activity+json:
        return json_view(request, **kwargs)
    return http_view(request, **kwargs)
...