Как создавать временные URL-адреса в Django
Хотите узнать, есть ли способ генерировать временные URL-адреса, срок действия которых истекает через X дней. Хотелось бы отправить по электронной почте URL-адрес, который получатель может щелкнуть, чтобы получить доступ к части сайта, которая через некоторое время недоступна через этот URL. Не знаю, как это сделать, с Django или Python или иначе.
Ответы
Ответ 1
Если вы не ожидаете получить большой коэффициент ответа, вам следует попытаться сохранить все данные в самом 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 не так полезен, в зависимости от ваших данных, вы можете поэкспериментировать, чтобы увидеть, что лучше всего подходит для вас.
Ответ 2
Модели
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
Вы можете установить это с помощью 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, если страница истекла.
Ответ 4
Это зависит от того, что вы хотите сделать - одноразовые вещи, такие как активация учетной записи или возможность загрузки файла, могут быть выполнены с видом, который ищет хеш, проверяет метку времени и выполняет действие или предоставляет файл.
Более сложные вещи, такие как предоставление произвольных данных, также требуют, чтобы модель содержала некоторую ссылку на эти данные, чтобы вы могли решить, что отправить назад. Наконец, разрешая доступ к нескольким страницам, возможно, потребуется установить что-то в сеансе пользователя, а затем использовать это, чтобы определить, что они видят, а затем перенаправить.
Если вы могли бы предоставить более подробную информацию о том, что вы пытаетесь сделать, и насколько хорошо вы знаете Django, я могу сделать более конкретный ответ.
Ответ 5
Я думаю, что решение лежит в сочетании всех предлагаемых решений. Я бы предложил использовать истекающий сеанс, чтобы срок действия ссылки истекал в течение периода времени, указанного в модели. В сочетании с перенаправлением и промежуточным программным обеспечением, чтобы проверить, существует ли атрибут сеанса, и требует ли запрошенный URL-адрес, вы можете создать несколько защищенных частей вашего сайта, которые могут иметь более удобные URL-адреса, которые ссылаются на постоянные части сайта. Я использую это для демонстрации дизайна/функций в течение ограниченного времени. Это работает, чтобы предотвратить пересылку... Я не делаю этого, но вы можете удалить временный url после первого щелчка, поэтому только атрибут сеанса предоставит доступ, тем самым более эффективно ограничивая одного пользователя. Я лично не возражаю, если temp url перенаправляется, зная, что он будет длиться только определенное количество времени. Хорошо работает в модифицированной форме для отслеживания приглашенных посещений.
Ответ 6
Это может быть излишним, но вы можете использовать поле uuid в своей модели и настроить задачу Celerybeat, чтобы изменить uuid в любой выбранный вами интервал времени.
Если сельдерея слишком много и это может быть, вы можете просто сохранить время первой отправки URL-адреса, использовать функцию timedelta при каждой последующей отправке, а если истекшее время больше, чем вы хотите, просто используйте перенаправление. Я думаю, что второе решение очень простое и легко расширяется. Это будет вопрос наличия модели с URL-адресом, времени первой отправки, времени последней отправки, отключенного флага и дельты, которая, по вашему мнению, приемлема для URL-адреса.