【问题标题】:Detect mobile browser (not just iPhone) in python view在 python 视图中检测移动浏览器(不仅仅是 iPhone)
【发布时间】:2011-01-20 05:46:25
【问题描述】:

我有一个用 Django 编写的 Web 应用程序,它有一个特定页面,我想为其实现模板的移动版本(以及稍微不同的逻辑)。我希望能够通过这个 sudo 代码来实现它:

def(myView)

  do some stuff

  if user-is-on-a-mobile-device:
     do some stuff
     return (my mobile template)

  else:
     do some stuff
     return (my normal template)

我没有太多时间,而且我的编码学习曲线还很早:) - 我发现了一个看起来非常强大的可插拔应用程序,称为Bloom,用于获取移动设备功能 - http://code.google.com/p/django-bloom/wiki/BloomDevice 然而,它似乎通过 JSON 发出请求以获取许多我不需要的设备规格,这对我来说似乎有点低效。

有没有人推荐更简单的方法?我的检测不需要100%,只需要iPhone、iPod、android、主流设备……

http_user_agent 字符串是否有某种我可以检查的移动标志?

【问题讨论】:

    标签: python django mobile user-agent


    【解决方案1】:

    更新:

    我刚刚发现:http://code.google.com/p/minidetector/

    这似乎完全符合我的要求,我现在要进行测试。随时告诉我我错了!

    【讨论】:

    • 感谢您分享这个发现。对我来说,这个中间件所做的似乎是一个比我用来实现类似目的的所有国产中间件更好的解决方案。
    • 该项目是最新的吗?自 2010 年 12 月以来,它没有出现任何变化。我使用的是 github.com/shelfworthy/minidetector,因为它是积极开发的。不幸的是,作者只是告诉我它不再受支持,他一直想删除那个 github 仓库,所以我正在寻找替代品。
    • 如果你检查网络中的 minidector,有几个分支不是那么陈旧 -- github.com/saschwarz/minidetector/network
    【解决方案2】:

    最佳实践:使用minidetector 将额外信息添加到请求中,然后使用 django 的内置请求上下文将其传递给您的模板,就像这样。

    from django.shortcuts import render_to_response
    from django.template import RequestContext
    
    def my_view_on_mobile_and_desktop(request)
        .....
        render_to_response('regular_template.html', 
                           {'my vars to template':vars}, 
                           context_instance=RequestContext(request))
    

    然后在您的模板中,您可以引入以下内容:

    <html>
      <head>
      {% block head %}
        <title>blah</title>
      {% if request.mobile %}
        <link rel="stylesheet" href="{{ MEDIA_URL }}/styles/base-mobile.css">
      {% else %}
        <link rel="stylesheet" href="{{ MEDIA_URL }}/styles/base-desktop.css">
      {% endif %}
      </head>
      <body>
        <div id="navigation">
          {% include "_navigation.html" %}
        </div>
        {% if not request.mobile %}
        <div id="sidebar">
          <p> sidebar content not fit for mobile </p>
        </div>
        {% endif %>
        <div id="content">
          <article>
            {% if not request.mobile %}
            <aside>
              <p> aside content </p>
            </aside>
            {% endif %}
            <p> article content </p>
          </aricle>
        </div>
      </body>
    </html>
    

    【讨论】:

    • 很多人都遵循这个约定,虽然我不喜欢它,因为它迫使开发人员拥有大量的 if 语句,而不仅仅是 1 个。你可以争辩说完全显示不同的模板不是 DRY,而是我认为将两者分开是值得的。
    【解决方案3】:

    选择名为 django-mobi 的 minidetecor 的分支,它包含有关如何使用它的文档。

    https://pypi.python.org/pypi/django-mobi

    【讨论】:

    • 这似乎是最好的解决方案。 “Fork 描述:我重新组织了代码,添加了缓存,并在这里和那里做了一些调整。”
    猜你喜欢
    • 2018-04-08
    • 1970-01-01
    • 2011-10-01
    • 2019-10-09
    • 2015-06-24
    • 1970-01-01
    • 1970-01-01
    • 2011-04-19
    • 2011-04-18
    相关资源
    最近更新 更多