Python 烧瓶+;mod#wsgi+;头标题处理:无法获取请求的存储桶
我有以下堆栈:Flask(Python2.7)+带有mod_wsgi的Apache2 我有一个简单的路由功能: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'
@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>