Дублирование модуля Python 3.8 и область действия объекта приложения в импортированных функциях

#python #flask #python-import

#python #flask #python-импорт

Вопрос:

Я смущен импортом пользовательских модулей. Как вы можете видеть в приведенном ниже коде, в main я сначала импортирую все библиотеки, необходимые для всего, И что я дублировал эти импорта в моем i_setup_functions.py досье. Исключение любого из них из любого файла создало ошибки. То же самое с дублированием «app = Flask (name)». Я действительно надеюсь, что избыточность неверна, и есть какой-то простой способ исправить это. Все, что я хочу сделать, это включить настройку сеансов, электронной почты, подключения к данным и т.д. Здесь показаны только сеансы для простоты.

Кстати: все приложение работало без ошибок, пока я не попытался модулировать.

Сообщение об ошибке:

 RuntimeError: The session is unavailable because no secret key was set. Set the secret_key on the application to something unique and secret.
  

Это сообщение об ошибке указывает на строку в функции в середине main.py который пытается создать сеанс.

Спасибо за любые идеи, которыми вы все можете поделиться!

main.py:

 from flask import session
import random
from datetime import datetime, timedelta
from i_setup_functions import setup_sessions

app = Flask(__name__)
# is the following line even necessary in either module?
application = app

setup_sessions()
setup_mail()
setup_logging()
[snip]
# Error here:
​session["id_user"] = id_user
  

i_setup_functions.py

 from flask import session
import random
from datetime import datetime, timedelta
from i_setup_functions import setup_sessions

app = Flask(__name__)
application = app

def setup_sessions():
    random.seed(datetime.now())
    app.config['SECRET_KEY'] = str(random.randint(1, 500))   "jibber"   str(random.randint(1, 500))   "jabber"
    app.permanent_session_lifetime = timedelta(days=30)
    return True
  

Комментарии:

1. Вы пробовали использовать setup_sessions() take app в качестве параметра вместо того, чтобы делать его переменной уровня файла, а затем передавать app его main.py при вызове setup_sessions() ? Вам вообще не нужно назначать application , если вы просто не хотите иметь доступ к переменной с любым именем.

2. Это сработало! И научил меня еще одной вещи о Python. Спасибо!

3. Любые идеи о том, как интерпретатор, похоже, хочет, чтобы я импортировал те же библиотеки в main.py и i_setup_functions.py ? Как мне обойти это? Кажется слишком избыточным, чтобы быть правильным. Должен ли я задавать это как отдельный / новый вопрос о стеке?

4. Если вам нужно напрямую обратиться к модулю, вам необходимо импортировать модуль в тот же файл. Не беспокойтесь об импорте одного и того же модуля в двух разных файлах — python умен, и оба импорта будут указывать на один и тот же загруженный объект в памяти (модуль загружается только один раз, даже если импортируется во многих разных файлах). Суть в ясности — если я смотрю на один файл, я должен быть в состоянии знать, откуда берется каждая отдельная функция, без необходимости смотреть на остальную часть программы (в отличие, скажем, от C / C ).

Ответ №1:

Вы создаете два (или более?) разделите приложения и установите значение SECRET_KEY на то, которое не обслуживает ваше приложение.

Чтобы исправить это, удалите все app = Flask(__name__) вызовы из всех модулей, кроме main.py . Затем передайте app созданное вами во main.py все нужные вам места.

 from flask import session
import random
from datetime import datetime, timedelta
from i_setup_functions import setup_sessions

app = Flask(__name__)

setup_sessions(app)
setup_mail(app)
setup_logging(app)

[snip]

​session["id_user"] = id_user
  

Комментарии:

1. Спасибо!!! Это сработало! Любые идеи о том, как интерпретатор, похоже , хочет, чтобы я импортировал те же библиотеки в main.py и i_setup_functions.py ? Как мне обойти это? Кажется слишком избыточным, чтобы быть правильным.

2. Как он хочет , чтобы вы их импортировали? Отображается ли предупреждение или ошибка? Я не уверен, что понимаю проблему.