Google App Engine - как разделить код на несколько файлов? (Веб-приложение)
У меня вопрос о разделении файла main.py.
прямо сейчас, у меня есть все в моей main.py. У меня нет других файлов .py. И мне всегда приходится прокручивать длинные строки кода, прежде чем перейти к разделу, которое я хочу отредактировать.
Как мне разделить его?
(у меня будет более 20 страниц, так что это означает, что main.py будет ОГРОМНЫМ, если я его не разделю.
PS: Кроме того, я заметил, что мне приходилось настраивать значения шаблона, путь к шаблону и call template.render каждый раз. Любой способ сократить их все?
код:
# everything here in main.py
class MainPage(webapp.RequestHandler):
def get(self):
# Models are queried here, results transferred to template_values
template_values = {
'value1': value1,
'value2': value2,
'value3': value3,
}
path = os.path.join(os.path.dirname(__file__), 'index.html')
self.response.out.write(template.render(path, template_values))
class Page2(webapp.RequestHandler):
def get(self):
# Models are queried here, results transferred to template_values
template_values = {
'value1': value1,
'value2': value2,
'value3': value3,
}
path = os.path.join(os.path.dirname(__file__), 'index.html')
self.response.out.write(template.render(path, template_values))
class Page3(webapp.RequestHandler):
def get(self):
# Models are queried here, results transferred to template_values
template_values = {
'value1': value1,
'value2': value2,
'value3': value3,
}
path = os.path.join(os.path.dirname(__file__), 'index.html')
self.response.out.write(template.render(path, template_values))
application = webapp.WSGIApplication(
[('/', MainPage),
('/page2', Page2)
('/page3', Page3)],
debug=True)
def main():
run_wsgi_app(application)
if __name__ == "__main__":
main()
Ответы
Ответ 1
Разделение кода не отличается от кода разделения для любого приложения Python - найдите кучу связанного кода, который вы хотите переместить в другой файл, переместите его в этот файл и импортируйте в файл основного обработчика.
Например, вы можете переместить код страницы на page2.py, поместите
import page2
в верхней части вашего файла и измените ваше сопоставление для загрузки /page2
из page2.Page2
(вы можете захотеть переименовать эти классы в этом случае...
В качестве альтернативы вы можете иметь отдельные файлы .py, обрабатывающие разные (группы) страниц, редактируя файл app.yaml
, как описано в Script Обработчики.
Вы можете обернуть свой код обработки шаблонов в удобной функции и вызвать его, чтобы немного уменьшить повторяющийся код. Вы можете оптимизировать загрузку значений шаблона, но как только вы хотите визуализировать, вы можете вызвать метод, похожий на
def render(template_file, template_values):
path = os.path.join(os.path.dirname(__file__), template_file)
self.response.out.write(template.render(path, template_values))
Это не большая экономия, но она немного читаема. Вероятно, вы хотите переместить render
в другой файл и import
там, где вы хотите.
Ответ 2
Определите свои классы в других .py файлах и используйте "import", чтобы использовать их в main.py. На самом деле это довольно просто.
Ответ 3
спасибо для ввода, действительно оцените их.
Что касается группировки импорта вместе, я попытался сохранить все импортируемые им приложения в файл .py с именем ext.py
Затем я назвал его где угодно, я хотел бы использовать его по этой строке:
from ext import *
ext.py содержит следующее:
import os
# import from appengine libs
from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app
from google.appengine.ext.webapp import template
from google.appengine.ext import db
# import models
from models import *