Python 缓存还是别的什么?页面未使用Flask/nginx更新
我已经建立了一个使用Flask、nginx和uWSGI的网站 该网站需要始终显示最新的信息。我一直在通过改变我网站的主题来测试这一点。我将十六进制值存储在一个JSON文件中,然后在第一次调用我的app.py时检索该值,从而实现了这个主题。每当他们保存配置时,我更新全局主题颜色变量。然后我将主题颜色传递到每个渲染模板中,在HTML中我有一个样式标记,其中包含如下内容Python 缓存还是别的什么?页面未使用Flask/nginx更新,python,nginx,flask,uwsgi,Python,Nginx,Flask,Uwsgi,我已经建立了一个使用Flask、nginx和uWSGI的网站 该网站需要始终显示最新的信息。我一直在通过改变我网站的主题来测试这一点。我将十六进制值存储在一个JSON文件中,然后在第一次调用我的app.py时检索该值,从而实现了这个主题。每当他们保存配置时,我更新全局主题颜色变量。然后我将主题颜色传递到每个渲染模板中,在HTML中我有一个样式标记,其中包含如下内容 h1 { color: {{ theme_colour }} } 我的问题是,当我更新主题时,它应该立即更改所有页面,但它
h1 {
color: {{ theme_colour }}
}
我的问题是,当我更新主题时,它应该立即更改所有页面,但它不会。当我在配置页面上更新它时,它会自动重新加载页面,并且更改在那里生效,但是当我导航到另一个页面时,它使用的是旧颜色。有时刷新页面会修复它,但是在页面之间随机切换通常会导致它由于某种原因切换回原来的颜色。清除缓存并刷新它将修复该页上的缓存,但导航到另一页并返回时,它通常会切换回旧颜色
我搞不懂这是怎么回事。在我正确托管网站之前,我没有任何关于主题的问题(之前它只是在dev服务器上)。我试图消除这样的缓存,但显然不起作用:
server {
listen 80 default_server;
server_name mydomain.com www.mydomain.com;
location / {
include uwsgi_params;
uwsgi_pass unix:/home/ubuntu/test/test.sock;
# kill cache
sendfile off;
add_header Last-Modified $date_gmt;
add_header Cache-Control 'no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0';
if_modified_since off;
expires off;
etag off;
proxy_no_cache 1;
proxy_cache_bypass 1;
}
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl default_server; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/mydomain.com/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/mydomain.com/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot#
server_name mydomain.com www.mydomain.com;
location / {
include uwsgi_params;
uwsgi_pass unix:/home/ubuntu/test/test.sock;
# kill cache
sendfile off;
add_header Last-Modified $date_gmt;
add_header Cache-Control 'no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0';
if_modified_since off;
expires off;
etag off;
proxy_no_cache 1;
proxy_cache_bypass 1;
}
}
每当我发送GET请求时,它都会说响应头包含缓存控制:无存储、无缓存、必须重新验证、代理重新验证、最大年龄=0
,因此我不确定这是否是问题所在
以下是我所有的主题颜色代码:
@app.route("/index")
def load_index():
if check_logged_in(session, 0): # if user is logged in, doesn't require elevated privileges
return render_template("index.html", theme_colour=theme_colour) # logged in
else:
return redirect("/login") # not logged in
@app.route("/config", methods=["POST", "GET"])
def load_config():
if check_logged_in(session, 2): # if user is logged in, does require elevated privileges
if request.method == "POST": # if user clicks update button
global theme_colour # make theme colour accessible to all pages
config = list(request.form.values()) # get input box values
save_config(config) # save values to json
theme_colour = update_theme() # find theme colour and update global variable
return render_template("config.html", theme_colour=theme_colour)
else:
return abort(403) # forbidden if not logged in
def update_theme(): # get current theme colour
with open("config.json", "r") as json_file:
data = json.load(json_file)
theme_colour = data["colour"]
return theme_colour
theme_colour = update_theme()
我觉得我错过了一些东西。有人有什么想法吗
谢谢。啊,是的,继续关注@supershot在评论中说的话:在大多数web服务器环境中,您无法可靠地使用globals。大多数情况下,您将有多个进程为请求提供服务(或者至少有一个进程可能随时死亡并重生),并且这些进程之间不会共享全局变量 要在请求之间可靠地共享状态,您需要使用一些外部存储器(除非您可以将状态存储在
会话中
——在这种情况下,它不会在不同的客户端之间共享)
我会建议你去做这件事,但还有其他选择,比如
- 文件系统(作为平面文件(例如
)或/tmp/myapp/theme.txt
或类似文件)搁置
- 另一个缓存服务器,如Memcache
- 数据库(SQLite、其他一些SQL、其他一些)
- uWSGI的缓存子系统(尽管它显然只是uWSGI)
- uWSGI的SharedArea子系统(级别非常低,不推荐使用,但确实存在)
不管怎样,我很有信心你可以摆脱Nginx中所有的缓存配置——Nginx不会自己缓存东西,除非告诉你(通过它的配置,或者可能通过你的应用程序发送的标题)。我将它设置为在每次页面加载时调用函数,即
返回render\u模板(“config.html”),theme\u color=update\u theme())
。这是效率较低,但适合我的需要
我还能够删除所有缓存配置,因为这似乎不是必需的,谢谢@AKX。您描述的堆栈首先不应该进行任何缓存,除非明确指示这样做。你能给我们看一下完整的Nginx、uWSGI和Flask应用程序配置吗?@AKX对不起,我昨天刚设置好,我还在计算,你的确切意思是什么文件?实际上是完整的Nginx配置(不仅仅是服务器块)、uWSGI配置文件/命令行,然而,您在Flask中设置
应用程序
对象。在/config
路由中,您通过调用更新主题()
创建一个局部变量主题颜色
,而在/index
路由中,您依赖全局主题颜色
变量(我假设您在其他路由中也依赖于全局变量)。众所周知,全局变量不能很好地处理多进程web服务器。如果您在每个路由中调用update\u theme
,而不是使用全局变量,它能解决问题吗?@supershot多线程web服务器,它们可以使用多进程(大多数Python应用程序服务器都是这样的)是另一回事。我想我可能会坚持在每次页面加载时调用该函数,但谢谢。这不是一个大型项目,所以我认为这不会是一个问题。而且我已经删除了缓存配置,它似乎仍在工作,谢谢。