Название в значительной степени подводит итог моему вопросу. Я хотел бы защитить паролем некоторые файлы в моем приложении django, которое живет на heroku.
Если я не могу использовать htaccess, есть ли у кого-нибудь предложения о том, что еще я могу использовать?
Спасибо.
Htaccess on heroku для приложения django
Ответ 1
Как сказал @mipadi, вы не можете использовать htaccess на Heroku, но вы можете создать для этого промежуточное ПО:
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
Ответ 2
Я смог использовать .htaccess
файлы на герою с кедровым стеком.
-
Procfile
необходимо указать script для веб-узлов:web: sh www/conf/web-boot.sh
-
conf/web-boot.sh
slipstreams включает в себя файл конфигурации apache, например: - A
conf/httpd/default.conf
затем может разрешить переопределение, как вам известно, от apache.
Затем вы можете просто использовать файлы .htaccess
. Весь процесс подробно описан в моем сообщении в блоге PHP на Heroku снова, из которых одна часть посвящена конфигурации 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.
Ответ 3
Вы не можете использовать .htaccess, потому что приложения Heroku не подаются с Apache. Однако вы можете использовать проверку подлинности Django.
Или вы можете обслуживать файлы с другого сервера, использующего Apache.