Python 烧瓶+;mod#wsgi+;头标题处理:无法获取请求的存储桶

Python 烧瓶+;mod#wsgi+;头标题处理:无法获取请求的存储桶,python,python-2.7,apache,flask,mod-wsgi,Python,Python 2.7,Apache,Flask,Mod Wsgi,我有以下堆栈:Flask(Python2.7)+带有mod_wsgi的Apache2 我有一个简单的路由功能: @app.route("/upload/<file_name>/", methods=['POST', 'HEAD']) def upload(file_name): if request.method == 'HEAD': file_size = int(request.headers.get('Content-Length'

我有以下堆栈:Flask(Python2.7)+带有mod_wsgi的Apache2

我有一个简单的路由功能:

@app.route("/upload/<file_name>/", methods=['POST', 'HEAD'])
def upload(file_name):       
    if request.method == 'HEAD':    
        file_size = int(request.headers.get('Content-Length'))
        file_path = os.path.join(storage_path, file_name)

        if not os.path.exists(file_path):
            return general_response(404)    
        else:
            file_size_on_disk = Utils.get_size_of_file(file_path)
            if file_size_on_disk < file_size:
                print "1"
                return general_response(201)
            elif file_size_on_disk == file_size:
                print "2"
                return general_response(200)    
            else:
                print "4"
                return general_response(500)

    # some code
这是正确的行为,因为在这种情况下该部分代码应该执行,但打印“2”后服务器没有响应

如果我在REST客户端中中止连接,我会在日志中看到以下行:

(70008)部分结果有效,但处理不完整:mod_wsgi(pid=11509):无法获取请求的桶旅

这是我的apache2配置:

<VirtualHost *:443>

    ServerAdmin Admin
    ServerName site.com

    SSLEngine on
    SSLCertificateFile /path/to/cert
    SSLCertificateKeyFile /path/to/key

    <FilesMatch "\.(cgi|shtml|phtml|php)$">
         SSLOptions +StdEnvVars
    </FilesMatch>

    <Directory /usr/lib/cgi-bin>
                    SSLOptions +StdEnvVars
    </Directory>

    BrowserMatch "MSIE [2-6]" \
                    nokeepalive ssl-unclean-shutdown \
                    downgrade-1.0 force-response-1.0

    BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

    WSGIScriptAlias / /path/to/app.wsgi

    WSGIDaemonProcess app_name user=worker group=worker processes=1 threads=5

    DocumentRoot /path/to/src/dir
    <Directory /path/to/src/dir>
        LimitRequestBody 4147483647
        WSGIProcessGroup app_name
        WSGIApplicationGroup %{GLOBAL}
        Order deny,allow
        Allow from all
    </Directory>

</VirtualHost>

服务器管理员
服务器名网站
斯伦金安
SSLCertificateFile/path/to/cert
SSLCertificateKeyFile/path/to/key
发展+标准
发展+标准
浏览器匹配“MSIE[2-6]”\
nokeepalive ssl不干净关闭\
降级-1.0力响应-1.0
BrowserMatch“MSIE[17-9]”ssl不干净关闭
ErrorLog${APACHE_LOG_DIR}/error.LOG
CustomLog${APACHE\u LOG\u DIR}/access.LOG组合
WSGIScriptAlias//path/to/app.wsgi
WSGIDaemonProcess app_name user=worker group=worker processs=1线程=5
DocumentRoot/path/to/src/dir
LimitRequestBody 4147483647
WSGIProcessGroup应用程序名称
WSGIApplicationGroup%{GLOBAL}
命令拒绝,允许
通融
我真的不明白为什么接收这个带有值的头会破坏wsgi逻辑


如有任何帮助/建议,将不胜感激

您甚至应该看到一个
请求。这是因为mod_wsgi将
HEAD
映射到
GET
通常是因为大多数wsgi应用程序不能正确处理
HEAD
,并且返回的结果与
GET
返回的结果不匹配。有一个指令可以设置为传递原始
,但不能将其显示为已设置。您有什么处理
GET
的代码?您是否添加了调试以验证是否向您传递了
HEAD
请求?您使用的是哪个mod_wsgi版本?1)我不在这个路由函数中处理GET请求。或者你是什么意思?2) 不,我没有。你的意思是这样的吗?3) libapache2 mod wsgi,4.3.0-1.1build1,amd64当我需要用指定的标题响应HEAD请求时,您能建议如何正确处理此类操作吗?另外,您能解释一下这个短语“bucket batch”的意思吗?我的意思是:您甚至不应该看到
HEAD
请求。您使用的是非常旧的mod_wsgi版本。从4.3.0开始,您可以通过在Apache配置中设置指令
WSGIMapHEADToGET Off
来禁用
HEAD
GET
的映射。在这一点上,不要太担心bucket Batch错误,因为Apache有时会在连接断开时抛出与bucket Batch相关的奇怪消息,特别是在使用安全连接的情况下。
<VirtualHost *:443>

    ServerAdmin Admin
    ServerName site.com

    SSLEngine on
    SSLCertificateFile /path/to/cert
    SSLCertificateKeyFile /path/to/key

    <FilesMatch "\.(cgi|shtml|phtml|php)$">
         SSLOptions +StdEnvVars
    </FilesMatch>

    <Directory /usr/lib/cgi-bin>
                    SSLOptions +StdEnvVars
    </Directory>

    BrowserMatch "MSIE [2-6]" \
                    nokeepalive ssl-unclean-shutdown \
                    downgrade-1.0 force-response-1.0

    BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

    WSGIScriptAlias / /path/to/app.wsgi

    WSGIDaemonProcess app_name user=worker group=worker processes=1 threads=5

    DocumentRoot /path/to/src/dir
    <Directory /path/to/src/dir>
        LimitRequestBody 4147483647
        WSGIProcessGroup app_name
        WSGIApplicationGroup %{GLOBAL}
        Order deny,allow
        Allow from all
    </Directory>

</VirtualHost>