Я пытаюсь расширить базовый проект колбы https://github.com/hack4impact/flask-base/tree/master/app. При этом используется шаблон фабрики приложений в app / init.py и blueprints.
В приложении / init.py у меня есть:
import os
from flask import Flask
from flask_mail import Mail
from flask_sqlalchemy import SQLAlchemy
from flask_login import LoginManager
from flask_assets import Environment
from flask_wtf import CsrfProtect
from flask_compress import Compress
from flask_rq import RQ
from flask_admin import Admin, BaseView, expose
from flask_admin.contrib.sqla import ModelView
# from app.models import User
from config import config
from .assets import app_css, app_js, vendor_css, vendor_js
basedir = os.path.abspath(os.path.dirname(__file__))
mail = Mail()
db = SQLAlchemy()
csrf = CsrfProtect()
compress = Compress()
# Set up Flask-Login
login_manager = LoginManager()
login_manager.session_protection = 'strong'
login_manager.login_view = 'account.login'
from app.models import User
def create_app(config_name):
app = Flask(__name__)
app.config.from_object(config[config_name])
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
# not using sqlalchemy event system, hence disabling it
with app.app_context():
m =app.url_map
config[config_name].init_app(app)
# Set up extensions
mail.init_app(app)
db.init_app(app)
login_manager.init_app(app)
csrf.init_app(app)
compress.init_app(app)
RQ(app)
# adm = Admin(app, name='MyAPP')
adm = Admin(endpoint='adminz', name='adz', url='/adminz')
......
# Create app blueprints
from .main import main as main_blueprint
app.register_blueprint(main_blueprint)
from .account import account as account_blueprint
app.register_blueprint(account_blueprint, url_prefix='/account')
from .admin import admin as admin_blueprint
# from .admin import admin_blueprint
app.register_blueprint(admin_blueprint, url_prefix='/admin')
return app
шаблоны / админ / db.html:
<p>Hello world</p>
К просмотру администратора (https://github.com/hack4impact/flask-base/blob/master/app/admin/views.py) Я добавил:
from flask_admin import Admin, BaseView, expose
from flask_admin.contrib.sqla import ModelView
from app import adm as adm, db
class MyView(ModelView):
@expose('/')
def db(self):
return self.render('admin/db.html')
# admin management setup
@main.route('/db')
def db():
adm.add_view(MyView(User, db.session))
Когда я открываю, я получаю панель администратора, а не базовый вид фляги-администратора:
127.0.0.1:5000/db
Что я делаю не так?
EDIT:
следуя вашим указаниям, я изменил create_app для начала:
def create_app(config_name):
app = Flask(__name__)
app.config.from_object(config[config_name])
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
# not using sqlalchemy event system, hence disabling it
# adm = Admin(name='admin2', endpoint='/db', url='/db', template_mode='bootstrap3',base_template='admin/db.html')
config[config_name].init_app(app)
# Set up extensions
mail.init_app(app)
db.init_app(app)
login_manager.init_app(app)
csrf.init_app(app)
compress.init_app(app)
RQ(app)
adm = Admin(app, name='MyAPP')
# adm = Admin(endpoint='adminz', name='adz', url='/adminz')
adm.add_view(MyView(User, db.session, endpoint='db'))
В результате:
Файл ".... flask \ app.py", строка 946, в register_blueprint
(blueprint, self.blueprints [blueprint.name], blueprint.name)
AssertionError: Столкновение имени проекта произошло между и. Оба имеют одно и то же имя «админ». Чертежи, созданные на лету, требуют уникальных имен.
EDIT2:
к концу create_app я добавил:
# Create app blueprints
from .main import main as main_blueprint
app.register_blueprint(main_blueprint)
from .account import account as account_blueprint
app.register_blueprint(account_blueprint, url_prefix='/account')
from .admin import admin as admin_blueprint
# from .admin import admin_blueprint
app.register_blueprint(admin_blueprint, url_prefix='/admin')
# app.register_blueprint(admin_blueprint, url_prefix='/ab')
with app.app_context():
m =app.url_map
return app
Я не уверен, что вы хотите увидеть, но m.rules дает:
<Rule '/account/manage/change-password' (HEAD, GET, OPTIONS, POST) -> account.change_password>,
<Rule '/account/manage/change-email' (HEAD, GET, OPTIONS, POST) -> account.change_email_request>,
<Rule '/account/manage/info' (HEAD, GET, OPTIONS, POST) -> account.manage>,
<Rule '/account/confirm-account' (HEAD, GET, OPTIONS) -> account.confirm_request>,
<Rule '/account/reset-password' (HEAD, GET, OPTIONS, POST) -> account.reset_password_request>,
<Rule '/account/unconfirmed' (HEAD, GET, OPTIONS) -> account.unconfirmed>,
<Rule '/account/register' (HEAD, GET, OPTIONS, POST) -> account.register>,
<Rule '/account/logout' (HEAD, GET, OPTIONS) -> account.logout>,
<Rule '/account/manage' (HEAD, GET, OPTIONS, POST) -> account.manage>,
<Rule '/account/login' (HEAD, GET, OPTIONS, POST) -> account.login>,
<Rule '/admin/_update_editor_contents' (OPTIONS, POST) -> admin.update_editor_contents>,
<Rule '/admin/invite-user' (HEAD, GET, OPTIONS, POST) -> admin.invite_user>,
<Rule '/admin/new-user' (HEAD, GET, OPTIONS, POST) -> admin.new_user>,
<Rule '/admin/users' (HEAD, GET, OPTIONS) -> admin.registered_users>,
<Rule '/get_session_job_value' (HEAD, GET, OPTIONS) -> main.get_session_job_value>,
<Rule '/cl_confirm_chrome' (HEAD, GET, OPTIONS, POST) -> main.cl_confirm_chrome>,
<Rule '/render_png' (HEAD, GET, OPTIONS) -> main.render_png>,
<Rule '/selected' (HEAD, GET, OPTIONS) -> main.selected>,
<Rule '/cl_dash' (HEAD, GET, OPTIONS, POST) -> main.cl_dash>,
<Rule '/about' (HEAD, GET, OPTIONS) -> main.about>,
<Rule '/admin/' (HEAD, GET, OPTIONS) -> admin.index>,
<Rule '/dash' (HEAD, GET, OPTIONS) -> main.dash>,
<Rule '/jobs' (HEAD, GET, OPTIONS) -> main.get_jobs>,
<Rule '/' (HEAD, GET, OPTIONS) -> main.index>,
<Rule '/account/manage/change-email/<token>' (HEAD, GET, OPTIONS, POST) -> account.change_email>,
<Rule '/admin/user/<user_id>/change-account-type' (HEAD, GET, OPTIONS, POST) -> admin.change_account_type>,
<Rule '/admin/user/<user_id>/change-email' (HEAD, GET, OPTIONS, POST) -> admin.change_user_email>,
<Rule '/admin/user/<user_id>/_delete' (HEAD, GET, OPTIONS) -> admin.delete_user>,
<Rule '/admin/user/<user_id>/delete' (HEAD, GET, OPTIONS) -> admin.delete_user_request>,
<Rule '/admin/user/<user_id>/info' (HEAD, GET, OPTIONS) -> admin.user_info>,
<Rule '/account/join-from-invite/<user_id>/<token>' (HEAD, GET, OPTIONS, POST) -> account.join_from_invite>,
<Rule '/account/confirm-account/<token>' (HEAD, GET, OPTIONS) -> account.confirm>,
<Rule '/account/reset-password/<token>' (HEAD, GET, OPTIONS, POST) -> account.reset_password>,
<Rule '/admin/static/<filename>' (HEAD, GET, OPTIONS) -> admin.static>,
<Rule '/admin/user/<user_id>' (HEAD, GET, OPTIONS) -> admin.user_info>,
<Rule '/results/<job_key>' (HEAD, GET, OPTIONS) -> main.get_results>,
<Rule '/static/<filename>' (HEAD, GET, OPTIONS) -> static>
РЕДАКТИРОВАТЬ 3:
Я должен сказать, что это невероятный ответ! Вы действительно многому меня научили. Я заменил URL с правилами выше, следуя вашим указаниям. Мой первоначальный план 10 дней назад состоял в том, чтобы просто использовать базовую функциональность CRUD от flask-admin. Мне не интересен шаблон db.html (я просто попробовал его).
В любом случае пытаюсь сменить имя администратора (ваш номер 1). Я пробовал это перед изменением app / admin / init.py на:
from flask import Blueprint
admin = Blueprint('admin_blueprint', __name__)
from . import views # noqa
Теперь, когда я открываю
http://127.0.0.1:5000/adminz/
Я получаю ошибку 404
ОКОНЧАТЕЛЬНОЕ РЕДАКТИРОВАНИЕ:
Проблема была решена https://chat.stackoverflow.com/users/5819113/diego-quintana, который объяснил, что существует конфликт между flask-admin, который создает проект и blueb-base администраторский проект. Путем изменения как имени проекта, так и статической папки с файлами проекта на базе фляги. Flask-admin может работать без переопределения. Пожалуйста, смотрите https://github.com/kc1/flask-base