我想为我的用户生成临时下载链接.
如果我使用
django使用url模式生成链接,那可以吗?
这可能是正确的方法.因为可能发生我不理解某些过程如何工作.它会溢出我的记忆或其他东西.将会欣赏某种示例或工具.有些nginx,apache模块可能吗?
所以,我想要实现的是制作取决于用户和时间的网址模式.在文档中查看它结束返回.
最佳答案 是的,允许django生成网址是可以的.这与urls.py处理网址是排他的.通常你不希望django处理文件的服务,请参阅关于此的静态文件docs [1],因此请从头脑中获取使用url模式的概念.
您可能想要做的是使用散列生成随机密钥,如md5 / sha1.存储文件和密钥,它在数据库中添加的日期时间,在您的网络服务器上可以创建下载目录,如apache或nginx …建议nginx),因为它是临时的,你需要添加一个cron检查自生成url以来的时间是否已过期的作业,清除文件并删除db条目.这应该是manage.py的django命令
请注意这是为此编写的示例代码,未经测试!它可能无法按照您计划实现此目标的方式运行,但它可行.如果你想让dl受到pw保护,那么请查看httpbasic auth.您可以在创建链接时或在注册时使用htpasswd和子进程模块在httpd.auth文件中动态生成和删除条目.
import hashlib, random, datetime, os, shutil
# model to hold link info. has these fields: key (charfield), filepath (filepathfield)
# datetime (datetimefield), url (charfield), orgpath (filepathfield of the orignal path
# or a foreignkey to the files model.
from models import MyDlLink
# settings.py for the app
from myapp import settings as myapp_settings
# full path and name of file to dl.
def genUrl(filepath):
# create a onetime salt for randomness
salt = ''.join(['{0}'.format(random.randrange(10) for i in range(10)])
key = hashlib('{0}{1}'.format(salt, filepath).hexdigest()
newpath = os.path.join(myapp_settings.DL_ROOT, key)
shutil.copy2(fname, newpath)
newlink = MyDlink()
newlink.key = key
newlink.date = datetime.datetime.now()
newlink.orgpath = filepath
newlink.newpath = newpath
newlink.url = "{0}/{1}/{2}".format(myapp_settings.DL_URL, key, os.path.basename(fname))
newlink.save()
return newlink
# in commands
def check_url_expired():
maxage = datetime.timedelta(days=7)
now = datetime.datetime.now()
for link in MyDlink.objects.all():
if(now - link.date) > maxage:
os.path.remove(link.newpath)
link.delete()
[1] http://docs.djangoproject.com/en/1.2/howto/static-files/