Flask на виртуальном хостинге Beget
2022-04-25Мой сайт, который собирает статистику по файлам пользователей проекта DCS работает на хостинге Beget и написан с ипользованием Python и фреймворка Flask. Как установить Python и фреймворк написано в статье тут. Я же покажу как я настроил сам фреймворк.
Структура проекта
├── HelloFlask
│ ├── blueprints
│ │ └── blogapp
│ ├── config.py
│ ├── controllers.py
│ ├── __init__.py
│ ├── logs
│ ├── models.py
│ ├── profs
│ ├── static
│ │ ├── files
│ │ ├── img
│ │ ├── styles
│ ├── templates
│ └── view.py
├── passenger_wsgi.py
├── public -> public_html/
├── public_html
├── README.md
├── requirements.txt
├── run.py
├── tmp
│ └── restart.txt
└── venv
Содержимое файлов настроек
congig.py
Файл конфигурации позволяет гибко настраивать фреймворк. Логирование настроено на запись логов в файл в директорию log. Также при оптимизации сайта понадобилось настройить сохранение .prof файлов профилировщика на диск в директорию profs.
class Configuration: DEBUG = False SQLALCHEMY_TRACK_MODIFICATIONS = False SQLALCHEMY_DATABASE_URI = 'mysql://<username>:<password>@127.0.0.1:3306/<db_name>' TESTING = False PROFILING = False # Enable profiling LOGGING = True # Enabe logging CACHE_TYPE = 'SimpleCache' # Flask-Caching related configs CACHE_DEFAULT_TIMEOUT = 300 class ProductionConfiguration(Configuration): pass class TestConfiguration(Configuration): TESTING = True class DevelopmentConfiguration(Configuration): DEBUG = True
__init__.py
Для инициализации использована фабричная функция.
import os import logging from logging.handlers import RotatingFileHandler from flask import Flask, render_template from werkzeug.middleware.profiler import ProfilerMiddleware # Import SQLAlchemy from flask_sqlalchemy import SQLAlchemy from .config import (DevelopmentConfiguration, ProductionConfiguration, TestConfiguration) from flask_caching import Cache cache = Cache() db = SQLAlchemy(engine_options={'connect_args': {'connect_timeout': 10}}) def create_app(): # Define the WSGI application object app = Flask(__name__) # Configurations try: if os.environ['FLASK_ENV'] == 'development': app.config.from_object(DevelopmentConfiguration) elif os.environ['FLASK_ENV'] == 'testing': app.config.from_object(TestConfiguration) except KeyError: app.config.from_object(ProductionConfiguration) if app.config.get('PROFILING'): if not os.path.exists('HelloFlask/profs'): os.mkdir('HelloFlask/profs') app.wsgi_app = ProfilerMiddleware( app.wsgi_app, restrictions=( '/controllers.py:', [30], ), profile_dir=os.path.join('HelloFlask', 'profs'), filename_format='{path}-{time:.0f}.prof', ) if app.config.get('LOGGING'): if not os.path.exists('HelloFlask/logs'): os.mkdir('HelloFlask/logs') file_handler = RotatingFileHandler( 'HelloFlask/logs/hello-flask.log', maxBytes=10240, backupCount=10) file_handler.setFormatter(logging.Formatter( '%(asctime)s:%(levelname)s:%(message)s:%(pathname)s:%(lineno)d') ) file_handler.setLevel(logging.INFO) app.logger.addHandler(file_handler) app.logger.setLevel(logging.INFO) app.logger.info('Startup logging') # Define the database object which is imported # by modules and controllers db.init_app(app) cache.init_app(app) with app.app_context(): db.create_all() # HTTP error handling @app.errorhandler(404) def not_found(error): return render_template('page404.html'), 404 # Import a module/component using its blueprint handler variable (mod_auth) from HelloFlask.view import webapp from HelloFlask.blueprints.blogapp.view import posts # Register blueprint(s) app.register_blueprint(webapp) app.register_blueprint(posts) # Build the database: # This will create the database file using SQLAlchemy with app.app_context(): db.create_all() migrate = Migrate(app, db) return app app = create_app() if __name__ == '__main__': app.run()
passenger_wsgi.py
# -*- coding: utf-8 -*- # /home/m/ma5tad/dcs-webapp-flask/public_html/venv/bin/flask import sys sys.path.append('/home/m/ma5tad/dcs-webapp-flask/HelloFlask') # указываем директорию с проектом sys.path.append('/home/m/ma5tad/dcs-webapp-flask/venv/lib/python3.6/site-packages') # указываем директорию с библиотеками, куда поставили Flask # from public_html.HelloFlask import create_app as application # когда Flask стартует, он ищет application. Если не указать 'as application', сайт не заработает from HelloFlask import app as application # когда Flask стартует, он ищет application. Если не указать 'as application', сайт не заработает from werkzeug.debug import DebuggedApplication # Опционально: подключение модуля отладки application.wsgi_app = DebuggedApplication(application.wsgi_app, True) # Опционально: включение модуля отадки application.debug = False # Опционально: True/False устанавливается по необходимости в отладке
run.py
from HelloFlask import create_app def main(*args, **kwargs): app = create_app(*args, **kwargs) return app if __name__ == '__main__': APP = main() APP.run(host='127.0.0.1', port=9000)
Сайт расположен на домене ma5ta.ru. Изначально сайт располагался на VPS Hetzner. При переезде на Бегет пришлось сменить БД и модифицировать работу сайта.