如果能以良好方式产生在X天内到期的临时URLs,则会 Wonder。 希望在一段时间后通过URL进入该网址的部分地点。 在Django、Alfon或他人的情形下,没有如何做到这一点的想法。
如果你不指望得到很高的回复率,那么你就应当努力将全部数据储存在URL本身。 这样,你就不需要在数据库中储存任何内容,并且将拥有与答复相称的数据储存,而不是发送的电子邮件。
更新: 请允许我说,你们有两种独一无二之处,对每个用户来说都是独特的。 你们可以把他们包装起来,把他们包装起来,并给他们一个像这样的保护 has:
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(
, )
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。 阁下认为,使用密码的这两个数值检索原始数据。
The zlib. 根据你的数据,你可以尝试看到你能发挥最佳作用。
你们可以这样说:
http://yoursite.com/temp/1a5h21j32
你们的“URLconf”将探讨这样的问题:
from django.conf.urls.defaults import *
urlpatterns = patterns( ,
(r ^temp/(?P<hash>w+)/$ , yoursite.views.tempurl ),
)
......温尔是视手,以斜.为根据。 或者,如果该网页过期,则发送404份。
模式
class TempUrl(模式.Model):
url_hash = 模式.CharField("Url", blank=False, max_length=32, unique=True)
expires = 模式.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.意见.load_url , name="url"),)
您当然需要一些进口和模板
这取决于你想要做些什么——例如开立账户或允许下载档案,可以看看一盘 has,检查一个时局,采取行动或提供档案。
提供任意数据等更为复杂的难题也需要包含某些参考数据的模型,以便你能够决定什么回去。 最后,允许查阅多页可能会涉及在用户会议中确定一些内容,然后利用这些内容确定它们可以看到哪些内容,然后是方向。
如果你能够更详细地说明你重新努力做些什么,以及你知道Django的情况,我可以作出更具体的答复。
我认为,解决办法是将所有建议的解决办法结合起来。 d 我建议使用一个到期的会议,以便在模型中你具体规定的时间期限内完成这一联系。 如果存在会议属性,而且所要求的导游要求,则与间接和中层设备一道检查,你可以制造一些安全的地方,这些地方可以有参照网站永久部分的URLs。 我在有限的时间内用这一方法演示设计/名称。 这样做是为了防止前进...... 我没有这样做,但是,在首先点击之后,你可以去掉轮机,只有会议属性,才能更有效地限制用户使用。 如果温带的传送知道它只剩下一定时间,我个人不会忘记。 运行良好,对应邀访问进行跟踪。
It might be overkill, but you could use a uuidfield on your model and set up a Celerybeat task to change the uuid at any time interval you choose. If celery is too much and it might be, you could just store the time the URL is first sent, use the timedelta function whenever it is sent thereafter, and if the elapsed time is greater than what you want just use a redirect. I think the second solution is very straightforward and it would extend easily. It would be a matter of having a model with the URL, time first sent, time most recently sent, a disabled flag, and a Delta that you find acceptable for the URL to live.
也可通过将@ted-batchelder swer和@matt-howell s 回答 with Django s signing
。
<代码> 信号代码>模块提供了一种方便的方法,可在必要时将数据编码放在圆顶上,并核对链接到期。 这样我们就不需要触及数据库或会议/海滩。
仅举一个缩略语:
索引网页与临时卢尔连接,具体到期。 如果你试图在合同到期后跟踪联系,你就会收到400份“Bad Request”(或请见)。 可疑交易代码>错误,<代码>DEBUG
。
urls.py
...
urlpatterns = [
path( , views.index, name= index ),
path( <str:signed_data>/ , views.temp, name= temp ),
]
views.py
from django.core import signing
from django.core.exceptions import SuspiciousOperation
from django.http import HttpResponse
from django.urls import reverse
MAX_AGE_SECONDS = 20 # short expiration, for illustrative purposes
def generate_temp_url(data=None):
# signing.dumps() returns a "URL-safe, signed base64 compressed JSON string"
# with a timestamp
return reverse( temp , args=[signing.dumps(data)])
def index(request):
# just a convenient usage example
return HttpResponse(f <a href="{generate_temp_url()}">temporary link</a> )
def temp(request, signed_data):
try:
# load data and check expiration
data = signing.loads(signed_data, max_age=MAX_AGE_SECONDS)
except signing.BadSignature:
# triggers an HttpResponseBadRequest (status 400) when DEBUG is False
raise SuspiciousOperation( invalid signature )
# success
return HttpResponse(f Here s your data: {data} )
一些说明:
举例来说,这些答复非常初步,仅供参考。
制作<条码>可疑交易代码>是方便的,但可以例如退还<条码>。 HttpResponse NotFound(status 404)。
<代码>generate_temp_url(>回到了一条相对的道路。 如果你需要绝对的ur,你可以做这样的事情:
temp_url = request.build_absolute_uri(generate_temp_url())
如果你担心所签数据泄漏,请看Django s password reset implementation。
- winforms
- combobox
- fogbugz
- java
- date
- internationalization
- asp.net
- iis
- url-rewriting
- urlrewriter
- c#
- enums
- ocaml
- haxe
- algorithm
- string
- viewstate
- .net
- c++
- c
- symbol-table
- mysql
- database
- postgresql
- licensing
- migration
- vb.net
- vb6
- declaration
- vb6-migration
- python
- psycopg2
- backup
- vmware
- virtualization
- gnu-screen
- authentication
- desktop
- excel
- xll
- cultureinfo
- regioninfo
- oracle
- client
- session
- download
- html
- virtual
- constructor
- scenarios
- perl
- full-text-search
- javascript
- ajax
- testing
- oop
- inheritance
- vim
- encapsulation
- information-hiding