-1

是否可以設置Django API,以便它只響應JSON格式?我在下面的例子中故意犯了一個錯誤來解釋我的意思。我正在嘗試根據REST的假設來創建API。所以我的API只能以JSON響應並返回狀態,或者有時只是返回沒有主體的狀態。或者,也許我錯了?我不想爲HTML等是否可以設置Django API,以便它只響應JSON格式?

<!DOCTYPE html> 
<html lang="en"> 
    <head> 
     <meta http-equiv="content-type" content="text/html; charset=utf-8"> 
     <title>Page not found at /logi3</title> 
     <meta name="robots" content="NONE,NOARCHIVE"> 
     <style type="text/css"> 
    html * { padding:0; margin:0; } 
    body * { padding:10px 20px; } 
    body * * { padding:0; } 
    body { font:small sans-serif; background:#eee; } 
    body>div { border-bottom:1px solid #ddd; } 
    h1 { font-weight:normal; margin-bottom:.4em; } 
    h1 span { font-size:60%; color:#666; font-weight:normal; } 
    table { border:none; border-collapse: collapse; width:100%; } 
    td, th { vertical-align:top; padding:2px 3px; } 
    th { width:12em; text-align:right; color:#666; padding-right:.5em; } 
    #info { background:#f6f6f6; } 
    #info ol { margin: 0.5em 4em; } 
    #info ol li { font-family: monospace; } 
    #summary { background: #ffc; } 
    #explanation { background:#eee; border-bottom: 0px none; } 
    </style> 
    </head> 
    <body> 
     <div id="summary"> 
      <h1>Page not found 
       <span>(404)</span> 
      </h1> 
      <table class="meta"> 
       <tr> 
        <th>Request Method:</th> 
        <td>GET</td> 
       </tr> 
       <tr> 
        <th>Request URL:</th> 
        <td>http://localhost:8000/logi3</td> 
       </tr> 
      </table> 
     </div> 
     <div id="info"> 
      <p> 
     Using the URLconf defined in 
       <code>myapp.urls</code>, 
     Django tried these URL patterns, in this order: 
      </p> 
      <ol> 
       <li> 
... 

views.py

from rest_framework.views import exception_handler 

def custom_exception_handler(exc, context): 
    # Call REST framework's default exception handler first, 
    # to get the standard error response. 
    response = exception_handler(exc, context) 

    # Now craft the JSON response 
    if response is not None: 
     response.data['status_code'] = response.status_code 
     response.data['error'] = exc.detail 

    return response 

settings.py:

REST_FRAMEWORK = { 
    'DEFAULT_AUTHENTICATION_CLASSES': (
     'rest_framework.authentication.SessionAuthentication', 
     'rest_framework.authentication.BasicAuthentication', 
     'rest_framework.authentication.TokenAuthentication', 
    ), 
    'DEFAULT_PERMISSION_CLASSES': (
     'rest_framework.permissions.IsAuthenticated', 
    ), 
    'DEFAULT_RENDERER_CLASSES': (
     'rest_framework.renderers.JSONRenderer' 
    ), 
    'EXCEPTION_HANDLER': 'DockerProject.project.utils.custom_exception_handler', 
    'DEFAULT_PARSER_CLASSES': [ 
     'rest_framework.parsers.FormParser', 
     'rest_framework.parsers.MultiPartParser', 
     'rest_framework.parsers.JSONParser', 
    ] 
} 

項目樹:

DockerProject 
     ├── Dockerfile 
     ├── Procfile 
     ├── init.sql 
     ├── requirements.txt 
     ├── docker-compose.yml 
     └── PROJECT 
      ├── frontend 
        └── all frontend files 
      └── backend 
        └── project 
         ├── prices 
         ├── manage.py 
         └── project 
           └── all backend files 
+0

發佈您的api視圖 –

+0

我使用裝飾器而不是APIView類定義。 – wahtdbogh

回答

1

模板您顯示的是時顯示的黃色錯誤頁面。在DEBUG=False的生產中,默認的404處理程序將呈現您的404.html模板。

如果不希望這種行爲,你可以寫一個自定義視圖:

from django.http import JsonResponse 

def page_not_found_json(request): 
    return JsonResponse({}, status=404) 

然後,在你的項目的URL,設置handler404

handler404 = 'mysite.views.page_not_found_json' 

參見customizing error views的文檔的更多信息。

+0

因此,我必須在'urls.py'中粘貼'handler404 ='mysite.views.page_not_found_json'',並在'views.py'中粘貼自定義視圖? – wahtdbogh

+0

您可以將自定義視圖放在任何地方。然後您需要調整'handler404'字符串,以便它指向您的視圖。 – Alasdair

+0

'handler404 ='mysite.views.page_not_found_json''只需在urls.py中?我確定,因爲我這樣做,但仍然是相同的情況 – wahtdbogh

2

你可能想要做強制JSON響應的大多數事情是set your render classes就像這樣:

REST_FRAMEWORK = { 
    'DEFAULT_RENDERER_CLASSES': (
     'rest_framework.renderers.JSONRenderer' 
    ) 
} 

這將迫使DRF嘗試呈現內容爲JSON。此外,我們還想將異常呈現爲JSON。要做到這一點,我們需要一個custom exception handler

from rest_framework.views import exception_handler 

def custom_exception_handler(exc, context): 
    # Call REST framework's default exception handler first, 
    # to get the standard error response. 
    response = exception_handler(exc, context) 

    # Now craft the JSON response 
    if response is not None: 
     response.data['status_code'] = response.status_code 
     response.data['error'] = exc.detail 

    return response 

然後,我們需要確保讓DRF知道我們想利用這個異常處理程序:

REST_FRAMEWORK = { 
    'EXCEPTION_HANDLER': 'my_project.my_app.utils.custom_exception_handler' 
} 

現在,這個處理器將運行任何不是由視圖生成的錯誤,也就是說,如果視圖返回400 Bad Request,它將以通常以JSON形式呈現,但如果有500 Server Error,我們的異常處理程序會將其轉換爲JSON格式的響應。

+0

我想我按照你的建議做了所有的事情,不幸的是它沒有幫助。我已更新我的帖子。你可以看看是否一切正常嗎? – wahtdbogh

相關問題