django url 中嵌套参数如何进行在模板层 reverse

2015-07-10 13:22:01 +08:00
 zenxds

先说下需求,我现在想实现动态页面静态化,但是又不想一开始就生成静态页,所以写了个代理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,而我又不想硬编码进去,有没有什么方案能解决这个问题的?

3609 次点击
所在节点    Python
4 条回复
lyhapple
2015-07-10 14:00:22 +08:00
你这样的做法, 即使生成了静态页, 也不是纯粹意义的静态页, 还是需要django作一次转换,仍然达不到高效,为什么不做成页面一发布就生成一个静态页, 让Nginx来处理静态页面请求。
haofly
2015-07-10 14:01:53 +08:00
把PATH弄成一个全局变量?
zenxds
2015-07-10 14:52:11 +08:00
@lyhapple nginx那一层后面也会做的,比如

if (!-e $request_filename) {
proxy_pass http://127.0.0.1:9000;
}

这里只是我拿来试验用的,我只是考虑,比如详情页静态化,一次全部生成太多页面太浪费
hwind
2015-07-10 15:21:52 +08:00
esponse = related_view(request, *args, **kwargs)--》你把path生成缓存的时候就传进去就可以了吧。没记错但话path的值就是正则表达式里question_id的值

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/204724

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX