MareksNo
MareksNo

Reputation: 150

Importing from python to html in flask

I am using flask, and I am wondering, how can I get my application variable into my html template without needing to add it when calling the template like in this example:

render_template('home.html', app=app)

Maybe there is a import function I don't know about.

I would like to make it so I can loop through all of my endpoints(app.url_map.iter_rules()) and compare them with the current endpoint( request.endpoint) . My current main problem is getting all of the endpoints into my html file.

My current way of achieving my navigation bar is this:

<header>
   <div class="head" align="center">
       {% if request.endpoint!='users.login' and current_user.is_authenticated!=true %}
           <a  href="{{ url_for('users.login') }}">
               <button class="tablecontent">Login</button>
           </a>
       {% endif %}
       {% if request.endpoint!='users.register' %}
           <a  href="{{ url_for('users.register') }}">
               <button class="tablecontent">Register</button>
           </a>
       {% endif %}
       {% if request.endpoint!='core.home_page' %}
           <a  href="{{ url_for('core.home_page') }}">
               <button class="tablecontent">Home</button>
           </a>
       {% endif %}
       {% if current_user.is_authenticated %}
           {% if request.endpoint!='users.logout' %}
               <a  href="{{ url_for('users.logout') }}">
                   <button class="tablecontent">Logout</button>
               </a>
           {% endif %}
       {% endif %}
       {% if current_user.is_authenticated %}
           {% if request.endpoint!='products.new_product' %}
               <a  href="{{ url_for('products.add_product') }}">
                   <button class="tablecontent">Add Product</button>
               </a>
           {% endif %}
       {% endif %}
   </div>
</header>

The import error when I try to use the sitemap from the answer:

  File "C:\Users\ulman\PycharmProjects\database_website_optimised\source\database_website\application.py", line 20, in register_applications
    from database_website.applications.core.urls import blueprint as core_blueprint
  File "C:\Users\ulman\PycharmProjects\database_website_optimised\source\database_website\applications\core\urls.py", line 3, in <module>
    from database_website.applications.core import views
  File "C:\Users\ulman\PycharmProjects\database_website_optimised\source\database_website\applications\core\views.py", line 7, in <module>
    from database_website.properties import sitemap
  File "C:\Users\ulman\PycharmProjects\database_website_optimised\source\database_website\properties.py", line 4, in <module>
    from database_website.application import application
  File "C:\Users\ulman\PycharmProjects\database_website_optimised\source\database_website\application.py", line 39, in <module>
    application = Application.create()
  File "C:\Users\ulman\PycharmProjects\database_website_optimised\source\database_website\application.py", line 35, in create
    instance.register_applications()
  File "C:\Users\ulman\PycharmProjects\database_website_optimised\source\database_website\application.py", line 20, in register_applications
    from database_website.applications.core.urls import blueprint as core_blueprint
ImportError: cannot import name 'blueprint' from 'database_website.applications.core.urls' (C:\Users\ulman\PycharmProjects\database_website_optimised\source\database_website\applications\core\urls.py)

My view file:

from flask import Flask, render_template, url_for, flash, redirect, request
from flask.views import MethodView

from database_website.applications.views import FormViewMixin
from database_website.applications.products.models import Product
from database_website.applications.core import forms
from database_website.application import application


def has_no_empty_params(rule):
    defaults = rule.defaults if rule.defaults is not None else ()
    arguments = rule.arguments if rule.arguments is not None else ()
    return len(defaults) >= len(arguments)

def sitemap():
    links = []
    for rule in application.url_map.iter_rules():
        # Filter out rules we can't navigate to in a browser
        # and rules that require parameters
        if "GET" in rule.methods and has_no_empty_params(rule):
            url = url_for(rule.endpoint, **(rule.defaults or {}))
            links.append((url, rule.endpoint))
    return links

class HomePageView(MethodView, FormViewMixin):

    def get(self):
        form = forms.ProductSearchForm()
        products = Product.query.all()
        return render_template('core/home.html', title='Home',  products=products, form=form)

    def post(self):

        product_search = request.form.get('search_name')

        return redirect(url_for('products.search_product', search_name=product_search))

This is when it has sitemap hardoced, it still shows the exact same error because at the time, when the application object gets imported it does not exist yet. I can show the way I initialize my app.

Upvotes: 0

Views: 1659

Answers (1)

Akib Rhast
Akib Rhast

Reputation: 671

Hopefully this will help :

def has_no_empty_params(rule):
    defaults = rule.defaults if rule.defaults is not None else ()
    arguments = rule.arguments if rule.arguments is not None else ()
    return len(defaults) >= len(arguments)

def sitemap():
    links = []
    for rule in app.url_map.iter_rules():
        # Filter out rules we can't navigate to in a browser
        # and rules that require parameters
        if "GET" in rule.methods and has_no_empty_params(rule):
            url = url_for(rule.endpoint, **(rule.defaults or {}))
            links.append((url, rule.endpoint))
    return links

render_template('home.html', links=sitemap())

{% for url, endpoint in links %}
    <a href="{{ url }}">{{ endpoint }}</a>
{% endfor %}

Upvotes: 1

Related Questions