考虑到移动设计Flask应用程序?

时间:2014-07-04 18:53:06

标签: android python web flask

我正在阅读有关Flask的文章。鉴于它与Jinja2和WTF表格的紧密集成,当我开始编写我的网站的原生移动版本时会发生什么?我通常编写一堆独立于前端工作的后端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中遵循哪些设计模式,以确保我的网站对网络和移动设备友好?

3 个答案:

答案 0 :(得分:8)

我认为这里有两个问题:

  1. 编写适合网络和移动设备的网络客户端
  2. 使用网络和移动组件设计应用程序
  3. 问题1将涉及响应式网页设计,该网页设计以对桌面网络浏览器和移动网络浏览器友好的方式格式化网页。有些CSS技术可以根据浏览器视口大小使用不同的样式表和模板。这将是不同的jinja2模板可用于移动与Web客户端的地方。或者有“响应式设计”根据视口大小进行调整。

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

    您链接的示例是创建单一的Web应用程序。这是一个很好的教程,如果这是你想要创建的。但如果您想要一组可供移动应用程序和Web客户端使用的服务,则不会完全适用。

答案 1 :(得分: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'})

我很确定必须有一个更好的方法来解决这个问题,但是这个方法非常好。希望它有所帮助:)

答案 2 :(得分:0)

@Bahul Jain您可以使用以下代码来获取。不确定这是对还是错。但是您可以检查平台是否满足条件。

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))