考虑移动端开发Flask应用吗?

8 投票
3 回答
14739 浏览
提问于 2025-04-18 12:09

我正在学习Flask。由于它和Jinja2以及WTF-forms的紧密结合,当我开始为我的网站写一个原生移动版本时,会发生什么呢?我通常会写一堆后端API,这些API和前端是独立的,然后用JavaScript来编写前端。这样,如果我需要实现一个原生移动应用,我就可以无缝地使用这些后端API。考虑到Flask(或者其他框架)和模板引擎的紧密结合,我应该如何设计我的应用呢?

举个例子,来自这里的例子,作者建议登录功能应该这样写:

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调用来验证输入并完成登录。而且考虑到移动端和Jinja2或其他模板引擎无关(因为一切都是原生实现的),在原生移动应用的上下文中,这些代码都是没用的。这意味着,我需要重构“真实世界”的Flask代码,以便与移动应用兼容。这是这样吗,还是我错过了更高层次的要点?

我具体想问的是:在Flask中我应该遵循什么设计模式,以确保我的网站既适合网页又适合移动端?

3 个回答

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

其实有一种简单的方法可以解决这个问题,我在我的应用中成功使用过。每次从网页应用或安卓应用发出请求时,我都会在请求中添加一个叫“device”的字段,并根据情况将它的值设置为“web”或“android”。

在前端:

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

我在我的安卓应用中也是这样做的。

然后在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'})

我相信一定有更好的方法来处理这个问题,但这个方法运行得很好。希望对你有帮助 :)

8

我觉得这里有两个问题:

  1. 写一个既适合网页又适合手机的客户端
  2. 设计一个包含网页和手机组件的应用

第一个问题涉及到响应式网页设计,也就是让网页在桌面浏览器和手机浏览器上都能友好显示。可以使用一些CSS技巧,根据浏览器的窗口大小来使用不同的样式表和模板。这就可以用不同的jinja2模板来区分手机和网页客户端。或者使用“响应式设计”,根据窗口大小自动调整布局。

第二个问题是关于你如何架构你的服务和客户端。你可以像你说的那样,创建一个独立于前端的后端API(可以是Flask应用,也可以不是。Flask-Classy或Flask-Restful是一些帮助用Flask开发REST API的扩展)。然后你可以编写一个使用这个后端API的原生手机应用。同时,你也可以编写一个同样使用这个后端的Flask网页应用。这样,手机应用和Flask应用之间就没有依赖关系。它们只是两个不同的客户端,都可以访问同一个后端API。

你提到的例子是在创建一个单体网页应用。如果你想做这个,那是个很好的教程。但如果你想要一套可以被手机应用和网页客户端共同使用的服务,这个教程就不完全适用了。

撰写回答