星光

用Flask做了一个简易(lou)的留言板

前前后后,偶尔做一点,学一点,居然拖了这么久才完成,我自己也汗颜了

 

话不多说,上下效果图


 

项目地址在此: https://github.com/starlightme/My-Solutions-For-Show-Me-the-Code

值得一提的是在写这篇文章时我又发现了一个Bug,就是按照我之前的写法(最前面注释掉的),会出现如下的情况

 

就是已经有过了留言还是会显示Flash信息,可以说是中间状态吧

因为我当时觉得Flash显示的话一次请求结束后,第二次应该就会重置了,就像出现Flash信息后,你直接刷新下页面,就不会再有提示了那样,所以不假思索地写在了最前面

但是后来发现在提交表单-重定向显示的 post-get请求中,Flash信息在第二次get请求中依旧显示了出来

因为我也没有系统的学习(谁会“系统学习框架啊,喂)和相关网络的足够知识吧,所以觉得是Flash本身优化得比较好,考虑到了这种情况,就算两次请求也会显示出来

后来想了下,关键还在return redirect(url_for(‘index’)) 这句话,这句话表明这次请求并没有渲染页面,而是进行了一个重定向,而Flash信息是在Template模板中进行显示的,所以关键语句是render_template(),借助这个函数的效果Flash信息才能在渲染模板的同时得以显示,而再次渲染时就不会再显示了,我是这么猜想的,以后有机会再去求证吧

之于为啥写到了后面这个问题就不存在了,也就很容易解释了,表单提交的那次post请求,语句从前往后执行,当时的表单数据并没有写入数据库,所以Flash语句被执行。而放到后面,进行判断时,数据已经在数据库里面了,这样也就消除了这个中间状态。无论何时,消除中间状态都是非常重要的。(暑假基本自我感觉做得算有技术含量的就是消抖了)


 

大概就这样,下一步就是完成To-do-list了,希望不会再拖太久

分析下弄了这么久的几点原因:

  • 总想系统地学习框架,很多地方感觉很神奇的,都想弄明白,然而这并不科学,在学习的初期更是费力不讨好,这个道理还是我学会用寄存器和库函数进行单片机编程后才打开心结的
  • 面向对象思想的缺乏,我现在才知道难怪老是说面向对象,面向对象了,这并不是玄学,因为专业科目基本完全不涉及面向对象,很多时候我连用都不会用
  • 在捉摸前端方面花了太多时间,要完整地自己手写前端,需要html,css,js的知识,我此刻只想说…..并没有那么多时间和条件去学这个,就好比另一个世界的背单词,所以以后Bootstrap走起,能写出来总比窝心里强很多,就像我这个列表的实现,估计很多写前端朋友会看笑死,但是也算是一种随机应变吧
  • 比较忌讳借助别人的源代码,想全部自己手敲。增删减改,至理名言。先熟悉了再谈创新,感谢《Flask Web开发一书》和作者的flasky源码

当然感觉还是比较喜欢一个脚本搞定,各种不想分开优化,外加生产环境迁移,因为也还是做着玩玩,一时半会也用不上,但是还是考虑多一些,走出自己的舒适圈更好吧,不然可能就真的一点用也没有了。

如无特殊声明,欢迎转载,但是请注明来自星之所在《用Flask做了一个简易(lou)的留言板》

评论

  1. eric #1

    不错 加油! WEB 是个美好的世界 天生跨平台

    Flask 的 message 是在 session 里,每次都会读取所有未显示过的 flash。 比如你一个地方 flash 了而没有显示,下次读取的时候会一并显示。

    在你这里面,第一次访问的时候,有一个 flash 并且显示了,第二次访问(也就是提交表格POST那一次),也会有这个 flash,存到数据库之后这个 flash 还在,在 redirect 后的 render_template 时才会显示出来。 如果想写清楚点,建议把 GET 和 POST 在一个 view 函数里面分成两个 block 就不会有这些问题。 这个问题的根本在于,你的函数先把 request 当GET 处理,处理到中间,发现是 POST。

    回复
    2015-10-11
  2. 正儿八经是小可 #2

    NICE,下一步开搞MVC,框架

    回复
    2015-12-6
    • Starlight

      你说的一点不错~~不过Flask貌似本身就可以比较轻量的实现,嘛,这学期结束前我能Flask Web这本书刷完就非常非常开心了

      回复
      2015-12-8