簡體   English   中英

調試Apache / Django / WSGI錯誤請求(400)錯誤

[英]Debugging Apache/Django/WSGI Bad Request (400) Error

我簡單的Django應用程序在調試模式( manage.py runserver )上運行良好,並且在開發箱上的WSGI + Apache下運行,但是當我推送到EC2時,我開始收到間歇性的(錯誤時間Bad Request (400) 10-80%)錯誤Bad Request (400)表示我嘗試查看的所有URL(無論是在我的應用中還是在Django管理員中)。

在哪里可以找到有關此信息的調試信息? 即使使用LogLevel=info ,也不會在/var/log/apache2/error.log顯示任何內容。 我已經檢查了版本,記錄了Request環境(請參閱ModWSGI Debugging Tips ),沒有發現主要差異。

我剩下的一個想法是,我使用的是針對Python 2.7.1構建的Ubuntu 12.04的mod_wsgi(libapache2-mod-wsgi 3.3-4build1); 我有Python 2.7.3。 Django是1.6,比Ubuntu Precise版本新。 我猶豫要從源代碼開始構建軟件包,因為清理起來非常困難,而且這些更改似乎是次要的版本更改...

謝謝您的幫助。

(作為參考,這是Apache config和WSGI應用程序)

Apache配置(000-默認)

<VirtualHost *:80>
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www
    WSGIScriptAlias /rz /usr/local/share/rz/rz.wsgi
    ...

rz.WSGI應用

import os
import sys
import django.core.handlers.wsgi
import pprint

path = '/usr/local/share/rz'
if path not in sys.path:
    sys.path.insert(0, path)

os.environ['DJANGO_SETTINGS_MODULE'] = 'rz.settings'

class LoggingMiddleware:
    def __init__(self, application):
        self.__application = application

    def __call__(self, environ, start_response):
        errors = environ['wsgi.errors']
        pprint.pprint(('REQUEST', environ), stream=errors)

        def _start_response(status, headers, *args):
            pprint.pprint(('RESPONSE', status, headers), stream=errors)
            return start_response(status, headers, *args)

        return self.__application(environ, _start_response)

application = LoggingMiddleware(django.core.handlers.wsgi.WSGIHandler())

像這樣將ALLOWED_HOSTS設置添加到您的settings.py中...

ALLOWED_HOSTS = [
    '.example.com', # Allow domain and subdomains
    '.example.com.', # Also allow FQDN and subdomains
]

我遇到了同樣的問題,並在文檔中找到了答案

更新:django 1.6 docs不再在線,我更新了鏈接以轉到django 1.7 docs進行ALLOWED_HOSTS設置。

如果您確實設置了ALOWED_HOSTS ,請確保您的主機名不包含下划線。 從技術上講這是非法的。

我不得不打印出各種功能,它歸結為此正則表達式無法在django.http檢測到域。

host_validation_re = re.compile(r"^([a-z0-9.-]+|\[[a-f0-9]*:[a-f0-9:]+\])(:\d+)?$")

確實,我的領域里有一個下划線。

不是解決方案 ,但是出於調試目的,您可以像這樣在settings.py中設置ALLOWED_HOSTS設置

ALLOWED_HOSTS = ['*']

它肯定應該工作。 如果不是這樣,至少您會知道問題不是Django拒絕訪問給定的URL。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM