【问题标题】:Designing a Flask application with mobile in mind?考虑移动设备设计 Flask 应用程序?
【发布时间】:2014-08-26 02:32:58
【问题描述】:

我正在阅读有关 Flask 的信息。鉴于它与 Jinja2 和 WTF-forms 的紧密集成,当我开始编写我的网站的本地移动版本时会发生什么?我通常会编写一堆独立于前端工作的后端 API,然后使用 JS 编写前端代码。这样,如果我必须实现一个原生移动应用程序,我可以无缝地使用后端 API。使用 Flask(或其他框架)与模板引擎的紧密集成,我应该如何设计我的应用程序?

比如,我们以here为例,作者主张登录功能写成这样:

from flask import render_template, flash, redirect
from app import app
from forms import LoginForm

# index view function suppressed for brevity

@app.route('/login', methods = ['GET', 'POST'])
def login():
    form = LoginForm()
    if form.validate_on_submit():
        flash('Login requested for OpenID="' + form.openid.data + '", remember_me=' + str(form.remember_me.data))
        return redirect('/index')
    return render_template('login.html', 
        title = 'Sign In',
        form = form)

但是,当我构建原生 Android/iOS 应用程序时,我假设后端应该公开一堆 API 调用来验证输入并为您进行登录。并且鉴于移动设备与 Jinga2 或其他模板无关(因为一切都是本地实现的),所有这些代码在本地移动应用程序的上下文中都是无用的。这意味着,我将不得不重构“真实世界”的 Flask 代码以与移动应用程序兼容。是这种情况还是我错过了更高层次的观点?

我的具体问题是:我应该在 Flask 中遵循什么设计模式以确保我的网站对 Web 和移动设备友好?

【问题讨论】:

    标签: android python web flask


    【解决方案1】:

    我认为这里有两个问题:

    1. 编写一个对 Web 和移动设备友好的 Web 客户端
    2. 使用 Web 和移动组件设计应用程序

    问题 1 将涉及响应式网页设计,以对桌面网络浏览器和移动网络浏览器都友好的方式格式化网页。有一些 CSS 技术可以根据浏览器视口大小使用不同的样式表和模板。这将是不同的 jinja2 模板可以用于移动客户端和 Web 客户端的地方。或者有根据视口大小调整的“响应式设计”。

    问题 2 讲述了您如何构建服务和客户端。你可以像你说的那样做,并且拥有一个独立于任何前端的后端 API(可以是 Flask 应用程序,也可以不是。Flask-Classy 或 Flask-Restful 是帮助使用 Flask 开发 REST API 的 Flask 扩展)。然后,您可以编写一个使用后端 API 的本机移动应用程序。你可以编写一个也使用后端的 Flask Web 应用程序。移动应用程序和 Flask 应用程序之间不会有任何依赖关系。它们只是两个不同的客户端,都访问相同的后端 API。

    您链接到的示例是创建一个整体 Web 应用程序。如果这就是您要创建的内容,那么这是一个很好的教程。但是,如果您想要一组可供移动应用程序和网络客户端使用的服务,它就不会全部适用。

    【讨论】:

    • +1 谢谢。在这种情况下,是否意味着我不能再使用 Jinga2 并依赖客户端模板?另外,我很好奇 - 是否有任何关于将 OAuth 与 RESTful 设计集成的教程?
    • 如果你正在做一个纯原生的移动应用程序,那么不,Jinja2 可能对你没有多大用处。我并没有真正使用过 OAuth,所以我不知道。我相信谷歌会有链接供你阅读。
    【解决方案2】:

    嗯,我在我的应用程序中成功使用了一种粗略的方法来解决这个问题。因此,每次从 web 应用程序或 android 应用程序发出请求时,我都会在请求中添加一个名为“device”的字段,并将其值相应地设置为“web”或“android”。

    在前端:

        <form id="test" action="test" method="get">
            <input type="hidden" name="device" value="web"/>
            <input type="submit" value="Submit"/>
        </form>
    

    同样,我在我的 Android 应用程序中也这样做。

    现在在 Flask 服务器上,我读取该字段的值并相应地处理请求。

        @app.route('/test', methods=['GET'])
        def test():
            device = request.args.get('device')
    
            if device is "web":
                return render_template('test.html', data='Hello Word')
            else:
                # Return data to Android Application
                return json.dumps({'data':'Hello World'})
    

    我很确定一定有更好的方法来处理这个问题,但是这个方法非常好。希望对你有帮助:)

    【讨论】:

      【解决方案3】:

      @Bahul Jain 您可以使用以下代码获得它。不确定这是对还是错。但是您可以在 if 条件下检查平台。

      from user_agents import parse
      browser = request.user_agent.browser
      version = request.user_agent.version and int(request.user_agent.version.split('.')[0])
      platform = request.user_agent.platform
      uas = request.user_agent.string
      print('---browser-{}-----version---{}-'.format(browser, version))
      print('---platform-{}-------uas-{}---'.format(platform, version))
      

      【讨论】:

        猜你喜欢
        • 2013-07-19
        • 2011-06-20
        • 2010-10-23
        • 2014-08-23
        • 1970-01-01
        • 1970-01-01
        • 2017-09-17
        • 2023-03-21
        • 2023-03-15
        相关资源
        最近更新 更多