所以我仍在学习 Flask 中的结构,似乎 Flask 提供了太多的灵活性,这让我难以决定,所以我尝试将我的 Resource 类添加到具有当前结构的 API
api
/__init__.py
/project.py
models
/project_management.py
configs.py
configs.json
run.py
但运行时返回错误 AttributeError:类型对象“Project”没有属性“as_view”
回溯(最后一次通话):
文件“e:\project-py un.py”,第 6 行,在 来自 api import * 文件“e:\project-py pi_init_.py”,第 9 行,在 from .project import * 文件“e:\project-py pi\project.py”,第 6 行,在 @api.add_resource(Project, '/v1/project') 文件“C:\Users okie\Anaconda3 nvs\py39-rest-flask\lib\site-packages lask_restful_init_.py", 第 391 行,在 add_resource
self.register_view(self.app, resource, *urls, **kwargs) 文件“C:\Users okie\Anaconda3 nvs\py39-rest-flask\lib\site-packages lask_restful_init.py", 第 431 行,在_register_view
resource_func = self.output(resource.as_view(endpoint, *resource_class_args, AttributeError: type object 'Project' has no attribute 'as_view'
我的run.py
from functools import wraps
from flask import Flask, session, g, render_template, flash
# from flask_cors import CORS, cross_origin
from flask_wtf.csrf import CSRFProtect
from pages import *
from api import *
from config import create_app
app = create_app()
app.app_context().push()
# app.register_blueprint(pages)
app.register_blueprint(api, url_prefix='/api')
# app.secret_key = "ff82b98ef8727e388ea8bff063"
csrf = CSRFProtect()
csrf.init_app(app)
if __name__ == "__main__":
app.run(host='127.0.0.1',debug=True)
Config.py
import json
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_marshmallow import Marshmallow
# from flask_wtf.csrf import CSRFProtect
from flask_login import LoginManager
from flask_cors import CORS, cross_origin
db = SQLAlchemy()
ma = Marshmallow()
f = open('configs.json')
config = json.load(f)
def create_app():
app = Flask(__name__, template_folder='templates')
app.config['SQLALCHEMY_DATABASE_URI'] = config['config']['database']
app.config['SECRET_KEY'] = config['config']['secret_key']
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
api_v1_cors_config = {
"origins": ["*"]
}
CORS(app, resources={
r"/api/*": api_v1_cors_config
})
db.init_app(app)
ma.init_app(app)
login_manager = LoginManager()
login_manager.login_view = 'pages.login'
login_manager.init_app(app)
from models.user_management import User
@login_manager.user_loader
def load_user(user_id):
# since the user_id is just the primary key of our user table, use it in the query for the user
return User.query.get(int(user_id))
return app
api init.py 名为“api”的文件夹作为包
from flask import Blueprint
from flask_restful import Api
api_bp=Blueprint('api',__name__)
api = Api(api_bp)
# from .login import *
# from .api_project import *
from .project import *
# from .master_user import *
最后是project.py
from . import api
from flask import Flask, jsonify, request
from flask_restful import Resource, Api
from models.project_management import Project, ProjectStatus, Task
@api.add_resource(Project, '/v1/project')
class Project(Resource):
def get(self):
try:
print('test')
projects = Project.query.all()
return jsonify({
'message': 'Data get success',
'data': projects,
})
except Exception as e:
return jsonify({
'message': f'failed to get data {e}',
'data': []
})
我无法检查但是...
模型 (
Project
) 和类 Project.query.all()
具有相同的名称class Project(Resource)
,这可能会产生问题。
因为模型
Project
是在add_resource()
之前创建(导入)的所以它使用这个模型但是它必须使用class Project
您可能必须先用不同的名称定义类,然后使用新类
add_resource()
class MyProject(Resource):
# ... code ...
api.add_resource(MyProject, '/v1/project')