Как генерировать временные URL в Django

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

19
задан chacmool 1 September 2009 в 00:58
поделиться

5 ответов

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

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

16
ответ дан 30 November 2019 в 04:20
поделиться

модели

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

// конечно, вам понадобится импорт и шаблоны

5
ответ дан 30 November 2019 в 04:20
поделиться

Вы можете настроить это с помощью 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
ответ дан 30 November 2019 в 04:20
поделиться

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

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

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

1
ответ дан 30 November 2019 в 04:20
поделиться

I think the solution lies within a combination of all the suggested solutions. I'd suggest using an expiring session so the link will expire within the time period you specify in the model. Combined with a redirect and middleware to check if a session attribute exists and the requested url requires it you can create somewhat secure parts of your site that can have nicer URLs that reference permanent parts of the site. I use this for demonstrating design/features for a limited time. This works to prevent forwarding... I don't do it but you could remove the temp url after first click so only the session attribute will provide access thus more effectively limiting to one user. I personally don't mind if the temp url gets forwarded knowing it will only last for a certain amount of time. Works well in a modified form for tracking invited visits as well.

1
ответ дан 30 November 2019 в 04:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: