关于Flask开发的一点习惯及平台开发总结

hxy    2018-11-19 20:51

        Flask 与Python的配合的简洁明了,给人一种麻雀虽小五脏俱全的感觉。在最初接触的那段时间,就非常看好它。之前接触过Django,ZendPHP, PHPCMS, DEDECMS, Qeephp(08年的产品,貌似已经不再维护了),等Web 框架,包括Spring MVC, Spring+Structs+Hibernate等一系列JeEE框架,总体来说,还是Flask用着体验最好。不排除一些框架的性能及功能完备,单论简单和一般的建站需求,还得说Flask是demo神器。

        Flask本着“微”(micro)的理念设计, 并不表示你需要把整个 Web 应用塞进单个 Python 文件(虽然确实可以 ),也不意味着 Flask 在功能上有所欠缺。微框架中的“微”意味着 Flask 旨在保持核心简单而易于扩展。Flask 不会替你做出太多决策——比如使用何种数据库。而那些 Flask 所选择的——比如使用何种模板引擎——则很容易替换。除此之外的一切都由可由你掌握。如此,Flask 可以与您珠联璧合。
        默认情况下,Flask 不包含数据库抽象层、表单验证,或是其它任何已有多种库可以胜任的功能。然而,Flask 支持用扩展来给应用添加这些功能,如同是 Flask 本身实现的一样。众多的扩展提供了数据库集成、表单验证、上传处理、各种各样的开放认证技术等功能。Flask 也许是“微小”的,但它已准备好在需求繁杂的生产环境中投入使用。
——http://docs.jinkan.org/docs/flask/foreword.html#id2

        Flask内容比较精简,不像SpringMVC, Struts等Java框架需要配置大量XML文件,只需要简单的几个页面和视图解析函数即可。例如:

from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello World!'

if __name__ == '__main__':
    app.run()

        在控制台输入命令后,打开浏览器访问 localhost:5000 即可看到效果。

$ python hello.py
 * Running on http://127.0.0.1:5000/

因此,Flask的开发非常节省精力,可以把时间集中在页面样式和后台处理上,下面说说我在开发中的一些习惯吧。

1 项目架构:

├─app
│  ├─admin
│  ├─user
│ ─ manage.py
│ ─ run.py
│ ─ config.py
│ ─ data.db

2 处理页面请求

        在后台Views.py视图函数与页面交互过程中,通常需要大量传参,比如

# 查看资料库
@app.route('/files')
def files():
    ...
    user=...
    return render_template('files.html', files=files, user=user, id=id)

        上述代码中渲染files.html需要files,user,id等参数,但实际上,我们可以通过下面的代码替代:

# 查看资料库
@app.route('/files')
def files():
    data={}
    data['files']=files
    data['user']=user
    data['id']=id
    return render_template('files.html', data)

        是不是简单了许多,这样做的好处是修改传参只需要添加data字典的Key-Value值,不需要改变渲染部分的结构,保证了代码的整洁。

==============以下内容于@2020-2-18 16:19:58补充====================

        不知不觉,平台已经运行了两年多了,功能不断完善,操作体验也在逐渐提升,页面访问速度也快了很多。对此做一下总结。顺便说说相关技术。首先,Flask 可以干什么?下面列举一些常用的功能需求及解决方案:

  • 分页显示:Flask 包括分页插件,可以通过后台分页配合前端显示。当然,也可以借助jquery.dataTable库实现。
  • 邮件支持:对于邮箱验证,找回密码等功能,网站自动发送邮件是必不可少的了。Flask-mail了解一下,可以使用qq、163等第三方邮箱,也可以使用自定义邮箱,配置也很简单,github有很多资料可以去看看。
  • 全文搜索:相比于 like 操作,Flask 支持建立索引,相关资料参考Whoosh库,外加jieba分词,对中文的支持还算友好。可以参考之前写过的一篇博客
  • 数据的增删改查:借助于Flask-sqlalchemy相关库的功能,可以通过Model.query.filter_by().all()类似语句查询,教程也比较多。
  • 数据迁移:在实际的迭代开发时,经常会更改数据model及对应的数据库配置,Flask提供了Migrate相关功能,可以修改完执行命令同步更新数据库结构。
  • 国际化:要想让网站支持中文、英文可能还好,但是支持多种语言总不至于每个版本都要重新写一遍页面和对应的文字。据了解,某些高校的网站就是中文的功能较全面,而英文的完全是另外一个网站,内容、风格完全变了。当然,可能对应特定的业务功能是好的,但是与想象中的国际化还是不一样。某些大公司的官网支持语言切换选项,也有的可以根据IP地址更换语言,如果要想很快捷的切换语言,Flask-balel支持这个功能,并且还不算复杂。
        关于常用功能的介绍也就差不多了。下面罗列一下开发时遇到的技术问题及解决办法:
  • 富文本编辑器:文本编辑器有很多种,有收费的,有免费的,以开源的Ckeditor来说,和Flask配合也很融洽,刚入手可能比较麻烦,最大的坑就是插件名称与工具栏配置,多翻翻博客还是有很多资料可寻的。
  • 前端路由:可能是最近些年流行的技术,前段时间的wuhan2020项目用的貌似是node-js配置的前端路由,效果还可以,但是毕竟要前后端分离,有些数据交接我还木有搞清楚,就不扯了。但是,Flask 结合VUE框架加载数据异步更新效果还可以。
  • 数据可视化:借助于Python在数据处理的强大优势,使用Flask做网络数据可视化还这是方便。可以参考数据实验室的功能。后台使用Python处理数据,转为json给前台渲染页面。
  • 照片瀑布流:这个有成型的代码可以参考,基本原理就是一套js库,在给定元素封装图片及放大后效果的。参考网站的相册相关功能。
  • 更换头像:这个方法比较多样,早期有基于flash做的,随着flash与Chrome的微妙关系,目前也比较少了,但是好多论坛(如某维空间)还是用的这个插件。平台用的插件很简单,不借助第三方工具,依靠几个js库即可,原理是选择照片,裁切预览,将预览图保存为服务器端图片,然后将图像的地址存入数据库中头像字段。
  • 代码高亮显示:这个有特定的库,可以参考ckeditor的插件商店。
  • 公式显示:刚开始做博客的时候,没考虑要显示公式,但是专业的博客网站怎么可以不支持公式呢,Katex是一款很好的插件,好在不用第三方解析,自带的库可以完全本地化,不用看别人CDN服务器的脸色行事。
  • 字体icon:字体图标就像一种通用语言,以一种包含美感及巨大信息量存形式存在着,用起来也非常方便,可以参考的字体网站如 fa fas la系列等等。
  • Markdown:这个在Github上比较流行,打开一个仓库,都会有一个说明,这点目前有showdown.js实现了其中一部分功能,例如代码、加粗、斜体、标题、链接等都有支持,但是对于好多其他功能还有进步空间。平台试着支持了Markdown,但是对本身的富文本编辑器冲突,因此,以我目前的认知来看,不建议合并使用,貌似某sdn博客平台也是分离二选一使用的。
  • Flash + vue 不刷新加载更多:不依赖于刷新页面的翻页效果对用户体验非常重要。之前,早期的 NEUSNCP 没有实现这个效果,葱哥 @hancong 建议使用一些前端路由框架,比如 angularJS, React之类的,我大致搜了一下,感觉还是 vue 比较简单,于是就在开始尝试替换一些功能。最先修改的是首页的说说功能,页面加载完成后执行 vue, 使用ajax方法请求获得后台的说说数据,然后加载到页面中。页面下端加一个翻页按钮组,对于初次尝试这种加载方式来说已经很好了,但是看看微博、空间、朋友圈等主流翻页效果,都是直接下拉自动加载,于是再次修改。这次使用了vue的无限滚动,定义好页面距离屏幕底端距离,然后翻页加载,加载的内容不是原来的替换了,而是append 上去的,这样的写法在早期我是不敢尝试的,应为对于说说和点赞功能,点一下很麻烦的,需要记录很多值。后来才发现,用页面的索引顺序就可以完成,索性就改了。随着代码写得多了,我意识到不论是说说还是博客,都应该有一个模型,模型应该包括以下几个功能:
    • 无限滚动翻页
    • 点赞、鄙视、访问量,数字格式化(Kb, Mb, Gb),时间格式化
    • 二级评论,评论的点赞,鄙视,访问量
    • 内容标签话,内容分类

        在维护上,Flask可以配置修改立即更新,不需要重载,页面的修改不需要重载,Python文件的修改自动重载,测试也很方便。本以为3个月做了一个平台很快,但是Bug还是真多,维护+功能迭代更新+操作体验优化总是需要经验积累的,在这里随便写点做个记录,不定期更新中。也希望能给需要的小伙伴带来帮助,少走弯路。


 

 

Last Modified: 2020-02-28 13:28
Views: 1.8K

[[total]] comments

Post your comment
  1. [[item.time]]
    [[item.user.username]] [[item.floor]]Floor
  2. Click to load more...
  3. Post your comment