Не могу найти __main__ при инициализации моей базы данных SQLite - PullRequest
0 голосов
/ 08 апреля 2020

Я новичок в Python и еще новее в Flask. Когда я пытаюсь инициализировать свою базу данных с помощью SQLAlchemy, я получаю сообщение об ошибке. Кто-нибудь знает, что происходит и как я могу решить эту проблему, чтобы я мог запустить db.create_table(), чтобы инициализировать свою базу данных и проверить конечные точки API?

Я ввожу:

python3
from app import db

ошибка:

* Serving Flask app "app" (lazy loading)
* Environment: production
WARNING: This is a development server. Do not use it in a production deployment.
Use a production WSGI server instead.
* Debug mode: on
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
* Restarting with stat
/Users/mark/Documents/Coding/friend_code/venv/bin/python3: can't find '__main__' module in '/Users/mark/Documents/Coding/friend_code'

И это весь мой код в app.py

import os
import secrets
from flask_sqlalchemy import SQLAlchemy
from flask import Flask, request, jsonify
from flask_marshmallow import Marshmallow

users = []
theme = [
    {'neon red and neon blue': ('rgb(255, 60, 40)', 'rgb(10, 185, 230)')},
    {'gray': ('rgb(130, 130, 130)', 'rgb(130, 130, 130)')},
    {'blue and neon yellow': ('rgb(70, 85, 230)', 'rgb(230, 255, 0)')},
    {'neon pink and neon green': ('rgb(255, 50, 120)', 'rgb(30, 220, 0)')},
    {'neon purple and neon orange': ('rgb(180, 0, 245)', 'rgb(250, 160, 5)')},
    {'neon yellow': ('rgb(250, 160, 5)', 'rgb(250, 160, 5)')}
]

app = Flask(__name__)
basedir = os.path.abspath(os.path.dirname(__file__))

# database
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + \
    os.path.join(basedir, 'db.sqlite')
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

# initializion
db = SQLAlchemy(app)
ma = Marshmallow(app)


# user class/model
class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(20), unique=True, nullable=False)
    avatar = db.Column(db.String, default='default.jpg', nullable=False,)
    friend_code = db.Column(db.Integer, nullable=False)
    update_code = db.Column(db.String, nullable=False)
    theme = db.Column(db.String, default='neon red and neon blue')
    dark_mode = db.Column(db.Boolean, default=True, nullable=False)

    def __init__(self, username, avatar, friend_code, update_code, theme, dark_mode):
        self.username = username
        self.avatar = avatar
        self.friend_code = friend_code
        self.update_code = update_code
        self.theme = theme
        self.dark_mode = dark_mode


# user schema
class UserSchema(ma.Schema):
    # allowed visible fields
    class Meta:
        fields = ('username', 'avatar', 'friend_code',
                  'update_code', 'theme', 'dark_mode')


# initialization
user_schema = UserSchema()

# GET
@app.route('/<username>', methods=['GET'])
def get(username):
    user = User.query.get(username)
    return user_schema.jsonify(user)

# POST
@app.route('/', methods=['POST'])
def post():
    username = request.json['username']
    avatar = request.json['avatar']
    friend_code = request.json['friend_code']
    update_code = secrets.token_urlsafe(8)
    theme = request.json['theme']
    dark_mode = request.json['dark_mode']

    new_user = User(username, avatar, friend_code,
                    update_code, theme, dark_mode)

    # add to db
    db.session.add(new_user)
    db.session.commit()

    return user_schema.jsonify(new_user)


# run server
app.run(debug=True)

1 Ответ

2 голосов
/ 08 апреля 2020

Как вы вызываете свой код? Если вы звоните напрямую, например, с помощью

$ python app.py

, вам нужно заключить команду app.run() в блок main в конце app.py

if __name__ == "__main__":
    app.run(debug=True)

В противном случае, если вы пытаетесь вызвать пакет напрямую, как при

$ python -m friend_code

, вам нужно включить файл __main__.py в папку, содержащую блок код с блоком main (а также с оператором импорта для app).

Проблема заключается в том, что вызов функции run server выполняется каждый раз когда вы пытаетесь импортировать базу данных из этого файла, потому что она не обернута одним из этих основных блоков.

Вы можете узнать больше о том, как это работает, из этого глубина ответа .

Что касается создания таблиц базы данных, то самым простым способом будет создание файла, который обрабатывает это для вас, который затем можно запустить напрямую

create_db.py

if __name__ == "__main__":
    from app import db
    db.create_all()
    print("Database Created")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...