我希望一个URL,例如/users/fred
,根据Accept
标头提供不同的内容。如果请求的MIME类型为application/activity+json
,则我想提供Fred帐户的ActivityPub表示形式;否则,我要提供HTML页面。
不同之处在于,我想在不同的Django应用程序中实现ActivityPub视图和HTML视图。如果它们位于不同的URL,则可以使用urls.py
轻松完成此操作,但这似乎不允许Accept
进行过滤。
是否有执行此操作的标准方法?我需要在中间件中实现一些新功能吗?
[如果您要在urls.py路径本身中完成该计算,则不能。网址路径链接到单个视图函数(或View.as_view())。这些仅对网址本身应用模式匹配。
但是,您当然可以将其链接到第一个视图函数,该函数读取您的标头,然后根据其内容将其分派到正确的应用程序视图。
例如在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)