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))



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

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

Войти через центр авторизации
Похожие вопросы