ImportError: невозможно импортировать имя 'UserModel' - PullRequest
0 голосов
/ 10 марта 2019

ПОМОГИТЕ, у меня есть файл appp.py:

from flask import Flask, jsonify, request, make_response
import json
from flask_restful import Api
from flask_sqlalchemy import SQLAlchemy
import models,resources

app = Flask(__name__)
api = Api(app)

api.add_resource(resources.UserRegistration, '/registration')
api.add_resource(resources.UserLogin, '/login')
api.add_resource(resources.UserLogoutAccess, '/logout/access')
api.add_resource(resources.UserLogoutRefresh, '/logout/refresh')
api.add_resource(resources.TokenRefresh, '/token/refresh')
api.add_resource(resources.AllUsers, '/users')
api.add_resource(resources.SecretResource, '/secret')

app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///app.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.config['SECRET_KEY'] = 'waaahawhawaahhawhaw'

db = SQLAlchemy(app)

@app.before_first_request
def create_tables():
    db.create_all()

@app.route('/')
def index():
    return jsonify({'message': 'Hell to the World!'})

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

, а вот файл models.py:

from appp import db

class UserModel(db.Model):
    __tablename__ = 'users'

    id = db.Column(db.Integer, primary_key = True)
    username = db.Column(db.String(120), unique = True, nullable = False)
    password = db.Column(db.String(120), nullable = False)

    def save_to_db(self):
        db.session.add(self)
        db.session.commit()

    @classmethod
    def find_by_username(cls, username):
        return cls.query.filter_by(username = username).first()

и файл resources.py

from flask_restful import Resource, reqparse
from models import UserModel

parser = reqparse.RequestParser()
parser.add_argument('username', help = 'This field cannot be blank', required = True)
parser.add_argument('password', help = 'This field cannot be blank', required = True)

class UserRegistration(Resource):
    def post(self):
        data = parser.parse_args()

        if UserModel.find_by_username(data['username']):
            return {'message': 'User {} already exists'. format(data['username'])}

        new_user = UserModel(
            username = data['username'],
            password = data['password']
        )
        try:
            new_user.save_to_db()
            return {
                'message': 'User {} was created'.format( data['username'])
            }
        except:
            return {'message': 'Something went wrong'}, 500

Когда я пытаюсь запустить приложение, я получаю следующее сообщение об ошибке:

ImportError: невозможно импортировать имя 'UserModel'

Действительно, я нашел другой вопрос, напримермой, и они помогли мне понять, почему я получаю эту ошибку, но никто из них не помог мне обойти ее.Я предполагаю, что python (или flask) не может загрузить класс UserModel из model.py, потому что model.py (или класс UserModel) все еще инициализируется, и ему нужен db из appp.py, который ожидаетresources.py, который не может быть загружен, потому что он ждет models.py.Как это исправить ????Кстати, я новичок во всем этом, и я просто следую этому учебнику

Вот структура проекта

test
|---appp.py
|---models.py
|---resources.py

3 файла находятся рядом друг с другомв тестовой папке.

Спасибо

1 Ответ

0 голосов
/ 10 марта 2019

Чтобы расширить, вот пример в контексте моего комментария ..

from test.models import User, Role, UserRoles,\
Regions, RegionAttributes, CityAttributes,\
UserAttributes, SkillTracker, RegionWar,\
Articles

Вы просили, чтобы я объяснил различия с импортом.

Я не уверен, что это можно объяснить несколькими словами, но я изо всех сил стараюсь не усложнять это.

У вас есть папка проекта с именем test, а эта папка - ваша models.py. Поскольку файл моделей находится в папке test (в данном случае test - это модуль), вы импортируете класс внутри файла в каталог проекта, который в итоге будет выглядеть так:

from test import models

--test

   |

    --models.py

Говоря простым языком, можно сказать, что это означает, что из тестовой папки я хочу импортировать файл models.py

Надеюсь, это внесет некоторую ясность, это будет поиск с хорошим гуглом, я уверен, что есть много более хороших объяснений, и я, вероятно, что-то упускаю.

Причина, по которой один из способов не сработал, заключалась в том, что вы должны импортировать из модуля, в то время как приложение, модели и UserModel не являются модулями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...