Flask作为一个主流的Python Web框架之一,有比较广泛的应用,但是有经验的小伙伴可能知道,这里边其实也有很多坑,让你不得不防,在使用的过程中可以积累一些经验。
1.Flask中的Referer不是referer
做过爬虫的小伙伴都知道,referer是指页面的跳转,即从哪一个页面跳转到当前页,很多网站也通过该属性对爬虫采取了一定的限制。在Flask中也有referer这个概念,意义也相同,但是写法就变了,变成了referrer,你可得注意啦,多了一个r!!!
2.为视图访问增加计时器
有的时候,我们会有这种需求,在网页中显示该网页的访问数量,此时就需要增加计时器,但是一般的计时器会存在一些问题: (1)WSGI服务器会将Flask服务生成多个进程,每个进程都有自己的独立副本,重复的请求会由不同的进程处理,从而产生不同步的值; (2) 假如Flask服务异常终止,计数就会清零。
此时可以按照如下方法解决: (1)multiprocessing模块; (2)保存到数据库中。
第一种方式原理为:
使用Python自带库multiprocessing.Value
,只要在创建值后生成进程,就可以跨进程同步对共享值的访问,如下:
from flask import Flask, jsonify
from multiprocessing import Value
counter = Value('i', 0)
app = Flask(__name__)
@app.route('/')
def index():
with counter.get_lock():
counter.value += 1
return jsonify(count=counter.value)
app.run(processes=8)
此时可以实现同步计时,但是如果应用程序进程分布在多台计算机上,则共享内存也会存在问题:它们仅在本地计算机上同步,而不是在网络上同步。
最可靠的还是直接将计数保存到数据库,对于访问路由对应的对象模型增加一个字段,每访问一次就操作数据库,对该字段加一,这样就不存在上面的问题了。
本文原文首发来自博客专栏Python Web开发实战,由本人转发至https://www.helloworld.net/p/yMwhnOUXVCjm,其他平台均属侵权,可点击https://blog.csdn.net/CUFEECR/article/details/106955224查看原文,也可点击https://blog.csdn.net/CUFEECR浏览更多优质原创内容。