用于django app的heroku上的htaccess

时间:2012-02-22 17:24:16

标签: django .htaccess heroku

标题几乎总结了我的问题。我想密码保护我的django应用程序中的一些文件,这些文件位于heroku上 如果我不能使用htaccess,是否有人建议我还能使用什么? 感谢。

3 个答案:

答案 0 :(得分:16)

正如@mipadi所说,你不能在Heroku上使用htaccess,但你可以为此创建一个中间件:

from django.conf import settings
from django.http import HttpResponse
from django.utils.translation import ugettext as _


def basic_challenge(realm=None):
    if realm is None:
        realm = getattr(settings, 'WWW_AUTHENTICATION_REALM', _('Restricted Access'))
    # TODO: Make a nice template for a 401 message?
    response =  HttpResponse(_('Authorization Required'), mimetype="text/plain")
    response['WWW-Authenticate'] = 'Basic realm="%s"' % (realm)
    response.status_code = 401
    return response

def basic_authenticate(authentication):
    # Taken from paste.auth
    (authmeth, auth) = authentication.split(' ',1)
    if 'basic' != authmeth.lower():
        return None
    auth = auth.strip().decode('base64')
    username, password = auth.split(':',1)
    AUTHENTICATION_USERNAME = getattr(settings, 'BASIC_WWW_AUTHENTICATION_USERNAME')
    AUTHENTICATION_PASSWORD = getattr(settings, 'BASIC_WWW_AUTHENTICATION_PASSWORD')
    return username == AUTHENTICATION_USERNAME and password == AUTHENTICATION_PASSWORD

class BasicAuthenticationMiddleware(object):
    def process_request(self, request):
        if not getattr(settings, 'BASIC_WWW_AUTHENTICATION', False):
            return
        if 'HTTP_AUTHORIZATION' not in request.META:
            return basic_challenge()
        authenticated = basic_authenticate(request.META['HTTP_AUTHORIZATION'])
        if authenticated:
            return
        return basic_challenge()

然后你需要在settings.py中定义:

BASIC_WWW_AUTHENTICATION_USERNAME = "your user"
BASIC_WWW_AUTHENTICATION_PASSWORD = "your pass"
BASIC_WWW_AUTHENTICATION = True

答案 1 :(得分:8)

我能够使用雪松堆栈在heroku上使用.htaccess个文件。

  1. Procfile需要为Web节点指定脚本:

    web:    sh www/conf/web-boot.sh
    
  2. conf/web-boot.sh组合包含apache配置文件,例如:

  3. 然后,conf/httpd/default.conf可以允许覆盖,正如您从apache中所了解的那样。
  4. 然后您可以使用.htaccess个文件。我的博客文章PHP on Heroku again详细记录了整个过程,其中一部分是关于apache配置的。 2.包括您自己的httpd配置的步骤基本上是:

    sed -i 's/Listen 80/Listen '$PORT'/' /app/apache/conf/httpd.conf
    sed -i 's/^DocumentRoot/# DocumentRoot/' /app/apache/conf/httpd.conf
    sed -i 's/^ServerLimit 1/ServerLimit 8/' /app/apache/conf/httpd.conf
    sed -i 's/^MaxClients 1/MaxClients 8/' /app/apache/conf/httpd.conf
    
    for var in `env|cut -f1 -d=`; do
      echo "PassEnv $var" >> /app/apache/conf/httpd.conf;
    done
    echo "Include /app/www/conf/httpd/*.conf" >> /app/apache/conf/httpd.conf
    touch /app/apache/logs/error_log
    touch /app/apache/logs/access_log
    tail -F /app/apache/logs/error_log &
    tail -F /app/apache/logs/access_log &
    export LD_LIBRARY_PATH=/app/php/ext
    export PHP_INI_SCAN_DIR=/app/www
    echo "Launching apache"
    exec /app/apache/bin/httpd -DNO_DETACH
    

    我希望这会有所帮助。我用它来.htaccess和更改webroot。

答案 2 :(得分:-2)

您不能使用.htaccess,因为Heroku应用程序不适用于Apache。不过,您可以使用Django authentication

或者您可以使用Apache为 的其他服务器提供文件。