有没有办法让mod_wsgi / Flask和mod_dav共存?

时间:2015-09-23 21:55:40

标签: python apache flask mod-wsgi webdav

我正在一个网站上工作,该网站基本上是一堆数据的文件存储库。

我需要人们能够遍历目录并通过WebDAV及其浏览器下载文件(即mod_autoindex)。

使用mod_autoindex和mod_dav可以正常工作。但我想使用mod_wsgi / Flask来自定义和提供目录列表页面,而不是使用Flask-AutoIndex插件提供相当不灵活的mod_autoindex。

问题是这似乎会干扰DAV请求。当我尝试连接DAV客户端时出现The URL contains extraneous path components. The resource could not be identified.错误。

有没有办法让mod_wsgi忽略所有使用WebDAV特定标题的请求,以便mod_dav可以正确处理它们?

编辑:

这是我的Apache配置:

LoadModule dav_module modules/mod_dav.so LoadModule dav_fs_module modules/mod_dav_fs.so DavLockDB "/var/lib/urs_test/dav/DavLock" LoadModule wsgi_module modules/mod_wsgi.so WSGIScriptAlias / /urs_test/webdav_info /usr/local/apache2/htdocs/urs_test/app.wsgi WSGIDaemonProcess test processes=2 threads=15 WSGIProcessGroup test

<Directory /usr/local/apache2/htdocs/urs_test> AuthType UrsOAuth2 require valid-user Dav On Options +ExecCGI AddHandler cgi-script .cgi .pl </Directory>

另一个编辑:

所以我想我已经弄明白这里有什么了。它与WSGIScriptAlias标记有关,该标记被附加到请求路径。

/urs_test/files的WebDAV请求在到达mod_dav时被修改为/usr/local/apache2/htdocs/urs_test/app.wsgi/files

所以我需要找到一种方法来有选择地将alias指令应用于某些HTTP方法(即PROPFIND)而不是其他方法(即GET)。

1 个答案:

答案 0 :(得分:1)

过了一会儿回来,我发现了一些似乎有用的东西。

基本上,我使用mod_rewrite来重定向我不希望mod_wsgi / Flask处理的请求。

因此,如果我的Flask应用程序在/endpoint下提供,并且我希望我的WebDAV存储库在/endpoint/dav下可用,我的配置是:

RewriteCond %{REQUEST_URI} ^/endpoint/dav
RewriteCond %{REQUEST_METHOD} ^(PROPFIND|OPTIONS|PROPPATCH)$
RewriteRule ^/endpoint/dav /local_path_to_dav_repo/$1 [L]

RewriteCond %{REQUEST_URI} ^/endpoint/dav
RewriteCond %{REQUEST_METHOD} =GET
RewriteCond /local_path_to_dav_repo/$1 !-d
RewriteRule ^/endpoint/dav(.*) /local_path_to_dav_repo/$1 [L]

WSGIScriptAlias /endpoint /my_wsgi_dir/flask.wsgi

<Directory /local_path_to_dav_repo>
Dav On
</Directory>

前3行抓取任何特定于DAV的方法(现在是只读方法)并将它们重定向到DAV repo的本地路径。由于mod_wsgi仅抓取/endpoint URI的请求,因此此请求永远不会到达Flask并直接转到mod_dav

接下来的4行抓取对特定文件的任何GET请求,并将它们重定向到本地文件系统中该文件的特定位置。再一次,这个请求没有到达Flask。根据我的理解,让Apache直接提供文件比使用Flask更快。

因此结果是只有GET对DAV repo中目录的请求才能使它成为mod_wsgi,因此我可以构建一个漂亮的目录索引并通过Flask提供它。