DevHyperCoder
DevHyperCoder

Reputation: 943

How to load a webpage and also trigger a method in flask when a hyperlink is clicked?

I have created a webpage using python and flask and now in the webpage, i have hyperlinks. i need to save each clicked hyperlink in say a file and also send the user to that hyperlinked page.

i have tried to setup a flask redirect method but it only sends the user to the page

this is my index.html file

<html>
<body>

  {% for names,links in my_list %}

    <a href = {{links}} onclick={{ clever_function({{links}}) }} >{{names}}</p>

  {% endfor %}

<script src="http://code.jquery.com/jquery-1.10.2.min.js"></script>
<script src="http://netdna.bootstrapcdn.com/bootstrap/3.0.0/js/bootstrap.min.js"></script>


</body>
</html>

this is my flask app driver code:

def clever_function(a):


    print("sd"+a)
    return True

app.jinja_env.globals.update(clever_function=clever_function)
#////////////////////////////////////
@app.route('/')
def index():
    return render_template("index.html",my_list = zip(array_of_names,array_of_links))

i want to know which all hyperlinks were clicked into a file or a array.

**EDIT: NOW I GET THIS ERROR: ( IN THE WEBPAGE )

Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/flask/app.py", line 2309, in __call__
    return self.wsgi_app(environ, start_response)
  File "/usr/lib/python3/dist-packages/flask/app.py", line 2295, in wsgi_app
    response = self.handle_exception(e)
  File "/usr/lib/python3/dist-packages/flask/app.py", line 1741, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "/usr/lib/python3/dist-packages/flask/_compat.py", line 35, in reraise
    raise value
  File "/usr/lib/python3/dist-packages/flask/app.py", line 2292, in wsgi_app
    response = self.full_dispatch_request()
  File "/usr/lib/python3/dist-packages/flask/app.py", line 1815, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/usr/lib/python3/dist-packages/flask/app.py", line 1718, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/usr/lib/python3/dist-packages/flask/_compat.py", line 35, in reraise
    raise value
  File "/usr/lib/python3/dist-packages/flask/app.py", line 1813, in full_dispatch_request
    rv = self.dispatch_request()
  File "/usr/lib/python3/dist-packages/flask/app.py", line 1799, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/var/www/news-scraper/hello.py", line 205, in index
    return render_template("index.html",my_list = zip(array_of_names,array_of_links))
  File "/usr/lib/python3/dist-packages/flask/templating.py", line 134, in render_template
    return _render(ctx.app.jinja_env.get_or_select_template(template_name_or_list),
  File "/usr/lib/python3/dist-packages/jinja2/environment.py", line 869, in get_or_select_template
    return self.get_template(template_name_or_list, parent, globals)
  File "/usr/lib/python3/dist-packages/jinja2/environment.py", line 830, in get_template
    return self._load_template(name, self.make_globals(globals))
  File "/usr/lib/python3/dist-packages/jinja2/environment.py", line 804, in _load_template
    template = self.loader.load(self, name, globals)
  File "/usr/lib/python3/dist-packages/jinja2/loaders.py", line 125, in load
    code = environment.compile(source, name, filename)
  File "/usr/lib/python3/dist-packages/jinja2/environment.py", line 591, in compile
    self.handle_exception(exc_info, source_hint=source_hint)
  File "/usr/lib/python3/dist-packages/jinja2/environment.py", line 780, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "/usr/lib/python3/dist-packages/jinja2/_compat.py", line 37, in reraise
    raise value.with_traceback(tb)
  File "/var/www/news-scraper/templates/index.html", line 6, in template
    <a href = {{links}} onclick={{ clever_function({{links}}) }} >{{names}}</p>
  File "/usr/lib/python3/dist-packages/jinja2/environment.py", line 497, in _parse
    return Parser(self, source, name, encode_filename(filename)).parse()
  File "/usr/lib/python3/dist-packages/jinja2/parser.py", line 901, in parse
    result = nodes.Template(self.subparse(), lineno=1)
  File "/usr/lib/python3/dist-packages/jinja2/parser.py", line 883, in subparse
    rv = self.parse_statement()
  File "/usr/lib/python3/dist-packages/jinja2/parser.py", line 130, in parse_statement
    return getattr(self, 'parse_' + self.stream.current.value)()
  File "/usr/lib/python3/dist-packages/jinja2/parser.py", line 199, in parse_for
    body = self.parse_statements(('name:endfor', 'name:else'))
  File "/usr/lib/python3/dist-packages/jinja2/parser.py", line 165, in parse_statements
    result = self.subparse(end_tokens)
  File "/usr/lib/python3/dist-packages/jinja2/parser.py", line 875, in subparse
    add_data(self.parse_tuple(with_condexpr=True))
  File "/usr/lib/python3/dist-packages/jinja2/parser.py", line 620, in parse_tuple
    args.append(parse())
  File "/usr/lib/python3/dist-packages/jinja2/parser.py", line 432, in parse_expression
    return self.parse_condexpr()
  File "/usr/lib/python3/dist-packages/jinja2/parser.py", line 437, in parse_condexpr
    expr1 = self.parse_or()
  File "/usr/lib/python3/dist-packages/jinja2/parser.py", line 450, in parse_or
    left = self.parse_and()
  File "/usr/lib/python3/dist-packages/jinja2/parser.py", line 459, in parse_and
    left = self.parse_not()
  File "/usr/lib/python3/dist-packages/jinja2/parser.py", line 470, in parse_not
    return self.parse_compare()
  File "/usr/lib/python3/dist-packages/jinja2/parser.py", line 474, in parse_compare
    expr = self.parse_math1()
  File "/usr/lib/python3/dist-packages/jinja2/parser.py", line 496, in parse_math1
    left = self.parse_concat()
  File "/usr/lib/python3/dist-packages/jinja2/parser.py", line 507, in parse_concat
    args = [self.parse_math2()]
  File "/usr/lib/python3/dist-packages/jinja2/parser.py", line 517, in parse_math2
    left = self.parse_pow()
  File "/usr/lib/python3/dist-packages/jinja2/parser.py", line 528, in parse_pow
    left = self.parse_unary()
  File "/usr/lib/python3/dist-packages/jinja2/parser.py", line 547, in parse_unary
    node = self.parse_postfix(node)
  File "/usr/lib/python3/dist-packages/jinja2/parser.py", line 676, in parse_postfix
    node = self.parse_call(node)
  File "/usr/lib/python3/dist-packages/jinja2/parser.py", line 790, in parse_call
    args.append(self.parse_expression())
  File "/usr/lib/python3/dist-packages/jinja2/parser.py", line 432, in parse_expression
    return self.parse_condexpr()
  File "/usr/lib/python3/dist-packages/jinja2/parser.py", line 437, in parse_condexpr
    expr1 = self.parse_or()
  File "/usr/lib/python3/dist-packages/jinja2/parser.py", line 450, in parse_or
    left = self.parse_and()
  File "/usr/lib/python3/dist-packages/jinja2/parser.py", line 459, in parse_and
    left = self.parse_not()
  File "/usr/lib/python3/dist-packages/jinja2/parser.py", line 470, in parse_not
    return self.parse_compare()
  File "/usr/lib/python3/dist-packages/jinja2/parser.py", line 474, in parse_compare
    expr = self.parse_math1()
  File "/usr/lib/python3/dist-packages/jinja2/parser.py", line 496, in parse_math1
    left = self.parse_concat()
  File "/usr/lib/python3/dist-packages/jinja2/parser.py", line 507, in parse_concat
    args = [self.parse_math2()]
  File "/usr/lib/python3/dist-packages/jinja2/parser.py", line 517, in parse_math2
    left = self.parse_pow()
  File "/usr/lib/python3/dist-packages/jinja2/parser.py", line 528, in parse_pow
    left = self.parse_unary()
  File "/usr/lib/python3/dist-packages/jinja2/parser.py", line 546, in parse_unary
    node = self.parse_primary()
  File "/usr/lib/python3/dist-packages/jinja2/parser.py", line 581, in parse_primary
    node = self.parse_dict()
  File "/usr/lib/python3/dist-packages/jinja2/parser.py", line 661, in parse_dict
    key = self.parse_expression()
  File "/usr/lib/python3/dist-packages/jinja2/parser.py", line 432, in parse_expression
    return self.parse_condexpr()
  File "/usr/lib/python3/dist-packages/jinja2/parser.py", line 437, in parse_condexpr
    expr1 = self.parse_or()
  File "/usr/lib/python3/dist-packages/jinja2/parser.py", line 450, in parse_or
    left = self.parse_and()
  File "/usr/lib/python3/dist-packages/jinja2/parser.py", line 459, in parse_and
    left = self.parse_not()
  File "/usr/lib/python3/dist-packages/jinja2/parser.py", line 470, in parse_not
    return self.parse_compare()
  File "/usr/lib/python3/dist-packages/jinja2/parser.py", line 474, in parse_compare
    expr = self.parse_math1()
  File "/usr/lib/python3/dist-packages/jinja2/parser.py", line 496, in parse_math1
    left = self.parse_concat()
  File "/usr/lib/python3/dist-packages/jinja2/parser.py", line 507, in parse_concat
    args = [self.parse_math2()]
  File "/usr/lib/python3/dist-packages/jinja2/parser.py", line 517, in parse_math2
    left = self.parse_pow()
  File "/usr/lib/python3/dist-packages/jinja2/parser.py", line 528, in parse_pow
    left = self.parse_unary()
  File "/usr/lib/python3/dist-packages/jinja2/parser.py", line 546, in parse_unary
    node = self.parse_primary()
  File "/usr/lib/python3/dist-packages/jinja2/parser.py", line 581, in parse_primary
    node = self.parse_dict()
  File "/usr/lib/python3/dist-packages/jinja2/parser.py", line 662, in parse_dict
    self.stream.expect('colon')
  File "/usr/lib/python3/dist-packages/jinja2/lexer.py", line 384, in expect
    self.name, self.filename)
jinja2.exceptions.TemplateSyntaxError: expected token ':', got '}'

i am using the "{{links}}" so that i can pass on the url to the python code

Upvotes: 0

Views: 585

Answers (1)

Jay Jodiwal
Jay Jodiwal

Reputation: 121

If these "links" are your own, then you can count within your backend itself. If external, then write a javascript code which counts clicks and then open that link in another tab.

Use window.open('url', '_blank);

for counting these link clicks, you can write a onClick listener on that a element like pseudo code shown below

const clicksCount = {}
function aClickListener(link, name) {
   clicksCount[name] = clicksCount[name] ? clicksCount[name] + 1 : 1;
   window.open(link, '_blank);
}

P.S.: Click listeners receive event object by default, look out for it.

P.P.S: But these counts will go away as soon as page refreshes. They are not stored permanently. For storing in DB or file, you'll have to send them back to backend.

Upvotes: 1

Related Questions