使用HTTPHandler导致Django服务器端显示http400和无效的http主机头消息

2024-09-28 20:59:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用HTTPHandler向Django Web服务器发送日志消息,代码如下:

import logging
import logging.handlers

logger = logging.getLogger(__name__)

_TARGET = '192.168.8.100:8000'
_PATH = '/VideoParser/lYYDownloaderClientLog/'

sh = logging.handlers.HTTPHandler(_TARGET, _PATH)

logger.addHandler(sh)
logger.error('testing remote logging')

但是服务器端显示的是http400和无效的http_主机头消息,如下所示

Invalid HTTP_HOST header: '192.168.8.100:8000,192.168.8.100'. The domain name pr ovided is not valid according to RFC 1034/1035. [05/Apr/2017 10:43:14] "GET /VideoParser/lYYDownloaderClientLog/?relativeCreated =117.00654029846191&thread=5468&levelname=ERROR&exc_info=None&exc_text=None&proc ess=8920&filename=a.py&msecs=39.52503204345703&stack_info=None&levelno=40&proces sName=MainProcess&msg=testing+remote+logging&module=a&threadName=MainThread&line no=26&created=1491360192.039525&funcName=%3Cmodule%3E&args=%28%29&name=main& pathname=C%3A%5CUsers%5Ci%5CDocuments%5CTencent+Files%5C2281570025%5CFileRecv%5C a.py HTTP/1.1" 400 68137

从具有url的浏览器请求

http://192.168.8.100:8000/VideoParser/lYYDownloaderClientLog/?filename=log55.p%20y&levelno=40&relativeCreated=88.00482749938965&funcName=%3Cmodule%3E&thread=7144%20&stack_info=None&module=log55&args=%28%29&exc_text=None&pathname=D%3A%5CBaiduYun%20Download%5C%E7%BC%96%E7%A8%8B%5CPython%5Clog55.py&levelname=ERROR&msecs=668.0548%20191070557&threadName=MainThread&process=6664&name=root&lineno=34&msg=yahoo+Serve%20r+Exception&exc_info=None&processName=MainProcess&created=1491225161.6680548

实际上可以向服务器发送一个好的请求,在本例中,服务器显示以下内容

^{pr2}$

那么,使用HTTPHandler向Django Web服务器发送日志消息的代码有什么问题?在

正如我测试过的:如果我把web服务器的IP地址传递给HTTPHandler的host参数,服务器端会显示http400和无效的http_host header消息,也有异常,粘贴在这里https://bpaste.net/show/f2d2e64e7a7e,而如果我改为传递域名,那么view函数会按预期工作。 那么这会是HTTPHandler中的一个bug吗?在

调试相关代码

django测试\LYYDownloaderServer\VideoParser\网址.py在

from django.conf.urls import url
from . import views
app_name = 'VideoParser'
urlpatterns = [
    url(r'lYYDownloaderClientLog.+',views.lYYDownloaderClientLog, name='lYYDownloaderClientLog')
]

django测试\LYYDownloaderServer\VideoParser\视图.py在

def lYYDownloaderClientLog(request):
    print('----666666666666---', request.GET)
    return HttpResponse("")  # The server *successfully* processed the request and is not returning any content.

Tags: 代码namepyimportinfononehttp消息
1条回答
网友
1楼 · 发布于 2024-09-28 20:59:31

我在使用Django接收日志时遇到了同样的问题,最后我没有解决,但我知道问题是。在

Invalid HTTP_HOST header: '127.0.0.1:8888,127.0.0.1'. The domain name provided is not valid according to RFC 1034/1035.

根据输出,我检查了logging.handlers.HTTPHandler的源代码,在这个类中,函数emit将执行http.client.HTTPSConnection或{},然后执行putrequest和{},但在putrequest中将执行{},因为端口!=80,主机是host:port

^{pr2}$

所以我想如果你使用Nginx和80端口,也许你可以解决这个问题

更新: 我终于解决了。我创建一个新类LogHTTPHandler,继承HTTPHandler,然后重写函数emit,并注释掉h.putheader("Host", host)

from logging.handlers import HTTPHandler

class LogHTTPHandler(HTTPHandler):
    def emit(self, record):
        ......
        i = host.find(":")
        if i >= 0:
            host = host[:i]
        # h.putheader("Host", host)
        if self.method == "POST":
            h.putheader("Content-type",
                        "application/x-www-form-urlencoded")
            h.putheader("Content-length", str(len(data)))
        ......

相关问题 更多 >