先骂人。不止一次的在网上看到“别跟傻逼式的用拼音做变量名称”。说这话的人就没发觉自己连狗都不如么?居然活成了比外国人更爱外国的人,赶紧滚出去吧。


 

最近无聊,在琢磨flask,一些小技巧和思路记录下来备忘。

我们以wordpress为例,来看看开发者眼中的网站是什么样。

做个抽象的话,大多数网站,其功能都是数据展示,(这里不扯没页面的api类web“网站”或者单放文件下载的节点,我觉得这种并不算网站-_-! )展示的类型是分类和内容页,比如首页、分类页、搜索列表、标签、专题,甚至站点地图也都是分类页;而内容页就好比博客内容、新闻页面、视频页等。

我试着边学边做一个代替这个博客程序的python站点,当然主要因为模板问题么,最终大概率并不会进行替换,但是熟悉一下也是好的。研究了几天下来,我反而很好奇为什么wp可以这么臃肿,我只用2行代码就实现了所有wp列表数据相类似的功能:

####   返回某分类的新闻列表对象,可以排除某个id,可用于新闻页的分类列表
####   如果列表名为空,则返回所有分类
def NewsList(listname,perpagecount=cfg.catalistperpage,pgno=1,paichu=0):
    if listname=="":
        return articles.query.filter(articles.id != paichu).order_by(articles.id.desc()).paginate(page=pgno, per_page=perpagecount, error_out=False)
    else:
        return articles.query.filter(and_(articles.id != paichu,articles.catalog==listname)).order_by(articles.id.desc()).paginate(page=pgno, per_page=perpagecount)

对flask-sqlalchemy熟悉的话,可能有办法做到一行就可以,我不太熟。

4个参数,第一个是分类名,多数时候应该用分类id,我这的测试数据没有单做分类表,所以这里是字符串

第二个是每页数量

第三个是第几页

最后一个是排除的id,比如在某个内容页要展示本类新闻的话,应该把当下这个新闻排除掉。因为数据表的自增id是从1开始的,所以这个参数默认给0,就不影响其他情况的正常使用。

这样的话,wordpress或者新闻站的所有分类形式都包括在内,但这里没有搜索,明天试一下把搜索合并进来,估计用类似的searchstr=""参数就可以,因为我试过这样的sql语句是可行的:

select * from articles where content like '%%'

当然,做这样一个like,效率肯定差很多,但字符串模糊搜索本身就慢么。。。

虽然这里用了数据映射,但就算不用,也没几行代码,肯定不超过100行。

 

然后路由注册方面的小技巧:

################   首页
@app.route("/" , defaults={'pgno':1})
@app.route("/<int:pgno>")
@app.route("/<int:pgno>/")
def xxx(pgno):
###   分类页
@app.route("/Catalog/<string:listname>"  , defaults={'pgno':1})
@app.route("/Catalog/<string:listname>/" , defaults={'pgno':1})
@app.route("/Catalog/<string:listname>/<int:pgno>")
@app.route("/Catalog/<string:listname>/<int:pgno>/")
def vvv(listname,pgno):

wp的首页其实就是个分类列表,我们经常遇到的首页以及分类url有这几种情况:

https://www.tingtao.org/分类名
https://www.tingtao.org/分类名/
https://www.tingtao.org/分类名/234

因为分类的页码是不一定存在的,所以应该默认视为1,可以用上面的路由注册方式,给一个默认参数进去,这样就不用分成有页码和没页码两种情况处理了。

 

关于提交数据的安全性,比如sql注入什么的,在路由注册的时候把数据类型指定就好了,非法提交的话会直接返回错误页面,自己捕获一下就可以了:

@app.errorhandler(500)  # 传入要处理的错误代码
@app.errorhandler(404)
def error404(e):  # 接受异常对象作为参数
    return render_template('404.html',pagetitle="听涛 - 错误提示")  #, 404  # 返回模板和状态码

flask应该是参数化提交了,所以注入问题不存在。我自己试过了 -_-!

捕获错误只需要这样注册对应的错误码就可以了,而中英文网上流传的其他步骤估计是老版本了,照做的话根本编译不通过。

 

 

关于缓存,早些年玩php的时候有个习惯,现在python还没做。

当站点数据产生变化,比如数据变动、评论这类情况的时候,在文件或者数据库里做一个时间标记。根据这个标记来决定是直接使用以前的数据缓存(直接生成html文件也可以),还是重新从数据库构成数据并更新缓存。其实wordpress那几个缓存插件都是这么个思路,道理上来说,也不会有更好的思路了

 

 

边玩边写,后续再更新

作者 听涛

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注