Как сгенерировать временные URL в Django - PullRequest
16 голосов
/ 01 сентября 2009

Хотите знать, есть ли хороший способ создать временные URL, срок действия которых истекает через X дней? Хотел бы отправить по электронной почте URL-адрес, по которому получатель может щелкнуть, чтобы получить доступ к той части сайта, которая через некоторое время станет недоступной через этот URL-адрес. Не знаю, как это сделать, с Django, Python или другим способом.

Ответы [ 5 ]

16 голосов
/ 01 сентября 2009

Если вы не ожидаете получить высокую скорость отклика, вам следует попытаться сохранить все данные в самом URL. Таким образом, вам не нужно ничего хранить в базе данных, а хранение данных будет пропорционально ответам, а не отправленным электронным письмам.

Обновлено: допустим, у вас было две строки, которые были уникальными для каждого пользователя. Вы можете упаковать их и распаковать с защитным хешем так:

import hashlib, zlib
import cPickle as pickle
import urllib

my_secret = "michnorts"

def encode_data(data):
    """Turn `data` into a hash and an encoded string, suitable for use with `decode_data`."""
    text = zlib.compress(pickle.dumps(data, 0)).encode('base64').replace('\n', '')
    m = hashlib.md5(my_secret + text).hexdigest()[:12]
    return m, text

def decode_data(hash, enc):
    """The inverse of `encode_data`."""
    text = urllib.unquote(enc)
    m = hashlib.md5(my_secret + text).hexdigest()[:12]
    if m != hash:
        raise Exception("Bad hash!")
    data = pickle.loads(zlib.decompress(text.decode('base64')))
    return data

hash, enc = encode_data(['Hello', 'Goodbye'])
print hash, enc
print decode_data(hash, enc)

Это производит:

849e77ae1b3c eJzTyCkw5ApW90jNyclX5yow4koMVnfPz09JqkwFco25EvUAqXwJnA==
['Hello', 'Goodbye']

В ваше электронное письмо включите URL-адрес, который имеет значения hash и enc (должным образом URL-кавычки). В вашей функции просмотра используйте эти два значения с decode_data для извлечения исходных данных.

zlib.compress может быть не очень полезен, в зависимости от ваших данных, вы можете поэкспериментировать, чтобы выяснить, что лучше для вас работает.

5 голосов
/ 01 сентября 2009

модель

class TempUrl(models.Model):
    url_hash = models.CharField("Url", blank=False, max_length=32, unique=True)
    expires = models.DateTimeField("Expires")

вид

def generate_url(request):
    # do actions that result creating the object and mailing it

def load_url(request, hash):
    url = get_object_or_404(TempUrl, url_hash=hash, expires__gte=datetime.now())
    data = get_some_data_or_whatever()
    return render_to_response('some_template.html', {'data':data}, 
                              context_instance=RequestContext(request))

URL

urlpatterns = patterns('', url(r'^temp/(?P<hash>\w+)/$', 'your.views.load_url', name="url"),)

// конечно, вам нужны некоторые импорты и шаблоны

3 голосов
/ 01 сентября 2009

Вы можете настроить это с помощью URL-адресов, таких как:

http://yoursite.com/temp/1a5h21j32

Ваш URLconf будет выглядеть примерно так:

from django.conf.urls.defaults import *

urlpatterns = patterns('',
    (r'^temp/(?P<hash>\w+)/$', 'yoursite.views.tempurl'),
)

... где tempurl - это обработчик представления, который выбирает соответствующую страницу на основе хеша. Или отправляет 404, если срок действия страницы истек.

1 голос
/ 10 декабря 2009

Я думаю, что решение находится в комбинации всех предложенных решений. Я бы предложил использовать сеанс с истекающим сроком действия, чтобы срок действия ссылки истек в течение периода времени, указанного в модели. В сочетании с перенаправлением и промежуточным программным обеспечением для проверки наличия атрибута сеанса и запрашиваемого URL-адреса, вы можете создать несколько безопасных частей вашего сайта, которые могут иметь более приятные URL-адреса, ссылающиеся на постоянные части сайта. Я использую это для демонстрации дизайна / функций в течение ограниченного времени. Это работает для предотвращения пересылки ... Я не делаю этого, но вы можете удалить временный URL после первого щелчка, чтобы только атрибут сеанса предоставил доступ, таким образом более эффективно ограничивая одного пользователя. Лично я не против, если временный URL будет перенаправлен, зная, что он будет длиться только определенное время. Хорошо работает в модифицированной форме для отслеживания приглашенных посещений.

1 голос
/ 01 сентября 2009

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

Более сложные вещи, такие как предоставление произвольных данных, также потребуют модель, содержащую некоторую ссылку на эти данные, чтобы вы могли решить, что отправлять обратно. Наконец, разрешение доступа к нескольким страницам, вероятно, потребует установки чего-либо в сеансе пользователя и последующего использования этого для определения того, что он может видеть, с последующим перенаправлением.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...