Skip to main content
 首页 » 编程设计

python之Django:只为 api 子应用程序返回 json

2024年10月17日23thcjp

网址.py

urlpatterns = patterns( 
    url(r'^subapp1/', include('subapp1.urls', namespace='subapp1')), 
    url(r'^api/', include('api.urls')), 
) 

发送 GET/api/invalid/url 时,返回 404 html 页面。这似乎不适合 REST API。

如何让以subapp1/开头的无效url返回404 html页面,让以api/开头的无效url返回json中的404状态码和错误信息?

是否可以将 Django 设置为根据请求 header 中的 Accept 字段返回默认响应?例如返回 404 html,如果 Accept text/html,如果 Accept application/json

返回 json

欢迎任何评论。谢谢。

请您参考如下方法:

下面的代码可能会有所帮助。

来自 django.views.defaults 的源代码, http.HttpResponseNotFound(body, content_type=content_type) 应该被返回。因此,检查 request.path,如果以 /topApp/api 开头,则返回 http.HttpResponseNotFound(body, content_type='application/json'),否则,返回 default 响应。

始终,request.path 以 /topApp 开头,而不是 IP 或主机名。输入参数(参见 link )包括 request, exception, template_name=ERROR_404_TEMPLATE_NAME,在我的代码中应该由 *args, **kwargs 处理。

from django.views.defaults import page_not_found  
 
    def customized_page_not_found(request, *args, **kwargs): 
        if request.path.startswith('/topApp/api'): 
            try:     
                from django.http import HttpResponseNotFound 
                return HttpResponseNotFound( json.dumps( {'error': 'Page Not Found'} ), 
                        content_type='application/json') 
            except Exception as e: 
                pass 
                # handle exception here 
 
        return page_not_found( request, *args, **kwargs) 
 
 
handler404 = customized_page_not_found 

欢迎提出任何问题和意见。