Хотите узнать, есть ли способ генерировать временные URL-адреса, срок действия которых истекает через X дней. Хотелось бы отправить по электронной почте URL-адрес, который получатель может щелкнуть, чтобы получить доступ к части сайта, которая через некоторое время недоступна через этот URL. Не знаю, как это сделать, с Django или Python или иначе.Как создавать временные URL-адреса в Django
ответ
Если вы не ожидаете получить большой коэффициент ответа, тогда вы следует попытаться сохранить все данные в самом 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 может быть полезен, в зависимости от ваших данных, вы можете поэкспериментировать, чтобы увидеть, что лучше всего подходит для вас.
Вы можете установить это с 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, если страница истекла.
Это зависит от того, что вы хотите сделать - одноразовые вещи, такие как активация учетной записи или возможность загрузки файла, могут быть выполнены с видом, который ищет хеш, проверяет метку времени и выполняет действие или предоставляет файл ,
Более сложные вещи, такие как предоставление произвольных данных, также требуют, чтобы модель содержала некоторую ссылку на эти данные, чтобы вы могли решить, что отправить назад. Наконец, разрешая доступ к нескольким страницам, возможно, потребуется установить что-то в сеансе пользователя, а затем использовать это, чтобы определить, что они видят, а затем перенаправить.
Если вы могли бы предоставить более подробную информацию о том, что вы пытаетесь сделать, и насколько хорошо вы знаете Django, я могу сделать более конкретный ответ.
Что я хочу сделать, это предоставить доступ к форме через временный URL-адрес, чтобы целевой посетитель мог перейти на URL-адрес в течение X дней (до истечения срока действия ссылки), и он отобразит форму. Форма будет предварительно заполнена данными, которые будут отличаться с каждым созданным URL-адресом. Такая же форма, разные данные для каждого URL-адреса. – chacmool
модели
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"),)
// вы, конечно, нужны импорт и шаблоны
Я думаю, что решение лежит в сочетании всех предлагаемых решений. Я бы предложил использовать истекающий сеанс, чтобы срок действия ссылки истекал в течение периода времени, указанного в модели.В сочетании с перенаправлением и промежуточным программным обеспечением, чтобы проверить, существует ли атрибут сеанса, и требует ли запрошенный URL-адрес, вы можете создать несколько защищенных частей вашего сайта, которые могут иметь более удобные URL-адреса, которые ссылаются на постоянные части сайта. Я использую это для демонстрации дизайна/функций в течение ограниченного времени. Это работает, чтобы предотвратить пересылку ... Я не делаю этого, но вы можете удалить временный url после первого щелчка, поэтому только атрибут сеанса предоставит доступ, тем самым более эффективно ограничивая одного пользователя. Я лично не возражаю, если temp url перенаправляется, зная, что он будет длиться только определенное количество времени. Хорошо работает в модифицированной форме для отслеживания приглашенных посещений.
Интересно. Не уверен, что я получаю метод для предотвращения пересылки, хотелось бы услышать более подробную информацию об этом подходе. – chacmool
Что я имею в виду при пересылке - это кто-то, отправляющий ссылку кому-то другому. Вы устанавливаете cookie один раз и устанавливаете его в своем приложении таким образом, чтобы любой другой доступ к URL-адресу не имел доступа, поскольку у них нет файла cookie. – mogga
- 1. Временные поля в django
- 2. Разрешено ли создавать временные файлы?
- 3. создавать временные файлы в папке tomcat webapps
- 4. Как создавать шаблоны Django?
- 5. Временные модели в django 1.9
- 6. Как хранить временные данные в модели Django?
- 7. Как создавать временные ряды, группируя записи в R?
- 8. Как долго будет хранить временные файлы django?
- 9. django - Что значит создавать?
- 10. Создавать группы django программно
- 11. Правильные временные установки в Django для сельдерея
- 12. Программно создавать модели django
- 13. Django CMS как создавать вложенные плагины программно
- 14. Понимание того, как создавать модели django
- 15. django i18n как создавать многоязычные приложения
- 16. Django не позволяет создавать проект
- 17. Django forms: как динамически создавать метки ModelChoiceField
- 18. динамически создавать классы Django ModelAdmin
- 19. Django ModelChoiceField позволяет создавать объекты
- 20. Oracle Sql: Процедура, которая может создавать временные таблицы внутри него
- 21. создавать временные ряды на основе даты начала и окончания
- 22. Когда создавать новые приложения в django
- 23. Где я должен создавать приложения django в django 1.4?
- 24. Где создавать временные файлы при доступе к/tmp/запрещается?
- 25. Как создавать представления автоматически из модели, как в Django admin?
- 26. Как использовать временные таблицы в SQL
- 27. Как очистить postgres временные таблицы рекурсивного запроса от django/psycopg2
- 28. Как вы собираетесь создавать класс «config» в Django?
- 29. Как разрешить пользователю создавать только один профиль в django?
- 30. Как разрешить пользователям создавать свои собственные плоские страницы в Django?
В основном каждый URL-адрес будет доступен для одного пользователя, поэтому не будет большой скорости ответа. Эта идея звучит интересно, но я не совсем понимаю ее на 100% - маленький пример будет замечательным! – chacmool