python - Flask-Security - Application Context Issue - Peewee -
i working on expanding flask skills , have worked on treehouse flask social network project , got work. playing changing settings , allowing social login have moved on flask-security plain bcrypt requirement of flask-social. have separate app , models files , running runtimeerror: working outside of application context when try use utils.encrypt_password() function throws error. can remove error doing from app import app states database not attribute of module.
i totally confused have googled issue keep getting errors peoples suggestions wondering if explain doing wrong. here link question think might similar don't understand in terms of code. have posted code below show user model , top half of app.py these 2 parts in stacktraces.
models.py
import datetime #from app import app flask.ext.login import usermixin flask.ext.security import security, rolemixin, utils peewee import * database = sqlitedatabase('social.db') #database = sqlitedatabase(none) class user(usermixin, model): username = charfield(unique=true) email = charfield(unique=true) password = charfield(max_length=100) joined_at = datetimefield(default=datetime.datetime.now) is_admin = booleanfield(default=false) class meta: database = database order_by = ('-joined_at',) def get_posts(self): return post.select().where(post.user == self) def get_stream(self): return post.select().where( (post.user << self.following()) | (post.user == self)) def following(self): return ( user.select().join( relationship, on=relationship.to_user ).where( relationship.from_user == self ) ) def followers(self): return ( user.select().join( relationship, on=relationship.from_user ).where( relationship.to_user == self ) ) @classmethod def create_user(cls, username, email, password, admin=false): try: database.transaction(): cls.create( username=username, email=email, password=utils.encrypt_password(password), is_admin=admin) except integrityerror: raise valueerror("user exists") def initialise(): #database.init_app(app) database.connect() database.create_tables([user, post, relationship, role, userroles, connection], safe=true) database.close() app.py
from flask import (flask, g, render_template, flash, redirect, url_for, abort, session, request ) flask.ext.login import loginmanager, login_user, logout_user, login_required, current_user flask.ext.social import social, peeweeconnectiondatastore flask.ext.security import peeweeuserdatastore, security flask.ext.social.utils import get_provider_or_404 flask.ext.social.views import connect_handler peewee import * import forms import models debug = true port = 8000 host = '0.0.0.0' app = flask(__name__) app.secret_key = 'tfdghsf3wquhivfcdsz5.5432jkicdsahuihuj7564jinjnf' app.config['security_password_hash'] = 'pbkdf2_sha512' app.config['security_password_salt'] = '1b3kxc8s9fdsa9431vbgvhui43212ijkdrdwui' app.config['social_google'] = { 'consumer_key': '1048991051512-6k0vianfkdece33tool0el7pg72h5lku.apps.googleusercontent.com', 'consumer_secret': 'kdyeeetxqieq7g9lfgfozlh9' } database = sqlitedatabase('social.db') app.config['security_post_login'] = '/profile' user_datastore = peeweeuserdatastore(models.database, models.user, models.role, models.userroles) social_datastore = peeweeconnectiondatastore(models.database, models.connection) security = security(app, user_datastore) social = social(app, social_datastore) login_manager = loginmanager() login_manager.init_app(app) login_manager.login_view = 'login' edit: after looking further issue seems might issue flask-security implemented test function in main app.py , 2 gave same runtime error.
the answer question lies in location of user creation. had left in main section program runs code bellow shows , looks out of context moved default user creation function @app.before_first_request decorator , works.
if __name__ == '__main__': try: models.user.create_user( username='benbrown', email='ben@aperturedigital.uk', password='password', admin=true ) except valueerror: pass app.run(debug=debug, host=host, port=port)
Comments
Post a Comment