flask 设计 API

2014-06-14 14:58:56 +08:00
 jxwho
在flask中,一般都是这样:

@app.route('/logIn')
def logIn():
...
return render_template('...')


假如我在移动端访问这个路径,那就会返回 render 出来的东西,那应该怎么设计才能更好地把这两者分开, 使得web跟mobile都可以用?
5931 次点击
所在节点    Python
19 条回复
hepochen
2014-06-14 15:08:48 +08:00
headers判断
moroumo
2014-06-14 15:14:31 +08:00
应该用响应式设计去处理页面。
不过看你的想法不同的UA redern不同的template。
http://stackoverflow.com/questions/9878020/how-do-i-get-the-user-agent-with-flask
jxwho
2014-06-14 15:17:27 +08:00
@moroumo 我表达得好像不是很清楚,在手机端的话就是只是通过这些API来获取数据或者做判断,不需要返回html.
hepochen
2014-06-14 15:20:27 +08:00
@jxwho 仔细看别人的建议,包括后半句
yelite
2014-06-14 15:22:04 +08:00
判断 header,移动端只是要获取数据的话就设置 request 的 header
Accept: application/json
yangzh
2014-06-14 15:32:52 +08:00
@jxwho

要不就用 header 判断,if else 返回不同的东西。

要不就用一个新路由
@app.route('/api/logIn')
def api_logIn(): reurn jsonify('...')


我个人觉得加多一个新路由更加好吧。
tokki
2014-06-14 16:34:42 +08:00
重新写个函数类似
render(tpl):
tokki
2014-06-14 16:39:06 +08:00
render(tpl):
if mobile:
return render_template("mobile/“+tpl)
else
return render_template(tpl)
Livid
2014-06-14 16:43:25 +08:00
V2EX 在 Tornado 里用的也是类似 8 楼 @tokki 这样的解决方案。

并且,还加入了对 mobile tpl 是否存在的判断,如果不存在的话,那就还是渲染桌面版。
billlee
2014-06-14 16:57:07 +08:00
功能不同的接口就不要用同一个名称,把 API 放到 /api/login
ccbikai
2014-06-14 18:01:08 +08:00
要做API就做API,要做网页就做网页,不要搞到一个路由里。

判断移动端,就处理一下UA,判断UA是否是移动设备
if mobile:
return "mobiile"
else:
return "desktop"
jxwho
2014-06-14 19:05:49 +08:00
@moroumo
@hepochen
@yelite
@yangzh
@tokki
@Livid
@billlee
@ccbikai
感谢各位大大!
cbsw
2014-06-14 20:42:05 +08:00
这样的需求是不是应该考虑 RESTful,而且有 http://flask-restful.readthedocs.org/en/latest/ 这个现成的库可以用
jxwho
2014-06-14 20:47:15 +08:00
@cbsw 对的,我想过restful,但是,,,是不是这样就要做两次请求?
cbsw
2014-06-14 20:51:08 +08:00
@jxwho 一套统一的 API,然后不同的应用有各自的渲染方案,直接通过 url 对数据进行操作。不知你说的两次请求是什么意思
jxwho
2014-06-14 20:53:36 +08:00
@cbsw 比如说,我有一个post资源,
然后 index 页面要展示这些 post 的话,是不是用户访问 /index,然后处理函数再请求post的get?
然后 如果 mobile的话,可以直接 /post/get 这样?
cbsw
2014-06-14 21:09:28 +08:00
@jxwho web 端用 restful 的话,大部分操作都要通过异步 ajax 实现,应用可以直接是一个静态页面,具体可以参考 https://github.com/miguelgrinberg/REST-tutorial ,另外玩 flask 可以关注一下 miguelgrinberg 这个人,博客(http://blog.miguelgrinberg.com/)里有很多非常好的 tutorial
jxwho
2014-06-14 22:35:48 +08:00
@cbsw soga, thank you!
zjnjxufe
2014-07-16 16:51:32 +08:00
if request.user_agent.platform in ('android', 'iphone'):
return xxx

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/117480

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX