考虑移动端开发Flask应用吗?
我正在学习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 个回答
@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))
其实有一种简单的方法可以解决这个问题,我在我的应用中成功使用过。每次从网页应用或安卓应用发出请求时,我都会在请求中添加一个叫“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'})
我相信一定有更好的方法来处理这个问题,但这个方法运行得很好。希望对你有帮助 :)
我觉得这里有两个问题:
- 写一个既适合网页又适合手机的客户端
- 设计一个包含网页和手机组件的应用
第一个问题涉及到响应式网页设计,也就是让网页在桌面浏览器和手机浏览器上都能友好显示。可以使用一些CSS技巧,根据浏览器的窗口大小来使用不同的样式表和模板。这就可以用不同的jinja2模板来区分手机和网页客户端。或者使用“响应式设计”,根据窗口大小自动调整布局。
第二个问题是关于你如何架构你的服务和客户端。你可以像你说的那样,创建一个独立于前端的后端API(可以是Flask应用,也可以不是。Flask-Classy或Flask-Restful是一些帮助用Flask开发REST API的扩展)。然后你可以编写一个使用这个后端API的原生手机应用。同时,你也可以编写一个同样使用这个后端的Flask网页应用。这样,手机应用和Flask应用之间就没有依赖关系。它们只是两个不同的客户端,都可以访问同一个后端API。
你提到的例子是在创建一个单体网页应用。如果你想做这个,那是个很好的教程。但如果你想要一套可以被手机应用和网页客户端共同使用的服务,这个教程就不完全适用了。