我对不同的Web框架(Django,web.py,Pyramid和CherryPy)有一些经验,我想知道在不同的“视图/处理程序”中实现路由调度程序会更容易并希望更清晰“基于”Accept“标头和HTTP方法,例如:
Accept: application/json
POST /post/
的处理方式与:
不同Accept: text/html
POST /post/
因此请求被路由到MIME“application / json”的相应处理程序的特定视图和HTTP方法“POST”。
我确实知道如何在CherryPy中实现类似的东西,但我失去了使用CherryPy工具进行请求的内部重定向,因为我直接调用特定方法而不是自动调度来自调度程序。另一个选择是从头开始实施一个全新的调度程序,但这是最后一个选项。
我知道在/post.json
或/post/.json
等网址中使用扩展程序的替代方法,但我希望保留相同的网址?
答案 0 :(得分:12)
如果您要查找的只是一个框架,可以轻松完成此操作,那么请使用pyramid
。
金字塔视图定义使用predicates,而不仅仅是路由,视图仅匹配所有谓词匹配。一个这样的谓词是accept
谓词,它完全符合你的要求;根据{{1}}标题轻松简单地进行视图切换:
Accept
答案 1 :(得分:4)
我需要在Django中执行此操作,因此我编写了一个中间件以使其成为可能:http://baltaks.com/2013/01/route-requests-based-on-the-http-accept-header-in-django
以下是代码:
# A simple middleware component that lets you use a single Django
# instance to serve multiple versions of your app, chosen by the client
# using the HTTP Accept header.
# In your settings.py, map a value you're looking for in the Accept header
# to a urls.py file.
# HTTP_HEADER_ROUTING_MIDDLEWARE_URLCONF_MAP = {
# u'application/vnd.api-name.v1': 'app.urls_v1'
# }
from django.conf import settings
class HTTPHeaderRoutingMiddleware:
def process_request(self, request):
try:
for content_type in settings.HTTP_HEADER_ROUTING_MIDDLEWARE_URLCONF_MAP:
if (request.META['HTTP_ACCEPT'].find(content_type) != -1):
request.urlconf = settings.HTTP_HEADER_ROUTING_MIDDLEWARE_URLCONF_MAP[content_type]
except KeyError:
pass # use default urlconf (settings.ROOT_URLCONF)
def process_response(self, request, response):
return response
答案 2 :(得分:0)
我不确定“内部重定向”是什么意思,但是如果你看一下the code,你可以看到tools.accept是lib.cptools.accept的一个非常薄的包装器,你可以从您自己的代码轻松调用。将它列为您的服务器可以发送的内容类型列表,它将告诉您客户端喜欢哪一个,或者如果您发出的类型和客户端接受的类型不重叠,则会引发406。