Flask Shell命令不起作用 [英] Flask Shell Commands not working

查看:114
本文介绍了Flask Shell命令不起作用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是python和flask的新手,目前正在看起来像我问题,但不使用 app.sell_context_processor 装饰器.

我还尝试了一些代码变体:都将导入名称从应用程序更改为应用程序,因为我将其从教程中的默认名称更改为默认名称,并使用 user 而不是 User (小写与大写),但似乎无济于事.

请帮助我解决此问题!

错误

 (venv)MBP:books mbpp $ flask shellPython 3.6.5(默认,2018年3月30日,06:42:10)达尔文[GCC 4.2.1兼容的Apple LLVM 9.0.0(clang-900.0.39.2)]应用程序:应用程序实例:/Users/mbpp/Sites/books/instance>>>应用程序<烧瓶应用程序">>>>用户追溯(最近一次通话):文件< console> ;,第1行,< module>NameError:未定义名称用户" 

来自 application.py

我的代码从应用程序导入应用程序中的

 从application.models导入用户,书本,州,课程,BookTitle,作者@ app.shell_context_processordef make_shell_context():return {'db':db,'User':User,'State':State,'BookTitle':BookTitle,'Author':Author} 

并来自 __ init __.py

从烧瓶导入烧瓶中的

 从配置导入配置从flask_sqlalchemy导入SQLAlchemy从flask_migrate导入迁移从flask_login导入LoginManager#启动Flask应用app = Flask(__ name__)#使用config.py文件进行配置app.config.from_object(Config)#使用SQLAlchemy进行数据库管理db = SQLAlchemy(应用程序)#使用Flask-Migrate扩展进行数据库迁移管理迁移=迁移(app,db)#使用Flask-Login扩展名登录表单login = LoginManager(app)login.login_view ='登录'从应用程序导入路线,模型 

models.py (我正在建立一个用户可以在其中出售书籍的网站)

从应用程序导入数据库中的

 ,登录从datetime导入datetime从werkzeug.security导入generate_password_hash,check_password_hash从flask_login导入UserMixin#创建一个表来存储用户类User(UserMixin,db.Model):id = db.Column(db.Integer,primary_key = True)用户名= db.Column(db.String(64),索引= True,唯一= True)电子邮件= db.Column(db.String(120),索引= True,唯一= True)password_hash = db.Column(db.String(128))电话= db.Column(db.String(64))books = db.relationship('Book',backref ='seller_name',lazy ='dynamic')def __repr __(自己):返回'< User:{}>'.format(self.username)#创建密码哈希def set_password(自己,密码):self.password_hash = generate_password_hash(密码)#根据用户指定的密码检查密码哈希def check_password(自己,密码):返回check_password_hash(self.password_hash,密码)#创建一个表以将信息存储在待售书中类Book(db.Model):id = db.Column(db.Integer,primary_key = True)course_id = db.Column(db.Integer,db.ForeignKey('course.id'))title = db.Column(db.Integer,db.ForeignKey('booktitle.id'))author = db.Column(db.Integer,db.ForeignKey('author.id'))价格= db.Column(db.Integer)isbn = db.Column(db.String(64),index = True)state_id = db.Column(db.Integer,db.ForeignKey('state.id'))state_description = db.Column(db.String(256))Seller_id = db.Column(db.Integer,db.ForeignKey('user.id'))creation_timestamp = db.Column(db.DateTime,index = True,默认= datetime.utcnow)def __repr __(自己):返回'< Book:{}>'.format(self.title)#创建一个表来存储不同状态的书可以放在State(db.Model)类:id = db.Column(db.Integer,primary_key = True)名称= db.Column(db.String(128),index = True)books = db.relationship('Book',backref ='state',lazy ='dynamic')def __repr __(自己):返回'< State:{}>'.format(self.name)#创建一个表来存储课程课程(db.Model):id = db.Column(db.Integer,primary_key = True)名称= db.Column(db.String(128),index = True)年= db.Column(db.Integer,索引= True)books = db.relationship('Book',backref ='course',lazy ='dynamic')def __repr __(自己):返回'<课程:{}>'.format(self.name)#创建一个表来存储书名类BookTitle(db.Model):id = db.Column(db.Integer,primary_key = True)title = db.Column(db.String(128),index = True)books = db.relationship('Book',backref ='book_title',lazy ='dynamic')def __repr __(自己):返回'<书名:{}>'.format(self.title)#创建一个表来存储作者类Author(db.Model):id = db.Column(db.Integer,primary_key = True)名称= db.Column(db.String(128),index = True)books = db.relationship('Book',backref ='author_name',lazy ='dynamic')def __repr __(自己):返回'<作者:{}>'.format(self.name)#Flask-Login扩展的用户加载器,获取用户ID@ login.user_loaderdef load_user(id):返回User.query.get(int(id)) 

解决方案

非常感谢 Miguel ,FLASK Mega Tutorial(检查一下)解决了我的问题!

正如他在评论中指出的那样在我的问题下面:您不能使用相同名称的模块和软件包.因此,不能同时使用应用程序文件夹和application.py.

解决方案:

我将我的'application.py'更改为'theapp.py',现在 flask shell 就像一个吊饰!除了在终端中运行 export FLASK_APP = theapp.py 外,我不需要更改文件中的任何内容.

I'm new to python and flask and currently working on the Flask Mega-Tutorial, however: I'm stuck getting flask shell to recognize my custom symbols/commands.

When I try to access the model User as a symbol by typing flask shell in my virtual environment, I get NameError: name 'User' is not defined.

User should return: <class 'application.models.User'>, but shows the error instead.

What I don't understand is that the app symbol seems to work fine and returns <Flask 'application'> as it should.

What am I doing wrong here? Something with the imports?

I did some research: this looks like my problem but does not use the app.sell_context_processor decorator.

I tried also variations of my code: both changing import names from app to application as I changed these from the default in the tutorial and using user instead of User (lower vs. uppercase), but nothing seems to work.

Please help me fix this!

Error

    (venv) MBP:books mbpp$ flask shell
    Python 3.6.5 (default, Mar 30 2018, 06:42:10) 
    [GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.39.2)] on darwin
    App: application
    Instance: /Users/mbpp/Sites/books/instance
    >>> app
    <Flask 'application'>
    >>> User
    Traceback (most recent call last):
      File "<console>", line 1, in <module>
    NameError: name 'User' is not defined

My code from application.py

   from application import app, db
   from application.models import User, Book, State, Course, BookTitle, Author

   @app.shell_context_processor
   def make_shell_context():
       return {'db': db, 'User': User, 'State': State, 'BookTitle': BookTitle, 'Author': Author}

and from __init__.py

    from flask import Flask
    from config import Config
    from flask_sqlalchemy import SQLAlchemy
    from flask_migrate import Migrate
    from flask_login import LoginManager

    # initiate the Flask app
    app = Flask(__name__)

    # use the config.py file for configuration
    app.config.from_object(Config)

    # use SQLAlchemy for database management
    db = SQLAlchemy(app)

    # use Flask-Migrate extension for database migration management
    migrate = Migrate(app, db)

    # use Flask-Login extension for login form
    login = LoginManager(app)
    login.login_view = 'login'

    from application import routes, models

and from models.py (I'm building a website where users can sell books)

   from application import db, login
   from datetime import datetime
   from werkzeug.security import generate_password_hash, 
   check_password_hash
   from flask_login import UserMixin

   # create a table to store users
   class User(UserMixin, db.Model):
        id = db.Column(db.Integer, primary_key = True)
        username = db.Column(db.String(64), index = True, unique = True)
        email = db.Column(db.String(120), index = True, unique = True)
        password_hash = db.Column(db.String(128))
        phone = db.Column(db.String(64))
        books = db.relationship('Book', backref='seller_name', lazy='dynamic')

    def __repr__(self):
        return '<User: {}>'.format(self.username)

    # create a password hash
    def set_password(self, password):
        self.password_hash = generate_password_hash(password)

    # check the password hash against a user given password
    def check_password(self, password):
        return check_password_hash(self.password_hash, password)

    # create a table to store information on a book for sale
        class Book(db.Model):
            id = db.Column(db.Integer, primary_key = True)
            course_id = db.Column(db.Integer, db.ForeignKey('course.id'))
            title = db.Column(db.Integer, db.ForeignKey('booktitle.id'))
            author = db.Column(db.Integer, db.ForeignKey('author.id'))
            price = db.Column(db.Integer)
            isbn = db.Column(db.String(64), index = True)
            state_id = db.Column(db.Integer, db.ForeignKey('state.id'))
            state_description = db.Column(db.String(256))
            seller_id = db.Column(db.Integer, db.ForeignKey('user.id'))
            creation_timestamp = db.Column(db.DateTime, index = True, default = datetime.utcnow)

        def __repr__(self):
            return '<Book: {}>'.format(self.title)

    # create a table to store different states books can be in
        class State(db.Model):
            id = db.Column(db.Integer, primary_key = True)
            name = db.Column(db.String(128), index = True)
            books = db.relationship('Book', backref='state', lazy='dynamic')

        def __repr__(self):
            return '<State: {}>'.format(self.name)

    # create a table to store courses
        class Course(db.Model):
            id = db.Column(db.Integer, primary_key = True)
            name = db.Column(db.String(128), index = True)
            year = db.Column(db.Integer, index = True)
            books = db.relationship('Book', backref='course', lazy='dynamic')

        def __repr__(self):
        return '<Course: {}>'.format(self.name)

    # create a table to store booktitles
        class BookTitle(db.Model):
            id = db.Column(db.Integer, primary_key = True)
            title = db.Column(db.String(128), index = True)
            books = db.relationship('Book', backref='book_title', lazy='dynamic')

        def __repr__(self):
           return '<Book title: {}>'.format(self.title)

    # create a table to store authors
        class Author(db.Model):
        id = db.Column(db.Integer, primary_key = True)
        name = db.Column(db.String(128), index = True)
        books = db.relationship('Book', backref='author_name', lazy='dynamic')

        def __repr__(self):
            return '<Author: {}>'.format(self.name)

     # user loader for Flask-Login extension, gets users ID
     @login.user_loader
     def load_user(id):
         return User.query.get(int(id))

解决方案

Thanks a lot to Miguel, the writer of the FLASK Mega Tutorial (go check that out) wo solved my problem!

As he pointed out in a comment below my question: you cannot have a module and a package with the same name. So no application folder and application.py at the same time.

Solution:

I changed my 'application.py into 'theapp.py' and now flask shell works like a charm! I did not need to change anything in my files, apart from running export FLASK_APP=theapp.py in the terminal.

这篇关于Flask Shell命令不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆