Debugging admin_base_template undefiniert mit Flask Admin und Flask-Security, um die Administratorseite zu sichernPython

Python-Programme
Anonymous
 Debugging admin_base_template undefiniert mit Flask Admin und Flask-Security, um die Administratorseite zu sichern

Post by Anonymous »

Versuch, eine Website mit Python und Flask zu erstellen. Ich hatte einige grundlegende Seiten erstellt, bevor ich eine Administratorseite für das Hochladen von Inhalten anging. Derzeit verwende ich Flask-Admin V 2.0.0A0 und Flask-Security 5.6.0. Das Problem, das ich habe, ist die Verwendung der Flask-Admin-Ansichten und der Versuch, die Flasksicherheit in den Dekorateur Security_Context_Processor zu integrieren. Die Admin-Seite kehrt zurück und ich kann die DB-Elemente nicht anzeigen (da ich nicht angemeldet bin), aber wenn ich manuell zur Anmeldeseite gehe, erhalte ich einen Jinja-Fehler: Jinja2.Exceptions.undefinedError: 'admin_base_template' ist nicht definiert
-Anmine. Verlust für das, was schief geht.

Code: Select all

# Flask Security Config
# Flask-Security URLs, overridden because they don't put a / at the end
SECURITY_LOGIN_URL = "/login/"
SECURITY_POST_LOGIN_VIEW = "/admin/"
# Flask-Security config
SECURITY_URL_PREFIX = "/admin"
< /code>
Unten finden Sie die Kern der Code- und Anwendungsstruktur: < /p>
Directory Structure
AppFolder
|
|- app.py
|- config.py
|- templates
|- base.html
|- index.html
|- admin <
|       | - index.html
|       | - user_edit.html
|       | - post_edit.html
|- security <
| - login_user.html
| - _macros.html
| - _messages.html

< /code>

app.py (relevant parts)

##  App and App Config
app = Flask(__name__)
app.config.from_pyfile("config.py")
db = SQLAlchemy(app)
admin = Admin(app, name='demo', theme=Bootstrap4Theme(swatch='solar'))

# Define models
roles_users = db.Table(
"roles_users",
db.Column("user_id", db.Integer(), db.ForeignKey("user.id")),
db.Column("role_id", db.Integer(), db.ForeignKey("role.id")),
)

class User(db.Model, UserMixin):
id = db.Column(db.Integer, primary_key=True)
first_name = db.Column(db.String(255))
last_name = db.Column(db.String(255))
email = db.Column(db.String(255), unique=True)
password = db.Column(db.String(255))
active = db.Column(db.Boolean())
confirmed_at = db.Column(db.DateTime())
roles = db.relationship(
"Role", secondary=roles_users, backref=db.backref("users", lazy="dynamic")
)
fs_uniquifier = db.Column(db.String(64), unique=True, nullable=False)

class Role(db.Model, RoleMixin):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(30))
description = db.Column(db.String(255))

def __str__(self):
return self.name

class Post(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(75), nullable=False)
content = db.Column(db.String(255), nullable=False)
created = db.Column(db.DateTime, default=datetime.utcnow)

user_datastore = SQLAlchemyUserDatastore(db, User, Role)
security = Security(app, user_datastore)

class UserView(ModelView):
def is_accessible(self):
return (
current_user.is_active
and current_user.is_authenticated
and current_user.has_role("superuser")
)

def _handle_view(self, name, **kwargs):
if not self.is_accessible():
if current_user.is_authenticated:
# permission denied
abort(403)
else:
# login
return redirect(url_for("security.login", next=request.url))
edit_modal = True

class PostView(ModelView):
def is_accessible(self):
return (
current_user.is_active
and current_user.is_authenticated
and current_user.has_role("superuser")
)

def _handle_view(self, name, **kwargs):
if not self.is_accessible():
if current_user.is_authenticated:
# permission denied
abort(403)
else:
# login
return redirect(url_for("security.login", next=request.url))
edit_modal = True

admin.add_view(UserView(User, db.session))
admin.add_view(PostView(Post, db.session))

def security_context_processor():
return dict(
admin_base_template=admin.theme.base_template,
admin_view=admin.index_view,
theme=admin.theme,
h=admin_helpers,
)

< /code>

login_user.html

{% extends 'admin/master.html' %}

{% block body %}
Login
{% endblock %}

< /code>

STACK TRACE
127.0.0.1 - - [26/Feb/2025 14:33:10] "GET /admin/login HTTP/1.1"  308 -
[2025-02-26 14:33:10,735] ERROR in app: Exception on /admin/login/ [GET]
Traceback (most recent call last):
File "C:\Users\Me\DemoApp\env\Lib\site-packages\flask\app.py", line 1511, in wsgi_app
response = self.full_dispatch_request()
File "C:\Users\Me\DemoApp\env\Lib\site-packages\flask\app.py", line 919, in full_dispatch_request
rv = self.handle_user_exception(e)
File "C:\Users\Me\DemoApp\env\Lib\site-packages\flask\app.py", line 917, in full_dispatch_request
rv = self.dispatch_request()
File "C:\Users\Me\DemoApp\env\Lib\site-packages\flask\app.py", line 902, in dispatch_request
return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args)  # type: ignore[no-any-return]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^
File "C:\Users\Me\DemoApp\env\Lib\site-packages\flask_security\decorators.py", line 471, in decorated
return current_app.ensure_sync(fn)(*args, **kwargs)
~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
File "C:\Users\Me\DemoApp\env\Lib\site-packages\flask_security\views.py", line 233, in login
return _security.render_template(
~~~~~~~~~~~~~~~~~~~~~~~~~^
cv("LOGIN_USER_TEMPLATE"),
^^^^^^^^^^^^^^^^^^^^^^^^^^
......
**_ctx("login"),
^^^^^^^^^^^^^^^^
)
^
File "C:\Users\Me\DemoApp\env\Lib\site-packages\flask_security\utils.py", line 1189, in default_render_template
return render_template(*args, **kwargs)
File "C:\Users\Me\DemoApp\env\Lib\site-packages\flask\templating.py", line 150, in render_template
return _render(app, template, context)
File "C:\Users\Me\DemoApp\env\Lib\site-packages\flask\templating.py", line 131, in _render
rv = template.render(context)
File "C:\Users\Me\DemoApp\env\Lib\site-packages\jinja2\environment.py", line 1295, in render
self.environment.handle_exception()
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^
File "C:\Users\Me\DemoApp\env\Lib\site-packages\jinja2\environment.py", line 942, in handle_exception
raise rewrite_traceback_stack(source=source)
File "C:\Users\Me\DemoApp\templates\security\login_user.html", line 1, in top-level template code
{% extends 'admin/master.html' %}
^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\Me\DemoApp\env\Lib\site-packages\flask_admin\templates\bootstrap4\admin\master.html", line 1, in top-level template code
{% extends admin_base_template %}
^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\Me\DemoApp\env\Lib\site-packages\flask\templating.py", line 65, in get_source
return self._get_source_fast(environment, template)
~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\Me\DemoApp\env\Lib\site-packages\flask\templating.py", line 96, in _get_source_fast
return loader.get_source(environment, template)
~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^
a2\loaders.py", line 197, in get_source
pieces = split_template_path(template)
File "C:\Users\Me\DemoApp\env\Lib\site-packages\jinja2\loaders.py", line 30, in split_template_path
for piece in template.split("/"):
^^^^^^^^^^^^^^
jinja2.exceptions.UndefinedError: 'admin_base_template' is undefined
127.0.0.1 - - [26/Feb/2025 14:33:10] "GET /admin/login/ HTTP/1.1" 500 -
Ich hatte ähnliche Fehler mit den Vorlagen post_edit und user_edit, die nach dem Hinzufügen von { % Extends 'Admin/ /edit.html' %} in die erwähnten HTML -Seiten aufgelöst wurden. Soweit ich verstehe, sollte die Anmeldevorlage dort sein, wo sie sein sollte, und es sollte nur Admin/Master.html erweitern. Ich habe es auch versucht, indem ich das obige login_user.html aus dem oben verknüpften Projekt zusammen mit dem Makros/Message HTML im Sicherheitsordner kopiert habe, und es gibt mir immer noch den gleichen Fehler. Ich bin sozusagen von Verlust und möchte verstehen, was mir bis zum Fehler admin_base_template fehlt. Bitte halp
Bearbeiten
Ich bin mir nicht sicher, was dies bedeutet, aber nach dem Kopieren des Quellprojekts login_user.html aus dem Quellprojekt und fügen den Dekorateur auf Sicherheit hinzu. Ich habe die Zeile entfernt, aber sie würde an allem fehlschlagen, was ich dort zuerst auf die 3. Zeile hingewiesen habe, dann auf den Stapelverfolgungfehler von Extends admin_base_template ... admin_base_template undefiniert. login_user.html aber wenn ich diese entferne oder eine leere Neulinie hinzufüge, heißt es immer noch Zeile 3.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post