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.
# 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.
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]# 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'))
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)
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
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 - [/code] 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 [b] Bearbeiten [/b] 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.
Ich möchte die tatsächliche SecurityFilterChain -Bean basierend auf einer zu befietsstarken Eigenschaft konfigurieren. > @Configuration
@EnableWebSecurity
class SecurityConfiguration {
Ich möchte die tatsächliche SecurityFilterChain -Bean basierend auf einer zu befietsstarken Eigenschaft konfigurieren. > @Configuration
@EnableWebSecurity
class SecurityConfiguration {
Das ist vielleicht eine schlechte Praxis, aber ich würde trotzdem gerne wissen, ob es möglich ist.
public class BaseClass
{
protected virtual void createArrays(int vertexCount)
{
// do the actual...
Tomacat 10 Service in Windows 2022 mit Oracle Java 17.
AFTER-ADD-EXPORTS JAVA.BASE/SUN.SECURITY.PROVIDER -> config-> java, tomcat kann nicht starten. sagt: Das System kann die angegebene Datei nicht...