Login8
@Login8
Программист, критик, наватор

Что за странное кеширование в tornado python?

Столкнулся вчера с непонятным кешированием в tornado. Смотрите код ниже, в нем чтобы отобразить веб-страницу в формате html в браузере используется метод render, который "рендерит" html файл и он нормально отображается в браузере. Однако если я этот файл (при запущеном сервере tornado) открою еще в текстовом редакторе и изменю содержимое, потом сохраню и перезагружу страницу браузера, то почему-то изменений которые я внес в файл я не увижу. Увижу только если сервер tornado перезапущу, это ужасно. В коде есть поясняющие комментарии, обратите на них внимание

import re
import os
import tornado.ioloop
import tornado.web
import tornado.httputil
import traceback
import asyncio


class handler_index(tornado.web.RequestHandler):
	
	install_dir = ''

	def __init__(self, application : "Application", request : tornado.httputil.HTTPServerRequest, **kwargs : any) -> None:
		super().__init__(application, request, **kwargs)
		self.install_dir = re.sub(r'/[^/]+$', '', os.path.abspath(__file__).replace(u'\\', u'/'))
	
	async def get(self) -> None:
		
		try:
		
			self.render('index.html', test_variable = 'hehe')
			
			'''
			# если этот код раскомментировать а "self.render('index.html')" закомментировать 
			# то все работает как надо такого кеширования не происходит, если я вношу 
			# изменения в html файл и затем перезагружаю страницу браузера то все изменения 
			# тут же видны, замечательно, не нужно весь вервер tornano перезапускать. 
			# Однако этот код имеет недостаток, я немогу в шаблон передать какие то переменные.
			try:
				with open('index.html', 'r', encoding = 'utf-8') as f:
					self.write(f.read())
			except OSError as err:
				self.write(err)
			'''
			
		except Exception as err:
			self.write(traceback.format_exc().strip())
			
async def launch_tornado() -> None:

	http_server = tornado.httpserver.HTTPServer(tornado.web.Application([
		('/', handler_index)
	]))
	http_server.bind(80, '127.0.0.1')
	http_server.start()
	await asyncio.Event().wait()
	
if __name__ == '__main__':

	loop = asyncio.new_event_loop()
	tasks = [
		loop.create_task(launch_tornado()),
	]
	loop.run_until_complete(asyncio.wait(tasks))



Кто знает в чем дело?
  • Вопрос задан
  • 42 просмотра
Решения вопроса 1
sergey-gornostaev
@sergey-gornostaev Куратор тега Tornado
Седой и строгий
Это не ужасно, а как раз правильно. Во-первых, во взрослых проектах изменения сразу в прод не вносятся, только через новое развёртывание. Во-вторых, торнадо создавался чтобы быть очень быстрым, но он бы таковым не был, если бы при каждом запросе читал с диска файл шаблона, а потом рендерил его, поэтому результаты рендеринга кэшируются. Однако, при желании это можно отключить.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы