不同的 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)
我想要 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)