Создание бета-кода для общедоступного сайта django

Я собираюсь разместить в Интернете бета-версию сайта, над которым я работаю. Для ограничения доступа необходим бета-код. Сайт написан на django.

Я не хочу менять фундаментальную систему Auth для размещения бета-кода, и меня особо не волнует, что безопасность бета-кода железная, просто это серьезный камень преткновения.

Как мне это сделать? Это довольно большой проект, поэтому добавление кода в каждое представление далеко от идеала.


Это решение работает хорошо. Класс промежуточного программного обеспечения I получил следующее:

from django.http import HttpResponseRedirect

class BetaMiddleware(object):
    """
    Require beta code session key in order to view any page.
    """
    def process_request(self, request):
        if request.path != '/beta/' and not request.session.get('in_beta'):
            return HttpResponseRedirect('%s?next=%s' % ('/beta/', request.path))
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
11
0
1 372
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

Вы должны иметь возможность добавлять декораторы @login_required по всем направлениям и покончить с этим. Если у вас нет большого количества функций просмотра, это не должно быть слишком ужасно.

Проблема в том, что тогда тот, кто пытается получить доступ, попадает на страницу входа, а не на страницу для ввода бета-кода. На странице входа есть все меню и пользовательский интерфейс вокруг нее. Я бы хотел пока сохранить это в секрете.

defrex 20.09.2008 01:35

@defrex, создайте собственный декоратор login_required, который обертывает встроенную версию Django. Когда вы начнете жить, просто замените его полностью на Django.

John Millikin 20.09.2008 02:00

Вероятно, вы можете ограничить доступ ко всему сайту через apache с помощью htaccess, полностью исключив проблему из пространства проекта django.

Сделайте то, что сделал StackOverflow.

У них была простая форма электронной почты / пароля. У него был один жестко закодированный пароль (falkensmaze). Когда пользователь получит правильный пароль, установите cookie. например. auth = 1

Не беспокойтесь о том, что это небезопасно. Какая разница, если кто-то взломает бета-версию?

Apache / htaccess - тоже хорошее и простое решение.

Это означает, что я должен проверять наличие файла cookie в каждом представлении. Я бы предпочел избегать добавления кода в каждое представление. Есть ли способ проверить файл cookie глобально в django?

defrex 20.09.2008 01:59

@defrex да с промежуточным программным обеспечением. См. Ответ AdamKG.

imns 29.12.2012 23:58
Ответ принят как подходящий

Начните с этот фрагмент Django, но измените его, чтобы проверить request.session['has_beta_access']. Если у них его нет, то попросите его вернуть перенаправление на страницу «введите бета-код», которая при отправке с правильным кодом устанавливает для этой переменной сеанса значение True.

Чтобы сделать его общедоступной бета-версией, нужно просто удалить это промежуточное ПО из настроек MIDDLEWARE_CLASSES.

Я не уверен, какую версию кода Pinax вы используете, но они встроили возможность закрыть сайт для частной бета-версии, поэтому вам не нужно много работать самостоятельно.

Ссылка на конкретный шаблон проекта для частного бета-сайта находится здесь: http://github.com/pinax/pinax/tree/3ad73d1ba44f37365333bae17b507668b0eb7e16/pinax/projects/private_beta_project, хотя я думаю, что с тех пор они могли добавить эту функциональность во все шаблоны проектов.

Действительно старая версия pinax. Вопрос был задан в сентябре 08. Это хороший момент, поэтому я убрал ссылку на pinax из вопроса, чтобы люди не вводились в заблуждение.

defrex 10.08.2009 22:30

Отличный фрагмент, но он вызвал у меня множество проблем, связанных с сессиями OpenId. В итоге я полагаюсь на файлы cookie вместо сеанса:

class BetaMiddleware(object):
    """
    Require beta code cookie key in order to view any page.
    """
    set_beta = False
    def process_request(self, request):
        referer = request.META.get('HTTP_REFERER', '')

        if request.method == 'GET' and not 'is_in_beta' in request.COOKIES:
            return HttpResponseRedirect('%s?next=%s' % ('/beta/', request.path))

        if request.method == 'POST' and 'pass' in request.POST:
            code = request.POST['pass']

            if code=='beta':
                self.set_beta = True
                return HttpResponseRedirect('%s' % '/')

    def process_response(self, request, response):        

        if self.set_beta is True:
            response.set_cookie('is_in_beta', '1')
        return response

Это небезопасно, но мне этого достаточно. Это также работает только с бета-страницей html.

используйте это промежуточное ПО:

class BetaForm(Form):
    beta_pass = CharField(required=True)

    def clean_beta_pass(self):
        data = self.cleaned_data['beta_pass']
        if data != settings.BETA_PASS:
            raise forms.ValidationError("Invalid Beta pass!")
        return data


class BetaView(FormView):
    form_class = BetaForm
    template_name = "beta.html"

    def form_valid(self, form):
        response = HttpResponseRedirect(self.request.GET.get("next", "/"))
        response.set_cookie(settings.BETA_PASS, '')
        return response


def beta_middleware(get_response):
    def middleware(request):

        if request.path == reverse("beta"):
            return get_response(request)
        else:
            if settings.BETA_PASS in request.COOKIES:
                return get_response(request)
            else:
                return HttpResponseRedirect(
                    '%s?%s' % (reverse("beta"), urlencode({"next": request.get_full_path()})))
    return middleware

этот шаблон:

<!doctype html>
<title>Welcome to the beta!</title>
<style>
  body { text-align: center; padding: 150px; }
  h1 { font-size: 50px; }
  body { font: 20px Helvetica, sans-serif; color: #333; }
  article { display: block; text-align: left; width: 650px; margin: 0 auto; }
  a { color: #dc8100; text-decoration: none; }
  a:hover { color: #333; text-decoration: none; }
</style>

<article>

    <h1>>Welcome to the beta lucky user!</h1>
    <div>
        <form method = "POST">
            {% csrf_token %}
            {{form}}
            <input type = "submit">
        </form>
    </div>
</article>

это настройки:

BETA_PASS = "beta"

этот путь:

path("beta",BetaView.as_view(),name = "beta"),

Другие вопросы по теме