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 *