先说下需求,我现在想实现动态页面静态化,但是又不想一开始就生成静态页,所以写了个代理view,访问静态页的时候判断对应的静态页面是否生成了静态页,如果生成了就直接返回静态页,没有就访问对应的动态页并生成静态页
url层的设置大致是这样的
url(r'^(?P<question_id>[0-9]+)/$', views.detail, name='detail')
url(r'^(detail/(?P<question_id>[0-9]+)\.html)$', views.page_proxy, {
'related_view': views.detail
}, name='detail_page')
对应的中间页view
from django.core.files.storage import default_storage
from django.core.files.base import ContentFile
def page_proxy(request, path, *args, **kwargs):
file_path = '%s/%s' % (settings.PAGES_ROOT, path)
related_view = kwargs.pop('related_view')
if not default_storage.exists(file_path):
response = related_view(request, *args, **kwargs)
default_storage.save(file_path, ContentFile(response.content))
return response
else:
response_body = default_storage.open(file_path).read()
return HttpResponse(response_body)
这些都没啥问题,只是在模板层如果我想通过{% url 'detail_page' question.id %}来输出静态化的url时,因为第一个参数是path,而我又不想硬编码进去,有没有什么方案能解决这个问题的?