2009-09-01 2 views
14

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

ответ

15

Если вы не ожидаете получить большой коэффициент ответа, тогда вы следует попытаться сохранить все данные в самом 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, который имеет как хэш и значение ENC (правильно url- цитируем). В вашей функции просмотра используйте эти два значения с помощью decode_data для извлечения исходных данных.

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

+0

В основном каждый URL-адрес будет доступен для одного пользователя, поэтому не будет большой скорости ответа. Эта идея звучит интересно, но я не совсем понимаю ее на 100% - маленький пример будет замечательным! – chacmool

3

Вы можете установить это с 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

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

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

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

+0

Что я хочу сделать, это предоставить доступ к форме через временный URL-адрес, чтобы целевой посетитель мог перейти на URL-адрес в течение X дней (до истечения срока действия ссылки), и он отобразит форму. Форма будет предварительно заполнена данными, которые будут отличаться с каждым созданным URL-адресом. Такая же форма, разные данные для каждого URL-адреса. – chacmool

5

модели

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)) 

URLs

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

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

1

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

+0

Интересно. Не уверен, что я получаю метод для предотвращения пересылки, хотелось бы услышать более подробную информацию об этом подходе. – chacmool

+0

Что я имею в виду при пересылке - это кто-то, отправляющий ссылку кому-то другому. Вы устанавливаете cookie один раз и устанавливаете его в своем приложении таким образом, чтобы любой другой доступ к URL-адресу не имел доступа, поскольку у них нет файла cookie. – mogga

Смежные вопросы