Каковы некоторые лучшие практики для структурирования cherrypy приложения?

Я пишу cherrypy приложение, и я задавался вопросом, что лучший способ для структурирования моих обработчиков и кода для объемных приложений?

Я понимаю, что присвоение является простой канавкой cherrypy.root, но каковы некоторые методы для записи обработчиков и присвоения их?

(Позвольте мне доказывать свой беспорядок!) Моя начальная буква думала, должен записать стандартный класс обработчика, который выводит шаблон для выполнения на основе текущего URL или комбинации класса/метода. Затем я присвоил бы один экземпляр того обработчика многократно к пути для создания страниц. Я не вижу эту работу однако, поскольку рекурсивные ссылки не работали бы совершенно верно.

Так, учитывая тот факт, что я уже натягиваю пробелы, как мой собственный исходный код должен посмотреть, я любил бы некоторые указатели и примеры!

Не стесняйтесь задавать некоторые подробные вопросы для меня для разъяснения. В то время как существует много cherrypy учебного материала там, он имеет тенденцию только царапать поверхность.

5
задан Randy supports Monica 18 April 2010 в 17:39
поделиться

2 ответа

Этот вопрос дико субъективен - но я попробую.

  • Прежде всего, всегда держите код базы данных и данных отдельно от веб-кода. У меня есть много маленьких файлов с одним классом в каждом в папке DB/, которые объединены в файл Base.py, например:

    Web/
      Base.py - Главный "базовый" класс, который включает в себя классы в других 
      веб-файлов, запускает веб-сервер в __init__.
      Users.py - Класс, который включает методы, как правило, из "DB/Users.py" 
      который проверяет разрешения и т.д. перед возвратом (вы можете 
      вы можете добавить безопасность на уровне БД позже)
      ...
    DB/
      Base.py - Главный базовый класс DB, включает в себя другие классы DB. Создает 
      новые экземпляры SQLAlchemy/whatever и создает схемы баз данных, если 
      если их нет и т.д. Возможно, стоит иметь методы для всей базы данных
      здесь, чтобы сохранить создание соединений и т.д. в одном месте, если вы 
      если вы решите сменить базу данных позже 
      Users.py - Файл класса хранения пользователей/паролей и т.д. в БД
      ...
    Templates/
      (HTML-шаблоны находятся здесь)
    Static/
      (Статические изображения/CSS/javscript и т.д. идут сюда)
    
    Не забудьте __init__.py в каждом каталоге модулей, конечно, чтобы python мог найти модули в подкаталогах
  • На мой взгляд, не всегда важно, какие методы вы используете для структурирования кода, но будьте последовательны. Я пишу документ со всеми своими соглашениями и обоснованиями их использования и стараюсь следовать им до тех пор, пока это имеет смысл, но как всегда глупая последовательность - хобгоблин маленьких умов, как цитирует python style docs :-)

  • Старайтесь использовать классы, а не прямые функции. Это может не иметь значения для небольших проектов, но для чего-либо нетривиального все может стать сложным. Я предпочитаю иметь много файлов с определенной целью и только один класс в одном файле, за исключением случаев, когда имеет смысл иметь несколько

  • Этот вопрос, вероятно, спорный - я обычно называю свои классы Class и просто ссылаюсь на них по имени модуля. Приведу пример Base.py:
    import Users
    class Base(Users.Class):
      def __init__(self):
      Users.Class. __init__(self)
    
    Это помогает уменьшить проблемы, когда другие модули ссылаются друг на друга при импорте, так как from Users import Users будет конфликтовать, если Users.py имеет from Base import x, поэтому я всегда ссылаюсь по имени модуля. Впрочем, это всего лишь личные предпочтения, так что делайте, что хотите :-P

Надеюсь, вы получите представление из этого сообщения.

5
ответ дан 18 December 2019 в 11:54
поделиться

CherryPy намеренно не требует, чтобы вы создавали подкласс из предоставляемый фреймворком базовый класс, так что вы можете свободно разрабатывать свой собственный механизм наследования или, что более важно, вообще не использовать его. Вы, безусловно, можете определять свой собственный базовый класс и наследовать от него; таким образом вы можете стандартизировать создание и настройку обработчика с помощью метода __ init __ вашего класса, а также с помощью переменных и методов уровня класса.

Однако предпочтительный подход отличается. Для большинства веб-приложений вы действительно не хотите изменять фактическую логику построения ваших обработчиков и не заботитесь о переменных или методах уровня класса; вместо этого вам нужны повторно используемые переменные и методы для каждого URI или поддерева URI или для каждого сайта, а не для каждого класса. Вы склонны отличать один набор обработчиков от другого набора более конфигурацией экземпляра (метаданные обработчика) и методами экземпляра (логикой обработчика). Традиционное наследование на основе классов может это сделать, но это немного грубый инструмент для такого рода настройки.

CherryPy, таким образом, предназначен для обеспечения такого рода настройки для каждого набора ресурсов, с которой наследование на основе классов не работает.Он обеспечивает это через 1) дизайн своей системы конфигурации, которая позволяет вам связывать метаданные с одним URI, поддеревом URI, поддеревом обработчиков или целым сайтом с одним и тем же синтаксисом (см. http://docs.cherrypy.org/dev/intro/concepts/config.html для обзора) и 2) система хуков и инструментов, которая позволяет связывать логику в один URI, поддерево URI, поддерево обработчиков или весь сайт. См. http://docs.cherrypy.org/dev/intro/concepts/tools.html

Итак, практически: используйте обычные атрибуты в cherrypy.root для построения своего дерева обработчиков :

def make_app():
    root = Root()
    root.foo = Foo()
    root.bars = BarCollection()
    return root

Однако не делайте Root, Foo и Bar наследованием от общего базового класса. Вместо этого напишите независимые инструменты, чтобы делать такие вещи, как «выводить шаблоны». То есть вместо:

from cherrypy import expose

class Foo(MyAppBase):
    @expose()
    def index(self, a, b, c):
        ...

root.foo = Foo(template='foo.html')

напишите:

from cherrypy import expose, tools

class Foo(object):
    @tools.render(template='foo.html')
    @expose()
    def index(self, a, b, c):
        ...

root.foo = Foo()

... где 'tools.render' - это инструмент CherryPy, который вы написали для поиска и применения данного шаблона. Этот подход позволит вам переопределить аргументы инструмента в вашем файле конфигурации и избежать необходимости переупаковывать или исправлять код:

[/foo/]
tools.render.template = 'foo2.html'
10
ответ дан 18 December 2019 в 11:54
поделиться
Другие вопросы по тегам:

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