Найти - Пользователи
Полная версия: Непонятное поведение Flask + Flask-Security
Начало » Python для новичков » Непонятное поведение Flask + Flask-Security
1 2
Point
Добрый день всем поклонникам Питона! Изучать Питон начал относительно недавно и до сих пор разбирался с непонятками сам или с помощью поисковиков, но в этот раз должен просить о помощи.
Код:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_security import SQLAlchemyUserDatastore, Security
from datetime import datetime
app = Flask(__name__)
app.config.from_object('config')
from views import *
db = SQLAlchemy(app)
from models import *
user_datastore = SQLAlchemyUserDatastore(db, User, Role)
#security = Security(app, user_datastore)
# Create a user to test with
@app.before_first_request
def create_user():
    db.create_all()
    user_datastore.create_user(nickname="Jihn", email='matt@nobien.net', password='123', active=True,
                               confirmed_at=datetime.utcnow())
    db.session.commit()
if __name__ == '__main__':
    app.run(debug=True)

Проблема: Изначально Питон ругался на blueprint-ы с одинаковыми именами ‘security’, вдумчивое чтение кода показало, что ошибка возникает на этапе регистрации blueprint-а в недрах app.py. После того, как закомментировал “security=…” ошибка исчезла, однако в БД стали появляться двойные записи (поля не уникальны), т.е. функция def create_user() пробегает два раза. Кроме того смутило два процесса python при работающем модуле.
Условия: Windows + Python 2.7/3.4. К сожалению на основном десктопе с Минтом посыпался винт, поэтому проверить на линуксе не могу.
Буду рад любым конструктивным предложениям!
4kpt_III
Конструктивнее не куда: забить на блупринты
flask-classy - все, что Вам нужно от жизни…
Point
К сожалению забить на блупринты не получится, т.к. flask_security весьма активно их использует (во всяком случае мне так показалось). Если не найду решения буду писать велосипед на основе flask-login.
4kpt_III
Да ну какой велосипед. Побойтесь бога. Там всего-то 10 строк.
А вот flask-security я вижу повелосипедил не-по-детски…
4kpt_III
Ну и плюс сильная привязка к типу БД. Если мне модель будет нужна вне фласка - то меня в этом случае будет ждать большоооой облом, а обламываться я не люблю
Point
Да собственно скорее всего проблема не во Flask-security. Только что обыграл запуск с полным его отключением. Чтобы понять сколько запускается модуль тупо добавил строку print(“!”).
Итог:
********************************************************
C:\Python34\python.exe CWork/Projects/Python/Blog/init_app.py
!
!
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
* Restarting with stat
!
!
********************************************************
В процессах висит два python-а. Есть предположение что это потоки фласка, не имеющие отношения к проблеме. На это указывает то, что лишь один процесс прослушивает порт (5000), второй в сеть не лезет или не успеваю зарегистрировать.
Кроме того меня смущает тот факт, что после запуска прослушивания print успевает отработать еще два раза, т.е. в сумме 4 раза выполняется команда print!!!!
4kpt_III
print вставили где? Код, а то сложно понять…
Point
Print поставил непосредственно в контексте модуля:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
#from flask_security import SQLAlchemyUserDatastore, Security
from datetime import datetime
app = Flask(__name__)
app.config.from_object('config')
from views import *
db = SQLAlchemy(app)
from models import *
'''
user_datastore = SQLAlchemyUserDatastore(db, User, Role)
#security = Security(app, user_datastore)
# Create a user to test with
@app.before_first_request
def create_user():
    db.create_all()
    user_datastore.create_user(nickname="Jihn", email='matt@nobien.net', password='123', active=True,
                               confirmed_at=datetime.utcnow())
    db.session.commit()
'''
print('!')
if __name__ == '__main__':
    app.run(debug=True)

Дополнено:
На свежую голову попробовал отключить создание экземпляра SQLAlchemy (закоментил)- print стал выдавать другую картину:
***************
C:\Python34\python.exe CWork/Projects/Python/Blog/init_app.py
!
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
* Restarting with stat
!
***************
Однако процессов в памяти по прежнему два.
Вполне возможно, что я неправильно расставил импорты и инициализации, хотя на первый взгляд все логично. Могу привести код также модуля views и модуля models , но там на мой взгляд ничего интересного в данном вопросе нет.
4kpt_III
Запустил. Отключил импорты. Все то же самое. Видимо, это работа сервера разработки. А именно модуля для отслеживания изменений в файлах проекта и его перезапуска. Можно попробовать выполнить с wsgi и посмотреть результат…

P.S. Так в чем вопрос, собственно? Где не работает?


P.S.S. werkzeug
Point
однако в БД стали появляться двойные записи (поля не уникальны), т.е. функция def create_user() пробегает два раза.

1. Если в БД делать уникум записи- будет выпадать ошибка при выполнении функции def create_user (т.к. создание идентичного пользователя будет происходить дважды)
2. Двойная регистрация блуепринта “security”, что приводит к ошибке
…. Можно еще что-нибудь добавить, но пока что это волнует.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB