不同的 Django 应用程序可以为不同的 MIME 类型提供相同的 URL 服务吗?

Can different Django apps serve the same URL for different MIME types?

我想要 URL,比如 /users/fred,以根据 Accept header 提供不同的内容。如果请求的 MIME 类型是 application/activity+json,我想提供 Fred 帐户的 ActivityPub 表示;否则,我想提供一个 HTML 页面。

问题是我想在不同的 Django 应用程序中实现 ActivityPub 视图和 HTML 视图。如果它们处于不同的 URLs,这将很容易用 urls.py 完成,但这似乎不允许按 Accept.

过滤

有没有标准的方法来做到这一点?我需要在中间件中实现一些新的东西吗?

如果您的意思是希望在 urls.py 路径本身中完成计算,不,您不能。 url 路径被 linked 到单个视图函数(或 View.as_view())。这些仅在 url 本身上应用模式匹配。

但是,您当然可以 link 将其发送到第一个视图函数,该函数读取您的 header 并根据其内容将其分派到正确的应用程序视图。

例如 在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)