【问题标题】:Accelerated mobile pages in django?django中的加速移动页面?
【发布时间】:2016-01-29 18:30:34
【问题描述】:

是否有任何 Django 开发人员致力于构建 AMP-HTML 页面?

(供参考:Google AMP-project

如果我理解正确的话,AMP-HTML 的工作方式是为每个页面创建 2 个单独的文件。正常的 HTML 结果,加上一个新的 AMP-HTML 文件。 AMP-HTML 文件是普通 HTML 页面的精简版,Google 使用它来返回加速移动页面(因此得名“加速移动页面”)。然后,这些文件中的每一个都在头部的标签中相互引用,这告诉 Google 将 AMP 文件用于移动搜索结果。

在 Django 框架中,我想知道如何根据同一组内容创建 2 个单独的文件。

如何使用可以传递给两个 HTML 结果的单个上下文?一个结果是普通的 HTML 页面,另一个是 AMP-HTML 页面。

在 Django 中,必须为要返回的每个页面创建一个 URL。如何为每个现有 URL 自动生成第二个 URL?此外,如何为每个 URL 调用一个上下文?

也许可以在视图中完成?比如,返回一个 .html 扩展名,即 AMP 页面,然后还为 URL 渲染模板?

我还没有关于如何解决这个问题的任何答案。寻找反馈和建议。看来这是在 Django 和 AMP-HTML 上发布到 stackoverflow 的第一个问题。它可能不会是最后一个。

【问题讨论】:

  • 也许您可以使用中间件来检测要使用的模板,我需要检查 amp-html 项目以了解它应该如何工作,

标签: django amp-html accelerated-mobile-page


【解决方案1】:

我是 django AMP 开发人员,但绝对不是专家,我们使用以下 url 模式

url(r'^api/news/', include('news.api_urls'), {"type", "regular"}), # regular

url(r'^api/amp/news/', include('news.api_urls'), {"type": "amp"}), # AMP

在生成要传递给模板的不同上下文的视图中,模板中的规范相互指向并且似乎可以工作

【讨论】:

  • 你不能只使用一个url,如:url(r'^api/(:?(?P<type>amp)/)?news/,视图将有一个type='regular'关键字参数,这样当正则表达式匹配type组时,你最终会传递type='amp',当它不匹配时,视图将获得type='regular'
  • @Bakuriu 这似乎是一种更有效的方式,感谢您的建议
【解决方案2】:

在视图中,您可以通过多种不同方式设置模板变量,例如在 GET 查询参数中:

if request.GET.get('amp', 0) == 1:
    template_name = "amp.html"
else:
    template_name = "regular.html"

您可以将template_name 作为变量传递到上下文中,然后您可以在渲染页面时使用它:

{% extends template_name %}

这将允许您使用相同的视图代码/url/上下文呈现两个完全不同的布局。

【讨论】:

    【解决方案3】:

    我为此创建了应用程序https://github.com/shtalinberg/django-amp-tools

    {% load amp_tags %} 在模板中

    {% amp_canonical_link request %} 在元中

    并在模板中创建“amp”文件夹

    这是第一个版本。将添加更多文档和未来

    【讨论】:

      【解决方案4】:

      为了改进第一个答案,我提供了一个更详细的示例。

      project/urls.py

      url(r'', include('app.urls'), {"type": "regular"}),
      url(r'^amp/', include('app.urls'), {"type": "amp"}),
      

      app/urls.py

      url(r'^home/$', views.home),    
      

      views.py

      def home(request,type):
          if(type=='amp'):
              return render(request, 'app/amp/page.html', {}) 
          else:
              return render(request, 'app/page.html', {}) 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多